diff --git a/integration-cli/check_test.go b/integration-cli/check_test.go index c9f57b7450..9aae2ce595 100644 --- a/integration-cli/check_test.go +++ b/integration-cli/check_test.go @@ -8,6 +8,7 @@ import ( "github.com/docker/docker/cliconfig" "github.com/docker/docker/pkg/reexec" + "github.com/docker/engine-api/types/swarm" "github.com/go-check/check" ) @@ -213,12 +214,15 @@ func (s *DockerSwarmSuite) AddDaemon(c *check.C, joinSwarm, manager bool) *Swarm if joinSwarm == true { if len(s.daemons) > 0 { - c.Assert(d.Join(s.daemons[0].listenAddr, "", "", manager), check.IsNil) + c.Assert(d.Join(swarm.JoinRequest{ + RemoteAddrs: []string{s.daemons[0].listenAddr}, + Manager: manager}), check.IsNil) } else { - aa := make(map[string]bool) - aa["worker"] = true - aa["manager"] = true - c.Assert(d.Init(aa, ""), check.IsNil) + c.Assert(d.Init(swarm.InitRequest{ + Spec: swarm.Spec{ + AcceptancePolicy: autoAcceptPolicy, + }, + }), check.IsNil) } } diff --git a/integration-cli/daemon_swarm.go b/integration-cli/daemon_swarm.go index 6c18daee19..47ca4422e8 100644 --- a/integration-cli/daemon_swarm.go +++ b/integration-cli/daemon_swarm.go @@ -21,22 +21,18 @@ type SwarmDaemon struct { listenAddr string } +// default policy in tests is allow-all +var autoAcceptPolicy = swarm.AcceptancePolicy{ + Policies: []swarm.Policy{ + {Role: swarm.NodeRoleWorker, Autoaccept: true}, + {Role: swarm.NodeRoleManager, Autoaccept: true}, + }, +} + // Init initializes a new swarm cluster. -func (d *SwarmDaemon) Init(autoAccept map[string]bool, secret string) error { - req := swarm.InitRequest{ - ListenAddr: d.listenAddr, - } - for _, role := range []swarm.NodeRole{swarm.NodeRoleManager, swarm.NodeRoleWorker} { - policy := swarm.Policy{ - Role: role, - Autoaccept: autoAccept[strings.ToLower(string(role))], - } - - if secret != "" { - policy.Secret = &secret - } - - req.Spec.AcceptancePolicy.Policies = append(req.Spec.AcceptancePolicy.Policies, policy) +func (d *SwarmDaemon) Init(req swarm.InitRequest) error { + if req.ListenAddr == "" { + req.ListenAddr = d.listenAddr } status, out, err := d.SockRequest("POST", "/swarm/init", req) if status != http.StatusOK { @@ -53,17 +49,10 @@ func (d *SwarmDaemon) Init(autoAccept map[string]bool, secret string) error { return nil } -// Join joins a current daemon with existing cluster. -func (d *SwarmDaemon) Join(remoteAddr, secret, cahash string, manager bool) error { - req := swarm.JoinRequest{ - ListenAddr: d.listenAddr, - RemoteAddrs: []string{remoteAddr}, - Manager: manager, - CACertHash: cahash, - } - - if secret != "" { - req.Secret = secret +// Join joins a daemon to an existing cluster. +func (d *SwarmDaemon) Join(req swarm.JoinRequest) error { + if req.ListenAddr == "" { + req.ListenAddr = d.listenAddr } status, out, err := d.SockRequest("POST", "/swarm/join", req) if status != http.StatusOK { diff --git a/integration-cli/docker_api_swarm_test.go b/integration-cli/docker_api_swarm_test.go index bb21c7e44f..107930bfb3 100644 --- a/integration-cli/docker_api_swarm_test.go +++ b/integration-cli/docker_api_swarm_test.go @@ -38,7 +38,7 @@ func (s *DockerSwarmSuite) TestApiSwarmInit(c *check.C) { c.Assert(info.ControlAvailable, checker.Equals, false) c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStateInactive) - c.Assert(d2.Join(d1.listenAddr, "", "", false), checker.IsNil) + c.Assert(d2.Join(swarm.JoinRequest{RemoteAddrs: []string{d1.listenAddr}}), checker.IsNil) info, err = d2.info() c.Assert(err, checker.IsNil) @@ -76,10 +76,19 @@ func (s *DockerSwarmSuite) TestApiSwarmManualAcceptanceSecret(c *check.C) { func (s *DockerSwarmSuite) testAPISwarmManualAcceptance(c *check.C, secret string) { d1 := s.AddDaemon(c, false, false) - c.Assert(d1.Init(map[string]bool{}, secret), checker.IsNil) + c.Assert(d1.Init(swarm.InitRequest{ + Spec: swarm.Spec{ + AcceptancePolicy: swarm.AcceptancePolicy{ + Policies: []swarm.Policy{ + {Role: swarm.NodeRoleWorker, Secret: &secret}, + {Role: swarm.NodeRoleManager, Secret: &secret}, + }, + }, + }, + }), checker.IsNil) d2 := s.AddDaemon(c, false, false) - err := d2.Join(d1.listenAddr, "", "", false) + err := d2.Join(swarm.JoinRequest{RemoteAddrs: []string{d1.listenAddr}}) c.Assert(err, checker.NotNil) if secret == "" { c.Assert(err.Error(), checker.Contains, "needs to be accepted") @@ -97,7 +106,7 @@ func (s *DockerSwarmSuite) testAPISwarmManualAcceptance(c *check.C, secret strin c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStateInactive) } d3 := s.AddDaemon(c, false, false) - c.Assert(d3.Join(d1.listenAddr, secret, "", false), checker.NotNil) + c.Assert(d3.Join(swarm.JoinRequest{Secret: secret, RemoteAddrs: []string{d1.listenAddr}}), checker.NotNil) info, err := d3.info() c.Assert(err, checker.IsNil) c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStatePending) @@ -120,26 +129,34 @@ func (s *DockerSwarmSuite) testAPISwarmManualAcceptance(c *check.C, secret strin func (s *DockerSwarmSuite) TestApiSwarmSecretAcceptance(c *check.C) { d1 := s.AddDaemon(c, false, false) - aa := make(map[string]bool) - aa["worker"] = true - c.Assert(d1.Init(aa, "foobar"), checker.IsNil) + secret := "foobar" + c.Assert(d1.Init(swarm.InitRequest{ + Spec: swarm.Spec{ + AcceptancePolicy: swarm.AcceptancePolicy{ + Policies: []swarm.Policy{ + {Role: swarm.NodeRoleWorker, Autoaccept: true, Secret: &secret}, + {Role: swarm.NodeRoleManager, Secret: &secret}, + }, + }, + }, + }), checker.IsNil) d2 := s.AddDaemon(c, false, false) - err := d2.Join(d1.listenAddr, "", "", false) + err := d2.Join(swarm.JoinRequest{RemoteAddrs: []string{d1.listenAddr}}) c.Assert(err, checker.NotNil) c.Assert(err.Error(), checker.Contains, "secret token is necessary") info, err := d2.info() c.Assert(err, checker.IsNil) c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStateInactive) - err = d2.Join(d1.listenAddr, "foobaz", "", false) + err = d2.Join(swarm.JoinRequest{Secret: "foobaz", RemoteAddrs: []string{d1.listenAddr}}) c.Assert(err, checker.NotNil) c.Assert(err.Error(), checker.Contains, "secret token is necessary") info, err = d2.info() c.Assert(err, checker.IsNil) c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStateInactive) - c.Assert(d2.Join(d1.listenAddr, "foobar", "", false), checker.IsNil) + c.Assert(d2.Join(swarm.JoinRequest{Secret: "foobar", RemoteAddrs: []string{d1.listenAddr}}), checker.IsNil) info, err = d2.info() c.Assert(err, checker.IsNil) c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStateActive) @@ -156,14 +173,14 @@ func (s *DockerSwarmSuite) TestApiSwarmSecretAcceptance(c *check.C) { } }) - err = d2.Join(d1.listenAddr, "foobar", "", false) + err = d2.Join(swarm.JoinRequest{Secret: "foobar", RemoteAddrs: []string{d1.listenAddr}}) c.Assert(err, checker.NotNil) c.Assert(err.Error(), checker.Contains, "secret token is necessary") info, err = d2.info() c.Assert(err, checker.IsNil) c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStateInactive) - c.Assert(d2.Join(d1.listenAddr, "foobaz", "", false), checker.IsNil) + c.Assert(d2.Join(swarm.JoinRequest{Secret: "foobaz", RemoteAddrs: []string{d1.listenAddr}}), checker.IsNil) info, err = d2.info() c.Assert(err, checker.IsNil) c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStateActive) @@ -182,14 +199,14 @@ func (s *DockerSwarmSuite) TestApiSwarmSecretAcceptance(c *check.C) { } }) - err = d2.Join(d1.listenAddr, "", "", false) + err = d2.Join(swarm.JoinRequest{RemoteAddrs: []string{d1.listenAddr}}) c.Assert(err, checker.NotNil) c.Assert(err.Error(), checker.Contains, "secret token is necessary") info, err = d2.info() c.Assert(err, checker.IsNil) c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStateInactive) - c.Assert(d2.Join(d1.listenAddr, "foobaz", "", false), checker.IsNil) + c.Assert(d2.Join(swarm.JoinRequest{Secret: "foobaz", RemoteAddrs: []string{d1.listenAddr}}), checker.IsNil) info, err = d2.info() c.Assert(err, checker.IsNil) c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStateActive) @@ -206,7 +223,7 @@ func (s *DockerSwarmSuite) TestApiSwarmSecretAcceptance(c *check.C) { } }) - c.Assert(d2.Join(d1.listenAddr, "", "", false), checker.IsNil) + c.Assert(d2.Join(swarm.JoinRequest{RemoteAddrs: []string{d1.listenAddr}}), checker.IsNil) info, err = d2.info() c.Assert(err, checker.IsNil) c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStateActive) @@ -220,17 +237,26 @@ func (s *DockerSwarmSuite) TestApiSwarmSecretAcceptance(c *check.C) { func (s *DockerSwarmSuite) TestApiSwarmCAHash(c *check.C) { d1 := s.AddDaemon(c, true, true) d2 := s.AddDaemon(c, false, false) - err := d2.Join(d1.listenAddr, "", "foobar", false) + err := d2.Join(swarm.JoinRequest{CACertHash: "foobar", RemoteAddrs: []string{d1.listenAddr}}) c.Assert(err, checker.NotNil) c.Assert(err.Error(), checker.Contains, "invalid checksum digest format") c.Assert(len(d1.CACertHash), checker.GreaterThan, 0) - c.Assert(d2.Join(d1.listenAddr, "", d1.CACertHash, false), checker.IsNil) + c.Assert(d2.Join(swarm.JoinRequest{CACertHash: d1.CACertHash, RemoteAddrs: []string{d1.listenAddr}}), checker.IsNil) } func (s *DockerSwarmSuite) TestApiSwarmPromoteDemote(c *check.C) { d1 := s.AddDaemon(c, false, false) - c.Assert(d1.Init(map[string]bool{"worker": true}, ""), checker.IsNil) + c.Assert(d1.Init(swarm.InitRequest{ + Spec: swarm.Spec{ + AcceptancePolicy: swarm.AcceptancePolicy{ + Policies: []swarm.Policy{ + {Role: swarm.NodeRoleWorker, Autoaccept: true}, + {Role: swarm.NodeRoleManager}, + }, + }, + }, + }), checker.IsNil) d2 := s.AddDaemon(c, true, false) info, err := d2.info() @@ -561,7 +587,9 @@ func (s *DockerSwarmSuite) TestApiSwarmLeaveOnPendingJoin(c *check.C) { c.Assert(err, checker.IsNil) id = strings.TrimSpace(id) - go d2.Join("nosuchhost:1234", "", "", false) // will block on pending state + go d2.Join(swarm.JoinRequest{ + RemoteAddrs: []string{"nosuchhost:1234"}, + }) // will block on pending state for i := 0; ; i++ { info, err := d2.info() @@ -587,7 +615,9 @@ func (s *DockerSwarmSuite) TestApiSwarmLeaveOnPendingJoin(c *check.C) { // #23705 func (s *DockerSwarmSuite) TestApiSwarmRestoreOnPendingJoin(c *check.C) { d := s.AddDaemon(c, false, false) - go d.Join("nosuchhost:1234", "", "", false) // will block on pending state + go d.Join(swarm.JoinRequest{ + RemoteAddrs: []string{"nosuchhost:1234"}, + }) // will block on pending state for i := 0; ; i++ { info, err := d.info()