| package stack | |
| import ( | |
| "strings" | |
| "testing" | |
| "github.com/docker/cli/internal/test/environment" | |
| "gotest.tools/v3/golden" | |
| "gotest.tools/v3/icmd" | |
| "gotest.tools/v3/poll" | |
| ) | |
| var pollSettings = environment.DefaultPollSettings | |
| func TestRemove(t *testing.T) { | |
| stackname := "test-stack-remove" | |
| deployFullStack(t, stackname) | |
| defer cleanupFullStack(t, stackname) | |
| result := icmd.RunCommand("docker", "stack", "rm", stackname) | |
| result.Assert(t, icmd.Expected{Err: icmd.None}) | |
| golden.Assert(t, result.Stdout(), "stack-remove-success.golden") | |
| } | |
| func deployFullStack(t *testing.T, stackname string) { | |
| t.Helper() | |
| // TODO: this stack should have full options not minimal options | |
| result := icmd.RunCommand("docker", "stack", "deploy", "--detach=false", | |
| "--compose-file=./testdata/full-stack.yml", stackname) | |
| result.Assert(t, icmd.Success) | |
| poll.WaitOn(t, taskCount(stackname, 2), pollSettings) | |
| } | |
| func cleanupFullStack(t *testing.T, stackname string) { | |
| t.Helper() | |
| // FIXME(vdemeester) we shouldn't have to do that. it is hiding a race on docker stack rm | |
| poll.WaitOn(t, stackRm(stackname), pollSettings) | |
| poll.WaitOn(t, taskCount(stackname, 0), pollSettings) | |
| } | |
| func stackRm(stackname string) func(t poll.LogT) poll.Result { | |
| return func(poll.LogT) poll.Result { | |
| result := icmd.RunCommand("docker", "stack", "rm", stackname) | |
| if result.Error != nil { | |
| if strings.Contains(result.Stderr(), "not found") { | |
| return poll.Success() | |
| } | |
| return poll.Continue("docker stack rm %s failed : %v", stackname, result.Error) | |
| } | |
| return poll.Success() | |
| } | |
| } | |
| func taskCount(stackname string, expected int) func(t poll.LogT) poll.Result { | |
| return func(poll.LogT) poll.Result { | |
| result := icmd.RunCommand("docker", "stack", "ps", stackname, "-f=desired-state=running") | |
| count := lines(result.Stdout()) - 1 | |
| if count == expected { | |
| return poll.Success() | |
| } | |
| return poll.Continue("task count is %d waiting for %d", count, expected) | |
| } | |
| } | |
| func lines(out string) int { | |
| return len(strings.Split(strings.TrimSpace(out), "\n")) | |
| } |