Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>
| ... | ... |
@@ -379,10 +379,11 @@ func (c *Cluster) Leave(force bool) error {
|
| 379 | 379 |
if err := node.Stop(ctx); err != nil && !strings.Contains(err.Error(), "context canceled") {
|
| 380 | 380 |
return err |
| 381 | 381 |
} |
| 382 |
- nodeID := node.NodeID() |
|
| 383 |
- for _, id := range c.config.Backend.ListContainersForNode(nodeID) {
|
|
| 384 |
- if err := c.config.Backend.ContainerRm(id, &apitypes.ContainerRmConfig{ForceRemove: true}); err != nil {
|
|
| 385 |
- logrus.Errorf("error removing %v: %v", id, err)
|
|
| 382 |
+ if nodeID := node.NodeID(); nodeID != "" {
|
|
| 383 |
+ for _, id := range c.config.Backend.ListContainersForNode(nodeID) {
|
|
| 384 |
+ if err := c.config.Backend.ContainerRm(id, &apitypes.ContainerRmConfig{ForceRemove: true}); err != nil {
|
|
| 385 |
+ logrus.Errorf("error removing %v: %v", id, err)
|
|
| 386 |
+ } |
|
| 386 | 387 |
} |
| 387 | 388 |
} |
| 388 | 389 |
c.Lock() |
| ... | ... |
@@ -550,6 +550,32 @@ func (s *DockerSwarmSuite) TestApiSwarmLeaveRemovesContainer(c *check.C) {
|
| 550 | 550 |
c.Assert(id, checker.HasPrefix, strings.TrimSpace(id2)) |
| 551 | 551 |
} |
| 552 | 552 |
|
| 553 |
+// #23629 |
|
| 554 |
+func (s *DockerSwarmSuite) TestApiSwarmLeaveOnPendingJoin(c *check.C) {
|
|
| 555 |
+ s.AddDaemon(c, true, true) |
|
| 556 |
+ d2 := s.AddDaemon(c, false, false) |
|
| 557 |
+ |
|
| 558 |
+ id, err := d2.Cmd("run", "-d", "busybox", "top")
|
|
| 559 |
+ c.Assert(err, checker.IsNil) |
|
| 560 |
+ id = strings.TrimSpace(id) |
|
| 561 |
+ |
|
| 562 |
+ go d2.Join("nosuchhost:1234", "", "", false) // will block on pending state
|
|
| 563 |
+ |
|
| 564 |
+ time.Sleep(1 * time.Second) |
|
| 565 |
+ |
|
| 566 |
+ info, err := d2.info() |
|
| 567 |
+ c.Assert(err, checker.IsNil) |
|
| 568 |
+ c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStatePending) |
|
| 569 |
+ |
|
| 570 |
+ c.Assert(d2.Leave(true), checker.IsNil) |
|
| 571 |
+ |
|
| 572 |
+ waitAndAssert(c, defaultReconciliationTimeout, d2.checkActiveContainerCount, checker.Equals, 1) |
|
| 573 |
+ |
|
| 574 |
+ id2, err := d2.Cmd("ps", "-q")
|
|
| 575 |
+ c.Assert(err, checker.IsNil) |
|
| 576 |
+ c.Assert(id, checker.HasPrefix, strings.TrimSpace(id2)) |
|
| 577 |
+} |
|
| 578 |
+ |
|
| 553 | 579 |
func (s *DockerSwarmSuite) TestApiSwarmManagerRestore(c *check.C) {
|
| 554 | 580 |
d1 := s.AddDaemon(c, true, true) |
| 555 | 581 |
|