agent: change connect command paths to be slices, not strings

This matches other executable configuration and allows us to cleanly
separate executable from arguments without trying to emulate shell
parsing.
This commit is contained in:
Mitchell Hashimoto 2018-04-26 22:16:21 -07:00
parent 76c6849ffe
commit 536f31571b
No known key found for this signature in database
GPG Key ID: 744E147AA52F5B0A
9 changed files with 32 additions and 31 deletions

View File

@ -63,7 +63,7 @@ func TestAgent_Services(t *testing.T) {
// Add a managed proxy for that service
prxy1 := &structs.ConnectManagedProxy{
ExecMode: structs.ProxyExecModeScript,
Command: "proxy.sh",
Command: []string{"proxy.sh"},
Config: map[string]interface{}{
"bind_port": 1234,
"foo": "bar",
@ -1404,7 +1404,7 @@ func TestAgent_RegisterService_ManagedConnectProxy(t *testing.T) {
Connect: &api.AgentServiceConnect{
Proxy: &api.AgentServiceConnectProxy{
ExecMode: "script",
Command: "proxy.sh",
Command: []string{"proxy.sh"},
Config: map[string]interface{}{
"foo": "bar",
},
@ -2354,7 +2354,7 @@ func TestAgentConnectProxyConfig_Blocking(t *testing.T) {
TargetServiceName: "test",
ContentHash: "84346af2031659c9",
ExecMode: "daemon",
Command: "consul connect proxy",
Command: nil,
Config: map[string]interface{}{
"upstreams": []interface{}{
map[string]interface{}{

View File

@ -2333,7 +2333,7 @@ func TestAgent_AddProxy(t *testing.T) {
desc: "basic proxy adding, unregistered service",
proxy: &structs.ConnectManagedProxy{
ExecMode: structs.ProxyExecModeDaemon,
Command: "consul connect proxy",
Command: []string{"consul", "connect", "proxy"},
Config: map[string]interface{}{
"foo": "bar",
},
@ -2346,7 +2346,7 @@ func TestAgent_AddProxy(t *testing.T) {
desc: "basic proxy adding, unregistered service",
proxy: &structs.ConnectManagedProxy{
ExecMode: structs.ProxyExecModeDaemon,
Command: "consul connect proxy",
Command: []string{"consul", "connect", "proxy"},
Config: map[string]interface{}{
"foo": "bar",
},
@ -2392,6 +2392,7 @@ func TestAgent_RemoveProxy(t *testing.T) {
// Add a proxy for web
pReg := &structs.ConnectManagedProxy{
TargetServiceID: "web",
Command: []string{"foo"},
}
require.NoError(a.AddProxy(pReg, false))

View File

@ -532,13 +532,13 @@ func (b *Builder) Build() (rt RuntimeConfig, err error) {
}
proxyDefaultExecMode := ""
proxyDefaultDaemonCommand := ""
proxyDefaultScriptCommand := ""
var proxyDefaultDaemonCommand []string
var proxyDefaultScriptCommand []string
proxyDefaultConfig := make(map[string]interface{})
if c.Connect != nil && c.Connect.ProxyDefaults != nil {
proxyDefaultExecMode = b.stringVal(c.Connect.ProxyDefaults.ExecMode)
proxyDefaultDaemonCommand = b.stringVal(c.Connect.ProxyDefaults.DaemonCommand)
proxyDefaultScriptCommand = b.stringVal(c.Connect.ProxyDefaults.ScriptCommand)
proxyDefaultDaemonCommand = c.Connect.ProxyDefaults.DaemonCommand
proxyDefaultScriptCommand = c.Connect.ProxyDefaults.ScriptCommand
proxyDefaultConfig = c.Connect.ProxyDefaults.Config
}
@ -1051,7 +1051,7 @@ func (b *Builder) serviceConnectVal(v *ServiceConnect) *structs.ServiceDefinitio
if v.Proxy != nil {
proxy = &structs.ServiceDefinitionConnectProxy{
ExecMode: b.stringVal(v.Proxy.ExecMode),
Command: b.stringVal(v.Proxy.Command),
Command: v.Proxy.Command,
Config: v.Proxy.Config,
}
}

View File

@ -359,7 +359,7 @@ type ServiceConnect struct {
}
type ServiceConnectProxy struct {
Command *string `json:"command,omitempty" hcl:"command" mapstructure:"command"`
Command []string `json:"command,omitempty" hcl:"command" mapstructure:"command"`
ExecMode *string `json:"exec_mode,omitempty" hcl:"exec_mode" mapstructure:"exec_mode"`
Config map[string]interface{} `json:"config,omitempty" hcl:"config" mapstructure:"config"`
}
@ -386,10 +386,10 @@ type ConnectProxyDefaults struct {
ExecMode *string `json:"exec_mode,omitempty" hcl:"exec_mode" mapstructure:"exec_mode"`
// DaemonCommand is used to start proxy in exec_mode = daemon if not specified
// at registration time.
DaemonCommand *string `json:"daemon_command,omitempty" hcl:"daemon_command" mapstructure:"daemon_command"`
DaemonCommand []string `json:"daemon_command,omitempty" hcl:"daemon_command" mapstructure:"daemon_command"`
// ScriptCommand is used to start proxy in exec_mode = script if not specified
// at registration time.
ScriptCommand *string `json:"script_command,omitempty" hcl:"script_command" mapstructure:"script_command"`
ScriptCommand []string `json:"script_command,omitempty" hcl:"script_command" mapstructure:"script_command"`
// Config is merged into an Config specified at registration time.
Config map[string]interface{} `json:"config,omitempty" hcl:"config" mapstructure:"config"`
}

View File

@ -637,11 +637,11 @@ type RuntimeConfig struct {
// ConnectProxyDefaultDaemonCommand is used to start proxy in exec_mode =
// daemon if not specified at registration time.
ConnectProxyDefaultDaemonCommand string
ConnectProxyDefaultDaemonCommand []string
// ConnectProxyDefaultScriptCommand is used to start proxy in exec_mode =
// script if not specified at registration time.
ConnectProxyDefaultScriptCommand string
ConnectProxyDefaultScriptCommand []string
// ConnectProxyDefaultConfig is merged with any config specified at
// registration time to allow global control of defaults.

View File

@ -2364,8 +2364,8 @@ func TestFullConfig(t *testing.T) {
"bind_min_port": 2000,
"bind_max_port": 3000,
"exec_mode": "script",
"daemon_command": "consul connect proxy",
"script_command": "proxyctl.sh",
"daemon_command": ["consul", "connect", "proxy"],
"script_command": ["proxyctl.sh"],
"config": {
"foo": "bar",
"connect_timeout_ms": 1000,
@ -2637,7 +2637,7 @@ func TestFullConfig(t *testing.T) {
"connect": {
"proxy": {
"exec_mode": "daemon",
"command": "awesome-proxy",
"command": ["awesome-proxy"],
"config": {
"foo": "qux"
}
@ -2826,13 +2826,13 @@ func TestFullConfig(t *testing.T) {
bind_min_port = 2000
bind_max_port = 3000
exec_mode = "script"
daemon_command = "consul connect proxy"
script_command = "proxyctl.sh"
daemon_command = ["consul", "connect", "proxy"]
script_command = ["proxyctl.sh"]
config = {
foo = "bar"
# hack float since json parses numbers as float and we have to
# assert against the same thing
connect_timeout_ms = 1000.0
connect_timeout_ms = 1000.0
pedantic_mode = true
}
}
@ -3101,7 +3101,7 @@ func TestFullConfig(t *testing.T) {
connect {
proxy {
exec_mode = "daemon"
command = "awesome-proxy"
command = ["awesome-proxy"]
config = {
foo = "qux"
}
@ -3426,8 +3426,8 @@ func TestFullConfig(t *testing.T) {
"hyMy9Oxn": "XeBp4Sis",
},
ConnectProxyDefaultExecMode: "script",
ConnectProxyDefaultDaemonCommand: "consul connect proxy",
ConnectProxyDefaultScriptCommand: "proxyctl.sh",
ConnectProxyDefaultDaemonCommand: []string{"consul", "connect", "proxy"},
ConnectProxyDefaultScriptCommand: []string{"proxyctl.sh"},
ConnectProxyDefaultConfig: map[string]interface{}{
"foo": "bar",
"connect_timeout_ms": float64(1000),
@ -3608,7 +3608,7 @@ func TestFullConfig(t *testing.T) {
Connect: &structs.ServiceDefinitionConnect{
Proxy: &structs.ServiceDefinitionConnectProxy{
ExecMode: "daemon",
Command: "awesome-proxy",
Command: []string{"awesome-proxy"},
Config: map[string]interface{}{
"foo": "qux",
},
@ -4109,9 +4109,9 @@ func TestSanitize(t *testing.T) {
"ConnectProxyBindMaxPort": 0,
"ConnectProxyBindMinPort": 0,
"ConnectProxyDefaultConfig": {},
"ConnectProxyDefaultDaemonCommand": "",
"ConnectProxyDefaultDaemonCommand": [],
"ConnectProxyDefaultExecMode": "",
"ConnectProxyDefaultScriptCommand": "",
"ConnectProxyDefaultScriptCommand": [],
"ConsulCoordinateUpdateBatchSize": 0,
"ConsulCoordinateUpdateMaxBatches": 0,
"ConsulCoordinateUpdatePeriod": "15s",

View File

@ -64,7 +64,7 @@ type ConnectManagedProxy struct {
// Command is the command to execute. Empty defaults to self-invoking the same
// consul binary with proxy subcomand for ProxyExecModeDaemon and is an error
// for ProxyExecModeScript.
Command string
Command []string
// Config is the arbitrary configuration data provided with the registration.
Config map[string]interface{}

View File

@ -110,7 +110,7 @@ type ServiceDefinitionConnect struct {
// registration. Note this is duplicated in config.ServiceConnectProxy and needs
// to be kept in sync.
type ServiceDefinitionConnectProxy struct {
Command string
Command []string
ExecMode string
Config map[string]interface{}
}

View File

@ -76,7 +76,7 @@ type AgentServiceConnect struct {
// service.
type AgentServiceConnectProxy struct {
ExecMode ProxyExecMode
Command string
Command []string
Config map[string]interface{}
}
@ -225,7 +225,7 @@ type ConnectProxyConfig struct {
TargetServiceName string
ContentHash string
ExecMode ProxyExecMode
Command string
Command []string
Config map[string]interface{}
}