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