Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>
(cherry picked from commit 22b34d64496c9b6ebae5e2b4a98ecd9a172cc557)
| ... | ... |
@@ -8,6 +8,7 @@ import ( |
| 8 | 8 |
|
| 9 | 9 |
"github.com/docker/docker/cliconfig" |
| 10 | 10 |
"github.com/docker/docker/pkg/reexec" |
| 11 |
+ "github.com/docker/engine-api/types/swarm" |
|
| 11 | 12 |
"github.com/go-check/check" |
| 12 | 13 |
) |
| 13 | 14 |
|
| ... | ... |
@@ -213,12 +214,15 @@ func (s *DockerSwarmSuite) AddDaemon(c *check.C, joinSwarm, manager bool) *Swarm |
| 213 | 213 |
|
| 214 | 214 |
if joinSwarm == true {
|
| 215 | 215 |
if len(s.daemons) > 0 {
|
| 216 |
- c.Assert(d.Join(s.daemons[0].listenAddr, "", "", manager), check.IsNil) |
|
| 216 |
+ c.Assert(d.Join(swarm.JoinRequest{
|
|
| 217 |
+ RemoteAddrs: []string{s.daemons[0].listenAddr},
|
|
| 218 |
+ Manager: manager}), check.IsNil) |
|
| 217 | 219 |
} else {
|
| 218 |
- aa := make(map[string]bool) |
|
| 219 |
- aa["worker"] = true |
|
| 220 |
- aa["manager"] = true |
|
| 221 |
- c.Assert(d.Init(aa, ""), check.IsNil) |
|
| 220 |
+ c.Assert(d.Init(swarm.InitRequest{
|
|
| 221 |
+ Spec: swarm.Spec{
|
|
| 222 |
+ AcceptancePolicy: autoAcceptPolicy, |
|
| 223 |
+ }, |
|
| 224 |
+ }), check.IsNil) |
|
| 222 | 225 |
} |
| 223 | 226 |
} |
| 224 | 227 |
|
| ... | ... |
@@ -21,22 +21,18 @@ type SwarmDaemon struct {
|
| 21 | 21 |
listenAddr string |
| 22 | 22 |
} |
| 23 | 23 |
|
| 24 |
-// Init initializes a new swarm cluster. |
|
| 25 |
-func (d *SwarmDaemon) Init(autoAccept map[string]bool, secret string) error {
|
|
| 26 |
- req := swarm.InitRequest{
|
|
| 27 |
- ListenAddr: d.listenAddr, |
|
| 28 |
- } |
|
| 29 |
- for _, role := range []swarm.NodeRole{swarm.NodeRoleManager, swarm.NodeRoleWorker} {
|
|
| 30 |
- policy := swarm.Policy{
|
|
| 31 |
- Role: role, |
|
| 32 |
- Autoaccept: autoAccept[strings.ToLower(string(role))], |
|
| 33 |
- } |
|
| 34 |
- |
|
| 35 |
- if secret != "" {
|
|
| 36 |
- policy.Secret = &secret |
|
| 37 |
- } |
|
| 24 |
+// default policy in tests is allow-all |
|
| 25 |
+var autoAcceptPolicy = swarm.AcceptancePolicy{
|
|
| 26 |
+ Policies: []swarm.Policy{
|
|
| 27 |
+ {Role: swarm.NodeRoleWorker, Autoaccept: true},
|
|
| 28 |
+ {Role: swarm.NodeRoleManager, Autoaccept: true},
|
|
| 29 |
+ }, |
|
| 30 |
+} |
|
| 38 | 31 |
|
| 39 |
- req.Spec.AcceptancePolicy.Policies = append(req.Spec.AcceptancePolicy.Policies, policy) |
|
| 32 |
+// Init initializes a new swarm cluster. |
|
| 33 |
+func (d *SwarmDaemon) Init(req swarm.InitRequest) error {
|
|
| 34 |
+ if req.ListenAddr == "" {
|
|
| 35 |
+ req.ListenAddr = d.listenAddr |
|
| 40 | 36 |
} |
| 41 | 37 |
status, out, err := d.SockRequest("POST", "/swarm/init", req)
|
| 42 | 38 |
if status != http.StatusOK {
|
| ... | ... |
@@ -53,17 +49,10 @@ func (d *SwarmDaemon) Init(autoAccept map[string]bool, secret string) error {
|
| 53 | 53 |
return nil |
| 54 | 54 |
} |
| 55 | 55 |
|
| 56 |
-// Join joins a current daemon with existing cluster. |
|
| 57 |
-func (d *SwarmDaemon) Join(remoteAddr, secret, cahash string, manager bool) error {
|
|
| 58 |
- req := swarm.JoinRequest{
|
|
| 59 |
- ListenAddr: d.listenAddr, |
|
| 60 |
- RemoteAddrs: []string{remoteAddr},
|
|
| 61 |
- Manager: manager, |
|
| 62 |
- CACertHash: cahash, |
|
| 63 |
- } |
|
| 64 |
- |
|
| 65 |
- if secret != "" {
|
|
| 66 |
- req.Secret = secret |
|
| 56 |
+// Join joins a daemon to an existing cluster. |
|
| 57 |
+func (d *SwarmDaemon) Join(req swarm.JoinRequest) error {
|
|
| 58 |
+ if req.ListenAddr == "" {
|
|
| 59 |
+ req.ListenAddr = d.listenAddr |
|
| 67 | 60 |
} |
| 68 | 61 |
status, out, err := d.SockRequest("POST", "/swarm/join", req)
|
| 69 | 62 |
if status != http.StatusOK {
|
| ... | ... |
@@ -38,7 +38,7 @@ func (s *DockerSwarmSuite) TestApiSwarmInit(c *check.C) {
|
| 38 | 38 |
c.Assert(info.ControlAvailable, checker.Equals, false) |
| 39 | 39 |
c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStateInactive) |
| 40 | 40 |
|
| 41 |
- c.Assert(d2.Join(d1.listenAddr, "", "", false), checker.IsNil) |
|
| 41 |
+ c.Assert(d2.Join(swarm.JoinRequest{RemoteAddrs: []string{d1.listenAddr}}), checker.IsNil)
|
|
| 42 | 42 |
|
| 43 | 43 |
info, err = d2.info() |
| 44 | 44 |
c.Assert(err, checker.IsNil) |
| ... | ... |
@@ -76,10 +76,19 @@ func (s *DockerSwarmSuite) TestApiSwarmManualAcceptanceSecret(c *check.C) {
|
| 76 | 76 |
|
| 77 | 77 |
func (s *DockerSwarmSuite) testAPISwarmManualAcceptance(c *check.C, secret string) {
|
| 78 | 78 |
d1 := s.AddDaemon(c, false, false) |
| 79 |
- c.Assert(d1.Init(map[string]bool{}, secret), checker.IsNil)
|
|
| 79 |
+ c.Assert(d1.Init(swarm.InitRequest{
|
|
| 80 |
+ Spec: swarm.Spec{
|
|
| 81 |
+ AcceptancePolicy: swarm.AcceptancePolicy{
|
|
| 82 |
+ Policies: []swarm.Policy{
|
|
| 83 |
+ {Role: swarm.NodeRoleWorker, Secret: &secret},
|
|
| 84 |
+ {Role: swarm.NodeRoleManager, Secret: &secret},
|
|
| 85 |
+ }, |
|
| 86 |
+ }, |
|
| 87 |
+ }, |
|
| 88 |
+ }), checker.IsNil) |
|
| 80 | 89 |
|
| 81 | 90 |
d2 := s.AddDaemon(c, false, false) |
| 82 |
- err := d2.Join(d1.listenAddr, "", "", false) |
|
| 91 |
+ err := d2.Join(swarm.JoinRequest{RemoteAddrs: []string{d1.listenAddr}})
|
|
| 83 | 92 |
c.Assert(err, checker.NotNil) |
| 84 | 93 |
if secret == "" {
|
| 85 | 94 |
c.Assert(err.Error(), checker.Contains, "needs to be accepted") |
| ... | ... |
@@ -97,7 +106,7 @@ func (s *DockerSwarmSuite) testAPISwarmManualAcceptance(c *check.C, secret strin |
| 97 | 97 |
c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStateInactive) |
| 98 | 98 |
} |
| 99 | 99 |
d3 := s.AddDaemon(c, false, false) |
| 100 |
- c.Assert(d3.Join(d1.listenAddr, secret, "", false), checker.NotNil) |
|
| 100 |
+ c.Assert(d3.Join(swarm.JoinRequest{Secret: secret, RemoteAddrs: []string{d1.listenAddr}}), checker.NotNil)
|
|
| 101 | 101 |
info, err := d3.info() |
| 102 | 102 |
c.Assert(err, checker.IsNil) |
| 103 | 103 |
c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStatePending) |
| ... | ... |
@@ -120,26 +129,34 @@ func (s *DockerSwarmSuite) testAPISwarmManualAcceptance(c *check.C, secret strin |
| 120 | 120 |
|
| 121 | 121 |
func (s *DockerSwarmSuite) TestApiSwarmSecretAcceptance(c *check.C) {
|
| 122 | 122 |
d1 := s.AddDaemon(c, false, false) |
| 123 |
- aa := make(map[string]bool) |
|
| 124 |
- aa["worker"] = true |
|
| 125 |
- c.Assert(d1.Init(aa, "foobar"), checker.IsNil) |
|
| 123 |
+ secret := "foobar" |
|
| 124 |
+ c.Assert(d1.Init(swarm.InitRequest{
|
|
| 125 |
+ Spec: swarm.Spec{
|
|
| 126 |
+ AcceptancePolicy: swarm.AcceptancePolicy{
|
|
| 127 |
+ Policies: []swarm.Policy{
|
|
| 128 |
+ {Role: swarm.NodeRoleWorker, Autoaccept: true, Secret: &secret},
|
|
| 129 |
+ {Role: swarm.NodeRoleManager, Secret: &secret},
|
|
| 130 |
+ }, |
|
| 131 |
+ }, |
|
| 132 |
+ }, |
|
| 133 |
+ }), checker.IsNil) |
|
| 126 | 134 |
|
| 127 | 135 |
d2 := s.AddDaemon(c, false, false) |
| 128 |
- err := d2.Join(d1.listenAddr, "", "", false) |
|
| 136 |
+ err := d2.Join(swarm.JoinRequest{RemoteAddrs: []string{d1.listenAddr}})
|
|
| 129 | 137 |
c.Assert(err, checker.NotNil) |
| 130 | 138 |
c.Assert(err.Error(), checker.Contains, "secret token is necessary") |
| 131 | 139 |
info, err := d2.info() |
| 132 | 140 |
c.Assert(err, checker.IsNil) |
| 133 | 141 |
c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStateInactive) |
| 134 | 142 |
|
| 135 |
- err = d2.Join(d1.listenAddr, "foobaz", "", false) |
|
| 143 |
+ err = d2.Join(swarm.JoinRequest{Secret: "foobaz", RemoteAddrs: []string{d1.listenAddr}})
|
|
| 136 | 144 |
c.Assert(err, checker.NotNil) |
| 137 | 145 |
c.Assert(err.Error(), checker.Contains, "secret token is necessary") |
| 138 | 146 |
info, err = d2.info() |
| 139 | 147 |
c.Assert(err, checker.IsNil) |
| 140 | 148 |
c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStateInactive) |
| 141 | 149 |
|
| 142 |
- c.Assert(d2.Join(d1.listenAddr, "foobar", "", false), checker.IsNil) |
|
| 150 |
+ c.Assert(d2.Join(swarm.JoinRequest{Secret: "foobar", RemoteAddrs: []string{d1.listenAddr}}), checker.IsNil)
|
|
| 143 | 151 |
info, err = d2.info() |
| 144 | 152 |
c.Assert(err, checker.IsNil) |
| 145 | 153 |
c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStateActive) |
| ... | ... |
@@ -156,14 +173,14 @@ func (s *DockerSwarmSuite) TestApiSwarmSecretAcceptance(c *check.C) {
|
| 156 | 156 |
} |
| 157 | 157 |
}) |
| 158 | 158 |
|
| 159 |
- err = d2.Join(d1.listenAddr, "foobar", "", false) |
|
| 159 |
+ err = d2.Join(swarm.JoinRequest{Secret: "foobar", RemoteAddrs: []string{d1.listenAddr}})
|
|
| 160 | 160 |
c.Assert(err, checker.NotNil) |
| 161 | 161 |
c.Assert(err.Error(), checker.Contains, "secret token is necessary") |
| 162 | 162 |
info, err = d2.info() |
| 163 | 163 |
c.Assert(err, checker.IsNil) |
| 164 | 164 |
c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStateInactive) |
| 165 | 165 |
|
| 166 |
- c.Assert(d2.Join(d1.listenAddr, "foobaz", "", false), checker.IsNil) |
|
| 166 |
+ c.Assert(d2.Join(swarm.JoinRequest{Secret: "foobaz", RemoteAddrs: []string{d1.listenAddr}}), checker.IsNil)
|
|
| 167 | 167 |
info, err = d2.info() |
| 168 | 168 |
c.Assert(err, checker.IsNil) |
| 169 | 169 |
c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStateActive) |
| ... | ... |
@@ -182,14 +199,14 @@ func (s *DockerSwarmSuite) TestApiSwarmSecretAcceptance(c *check.C) {
|
| 182 | 182 |
} |
| 183 | 183 |
}) |
| 184 | 184 |
|
| 185 |
- err = d2.Join(d1.listenAddr, "", "", false) |
|
| 185 |
+ err = d2.Join(swarm.JoinRequest{RemoteAddrs: []string{d1.listenAddr}})
|
|
| 186 | 186 |
c.Assert(err, checker.NotNil) |
| 187 | 187 |
c.Assert(err.Error(), checker.Contains, "secret token is necessary") |
| 188 | 188 |
info, err = d2.info() |
| 189 | 189 |
c.Assert(err, checker.IsNil) |
| 190 | 190 |
c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStateInactive) |
| 191 | 191 |
|
| 192 |
- c.Assert(d2.Join(d1.listenAddr, "foobaz", "", false), checker.IsNil) |
|
| 192 |
+ c.Assert(d2.Join(swarm.JoinRequest{Secret: "foobaz", RemoteAddrs: []string{d1.listenAddr}}), checker.IsNil)
|
|
| 193 | 193 |
info, err = d2.info() |
| 194 | 194 |
c.Assert(err, checker.IsNil) |
| 195 | 195 |
c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStateActive) |
| ... | ... |
@@ -206,7 +223,7 @@ func (s *DockerSwarmSuite) TestApiSwarmSecretAcceptance(c *check.C) {
|
| 206 | 206 |
} |
| 207 | 207 |
}) |
| 208 | 208 |
|
| 209 |
- c.Assert(d2.Join(d1.listenAddr, "", "", false), checker.IsNil) |
|
| 209 |
+ c.Assert(d2.Join(swarm.JoinRequest{RemoteAddrs: []string{d1.listenAddr}}), checker.IsNil)
|
|
| 210 | 210 |
info, err = d2.info() |
| 211 | 211 |
c.Assert(err, checker.IsNil) |
| 212 | 212 |
c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStateActive) |
| ... | ... |
@@ -220,17 +237,26 @@ func (s *DockerSwarmSuite) TestApiSwarmSecretAcceptance(c *check.C) {
|
| 220 | 220 |
func (s *DockerSwarmSuite) TestApiSwarmCAHash(c *check.C) {
|
| 221 | 221 |
d1 := s.AddDaemon(c, true, true) |
| 222 | 222 |
d2 := s.AddDaemon(c, false, false) |
| 223 |
- err := d2.Join(d1.listenAddr, "", "foobar", false) |
|
| 223 |
+ err := d2.Join(swarm.JoinRequest{CACertHash: "foobar", RemoteAddrs: []string{d1.listenAddr}})
|
|
| 224 | 224 |
c.Assert(err, checker.NotNil) |
| 225 | 225 |
c.Assert(err.Error(), checker.Contains, "invalid checksum digest format") |
| 226 | 226 |
|
| 227 | 227 |
c.Assert(len(d1.CACertHash), checker.GreaterThan, 0) |
| 228 |
- c.Assert(d2.Join(d1.listenAddr, "", d1.CACertHash, false), checker.IsNil) |
|
| 228 |
+ c.Assert(d2.Join(swarm.JoinRequest{CACertHash: d1.CACertHash, RemoteAddrs: []string{d1.listenAddr}}), checker.IsNil)
|
|
| 229 | 229 |
} |
| 230 | 230 |
|
| 231 | 231 |
func (s *DockerSwarmSuite) TestApiSwarmPromoteDemote(c *check.C) {
|
| 232 | 232 |
d1 := s.AddDaemon(c, false, false) |
| 233 |
- c.Assert(d1.Init(map[string]bool{"worker": true}, ""), checker.IsNil)
|
|
| 233 |
+ c.Assert(d1.Init(swarm.InitRequest{
|
|
| 234 |
+ Spec: swarm.Spec{
|
|
| 235 |
+ AcceptancePolicy: swarm.AcceptancePolicy{
|
|
| 236 |
+ Policies: []swarm.Policy{
|
|
| 237 |
+ {Role: swarm.NodeRoleWorker, Autoaccept: true},
|
|
| 238 |
+ {Role: swarm.NodeRoleManager},
|
|
| 239 |
+ }, |
|
| 240 |
+ }, |
|
| 241 |
+ }, |
|
| 242 |
+ }), checker.IsNil) |
|
| 234 | 243 |
d2 := s.AddDaemon(c, true, false) |
| 235 | 244 |
|
| 236 | 245 |
info, err := d2.info() |
| ... | ... |
@@ -561,7 +587,9 @@ func (s *DockerSwarmSuite) TestApiSwarmLeaveOnPendingJoin(c *check.C) {
|
| 561 | 561 |
c.Assert(err, checker.IsNil) |
| 562 | 562 |
id = strings.TrimSpace(id) |
| 563 | 563 |
|
| 564 |
- go d2.Join("nosuchhost:1234", "", "", false) // will block on pending state
|
|
| 564 |
+ go d2.Join(swarm.JoinRequest{
|
|
| 565 |
+ RemoteAddrs: []string{"nosuchhost:1234"},
|
|
| 566 |
+ }) // will block on pending state |
|
| 565 | 567 |
|
| 566 | 568 |
for i := 0; ; i++ {
|
| 567 | 569 |
info, err := d2.info() |
| ... | ... |
@@ -587,7 +615,9 @@ func (s *DockerSwarmSuite) TestApiSwarmLeaveOnPendingJoin(c *check.C) {
|
| 587 | 587 |
// #23705 |
| 588 | 588 |
func (s *DockerSwarmSuite) TestApiSwarmRestoreOnPendingJoin(c *check.C) {
|
| 589 | 589 |
d := s.AddDaemon(c, false, false) |
| 590 |
- go d.Join("nosuchhost:1234", "", "", false) // will block on pending state
|
|
| 590 |
+ go d.Join(swarm.JoinRequest{
|
|
| 591 |
+ RemoteAddrs: []string{"nosuchhost:1234"},
|
|
| 592 |
+ }) // will block on pending state |
|
| 591 | 593 |
|
| 592 | 594 |
for i := 0; ; i++ {
|
| 593 | 595 |
info, err := d.info() |