@@ -11,6 +11,7 @@ import (
1111 "github.com/docker/docker/api/types"
1212 "github.com/docker/docker/api/types/swarm"
1313 "github.com/docker/docker/api/types/versions"
14+ apiclient "github.com/docker/docker/client"
1415 "github.com/pkg/errors"
1516)
1617
@@ -58,6 +59,14 @@ func RunRemove(ctx context.Context, dockerCli command.Cli, opts options.Remove)
5859
5960 if hasError {
6061 errs = append (errs , fmt .Sprintf ("Failed to remove some resources from stack: %s" , namespace ))
62+ continue
63+ }
64+
65+ if ! opts .Detach {
66+ err = waitOnTasks (ctx , client , namespace )
67+ if err != nil {
68+ errs = append (errs , fmt .Sprintf ("Failed to wait on tasks of stack: %s: %s" , namespace , err ))
69+ }
6170 }
6271 }
6372
@@ -137,3 +146,45 @@ func removeConfigs(
137146 }
138147 return hasError
139148}
149+
150+ var numberedStates = map [swarm.TaskState ]int64 {
151+ swarm .TaskStateNew : 1 ,
152+ swarm .TaskStateAllocated : 2 ,
153+ swarm .TaskStatePending : 3 ,
154+ swarm .TaskStateAssigned : 4 ,
155+ swarm .TaskStateAccepted : 5 ,
156+ swarm .TaskStatePreparing : 6 ,
157+ swarm .TaskStateReady : 7 ,
158+ swarm .TaskStateStarting : 8 ,
159+ swarm .TaskStateRunning : 9 ,
160+ swarm .TaskStateComplete : 10 ,
161+ swarm .TaskStateShutdown : 11 ,
162+ swarm .TaskStateFailed : 12 ,
163+ swarm .TaskStateRejected : 13 ,
164+ }
165+
166+ func terminalState (state swarm.TaskState ) bool {
167+ return numberedStates [state ] > numberedStates [swarm .TaskStateRunning ]
168+ }
169+
170+ func waitOnTasks (ctx context.Context , client apiclient.APIClient , namespace string ) error {
171+ terminalStatesReached := 0
172+ for {
173+ tasks , err := getStackTasks (ctx , client , namespace )
174+ if err != nil {
175+ return fmt .Errorf ("failed to get tasks: %w" , err )
176+ }
177+
178+ for _ , task := range tasks {
179+ if terminalState (task .Status .State ) {
180+ terminalStatesReached ++
181+ break
182+ }
183+ }
184+
185+ if terminalStatesReached == len (tasks ) {
186+ break
187+ }
188+ }
189+ return nil
190+ }
0 commit comments