mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
integration: Add TestContainerWithAutoRemoveCanBeRestarted
Signed-off-by: Paweł Gronowski <pawel.gronowski@docker.com>
This commit is contained in:
parent
d8f20bfdc1
commit
44fde1bdb7
2 changed files with 72 additions and 0 deletions
|
@ -9,6 +9,7 @@ import (
|
|||
"github.com/docker/docker/api/types"
|
||||
"github.com/docker/docker/api/types/container"
|
||||
"github.com/docker/docker/client"
|
||||
testContainer "github.com/docker/docker/integration/internal/container"
|
||||
"github.com/docker/docker/testutil/daemon"
|
||||
"gotest.tools/v3/assert"
|
||||
"gotest.tools/v3/poll"
|
||||
|
@ -153,3 +154,60 @@ func pollForNewHealthCheck(ctx context.Context, client *client.Client, startTime
|
|||
return poll.Continue("waiting for a new container healthcheck")
|
||||
}
|
||||
}
|
||||
|
||||
// Container started with --rm should be able to be restarted.
|
||||
// It should be removed only if killed or stopped
|
||||
func TestContainerWithAutoRemoveCanBeRestarted(t *testing.T) {
|
||||
defer setupTest(t)()
|
||||
cli := testEnv.APIClient()
|
||||
ctx := context.Background()
|
||||
|
||||
noWaitTimeout := 0
|
||||
|
||||
for _, tc := range []struct {
|
||||
desc string
|
||||
doSth func(ctx context.Context, containerID string) error
|
||||
}{
|
||||
{
|
||||
desc: "kill",
|
||||
doSth: func(ctx context.Context, containerID string) error {
|
||||
return cli.ContainerKill(ctx, containerID, "SIGKILL")
|
||||
},
|
||||
},
|
||||
{
|
||||
desc: "stop",
|
||||
doSth: func(ctx context.Context, containerID string) error {
|
||||
return cli.ContainerStop(ctx, containerID, container.StopOptions{Timeout: &noWaitTimeout})
|
||||
},
|
||||
},
|
||||
} {
|
||||
tc := tc
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
cID := testContainer.Run(ctx, t, cli,
|
||||
testContainer.WithName("autoremove-restart-and-"+tc.desc),
|
||||
testContainer.WithAutoRemove,
|
||||
)
|
||||
defer func() {
|
||||
err := cli.ContainerRemove(ctx, cID, types.ContainerRemoveOptions{Force: true})
|
||||
if t.Failed() && err != nil {
|
||||
t.Logf("Cleaning up test container failed with error: %v", err)
|
||||
}
|
||||
}()
|
||||
|
||||
err := cli.ContainerRestart(ctx, cID, container.StopOptions{Timeout: &noWaitTimeout})
|
||||
assert.NilError(t, err)
|
||||
|
||||
inspect, err := cli.ContainerInspect(ctx, cID)
|
||||
assert.NilError(t, err)
|
||||
assert.Assert(t, inspect.State.Status != "removing", "Container should not be removing yet")
|
||||
|
||||
poll.WaitOn(t, testContainer.IsInState(ctx, cli, cID, "running"))
|
||||
|
||||
err = tc.doSth(ctx, cID)
|
||||
assert.NilError(t, err)
|
||||
|
||||
poll.WaitOn(t, testContainer.IsRemoved(ctx, cli, cID))
|
||||
})
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -57,3 +57,17 @@ func IsSuccessful(ctx context.Context, client client.APIClient, containerID stri
|
|||
return poll.Continue("waiting for container to be \"exited\", currently %s", inspect.State.Status)
|
||||
}
|
||||
}
|
||||
|
||||
// IsRemoved verifies the container has been removed
|
||||
func IsRemoved(ctx context.Context, cli client.APIClient, containerID string) func(log poll.LogT) poll.Result {
|
||||
return func(log poll.LogT) poll.Result {
|
||||
inspect, err := cli.ContainerInspect(ctx, containerID)
|
||||
if err != nil {
|
||||
if client.IsErrNotFound(err) {
|
||||
return poll.Success()
|
||||
}
|
||||
return poll.Error(err)
|
||||
}
|
||||
return poll.Continue("waiting for container to be removed, currently %s", inspect.State.Status)
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue