diff --git a/components/engine/api/client/swarm/init.go b/components/engine/api/client/swarm/init.go index 69d26852c5..531a69c451 100644 --- a/components/engine/api/client/swarm/init.go +++ b/components/engine/api/client/swarm/init.go @@ -35,7 +35,7 @@ func newInitCommand(dockerCli *client.DockerCli) *cobra.Command { }, } - flags := cmd.Flags() + flags = cmd.Flags() flags.Var(&opts.listenAddr, flagListenAddr, "Listen address") flags.Var(&opts.autoAccept, flagAutoAccept, "Auto acceptance policy (worker, manager, or none)") flags.StringVar(&opts.secret, flagSecret, "", "Set secret value needed to accept nodes into cluster") diff --git a/components/engine/api/client/swarm/opts.go b/components/engine/api/client/swarm/opts.go index fafda92580..7234316032 100644 --- a/components/engine/api/client/swarm/opts.go +++ b/components/engine/api/client/swarm/opts.go @@ -95,10 +95,10 @@ type AutoAcceptOption struct { // String prints a string representation of this option func (o *AutoAcceptOption) String() string { keys := []string{} - for key := range o.values { - keys = append(keys, key) + for key, value := range o.values { + keys = append(keys, fmt.Sprintf("%s=%v", strings.ToLower(key), value)) } - return strings.Join(keys, " ") + return strings.Join(keys, ", ") } // Set sets a new value on this option diff --git a/components/engine/api/client/swarm/opts_test.go b/components/engine/api/client/swarm/opts_test.go index d5b73575f4..c8a8e89cc8 100644 --- a/components/engine/api/client/swarm/opts_test.go +++ b/components/engine/api/client/swarm/opts_test.go @@ -4,6 +4,7 @@ import ( "testing" "github.com/docker/docker/pkg/testutil/assert" + "github.com/docker/engine-api/types/swarm" ) func TestNodeAddrOptionSetHostAndPort(t *testing.T) { @@ -33,3 +34,85 @@ func TestNodeAddrOptionSetInvalidFormat(t *testing.T) { opt := NewListenAddrOption() assert.Error(t, opt.Set("http://localhost:4545"), "Invalid url") } + +func TestAutoAcceptOptionSetWorker(t *testing.T) { + opt := NewAutoAcceptOption() + assert.NilError(t, opt.Set("worker")) + assert.Equal(t, opt.values[WORKER], true) +} + +func TestAutoAcceptOptionSetManager(t *testing.T) { + opt := NewAutoAcceptOption() + assert.NilError(t, opt.Set("manager")) + assert.Equal(t, opt.values[MANAGER], true) +} + +func TestAutoAcceptOptionSetInvalid(t *testing.T) { + opt := NewAutoAcceptOption() + assert.Error(t, opt.Set("bogus"), "must be one of") +} + +func TestAutoAcceptOptionSetNone(t *testing.T) { + opt := NewAutoAcceptOption() + assert.NilError(t, opt.Set("none")) + assert.Equal(t, opt.values[MANAGER], false) + assert.Equal(t, opt.values[WORKER], false) +} + +func TestAutoAcceptOptionSetConflict(t *testing.T) { + opt := NewAutoAcceptOption() + assert.NilError(t, opt.Set("manager")) + assert.Error(t, opt.Set("none"), "value NONE is incompatible with MANAGER") + + opt = NewAutoAcceptOption() + assert.NilError(t, opt.Set("none")) + assert.Error(t, opt.Set("worker"), "value NONE is incompatible with WORKER") +} + +func TestAutoAcceptOptionPoliciesDefault(t *testing.T) { + opt := NewAutoAcceptOption() + secret := "thesecret" + + policies := opt.Policies(&secret) + assert.Equal(t, len(policies), 2) + assert.Equal(t, policies[0], swarm.Policy{ + Role: WORKER, + Autoaccept: true, + Secret: &secret, + }) + assert.Equal(t, policies[1], swarm.Policy{ + Role: MANAGER, + Autoaccept: false, + Secret: &secret, + }) +} + +func TestAutoAcceptOptionPoliciesWithManager(t *testing.T) { + opt := NewAutoAcceptOption() + secret := "thesecret" + + assert.NilError(t, opt.Set("manager")) + + policies := opt.Policies(&secret) + assert.Equal(t, len(policies), 2) + assert.Equal(t, policies[0], swarm.Policy{ + Role: WORKER, + Autoaccept: false, + Secret: &secret, + }) + assert.Equal(t, policies[1], swarm.Policy{ + Role: MANAGER, + Autoaccept: true, + Secret: &secret, + }) +} + +func TestAutoAcceptOptionString(t *testing.T) { + opt := NewAutoAcceptOption() + assert.NilError(t, opt.Set("manager")) + assert.NilError(t, opt.Set("worker")) + + repr := opt.String() + assert.Contains(t, repr, "worker=true") + assert.Contains(t, repr, "manager=true") +}