Browse code

integration: don't poll for containers to be running

container.Run() should be a synchronous operation in normal circumstances;
the container is created and started, so polling after that for the
container to be in the "running" state should not be needed.

This should also prevent issues when a container (for whatever reason)
exited immediately after starting; in that case we would continue
polling for it to be running (which likely would never happen).

Let's skip the polling; if the container is not in the expected state
(i.e. exited), tests should fail as well.

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>

Sebastiaan van Stijn authored on 2023/09/09 03:45:45
Showing 14 changed files
... ...
@@ -47,10 +47,6 @@ func TestCheckpoint(t *testing.T) {
47 47
 		Type:   mounttypes.TypeTmpfs,
48 48
 		Target: "/tmp",
49 49
 	}))
50
-	poll.WaitOn(t,
51
-		container.IsInState(ctx, apiClient, cID, "running"),
52
-		poll.WithDelay(100*time.Millisecond),
53
-	)
54 50
 
55 51
 	// FIXME: ipv6 iptables modules are not uploaded in the test environment
56 52
 	stdoutStderr, err = exec.Command("bash", "-c", "set -x; "+
... ...
@@ -3,14 +3,12 @@ package container // import "github.com/docker/docker/integration/container"
3 3
 import (
4 4
 	"strings"
5 5
 	"testing"
6
-	"time"
7 6
 
8 7
 	"github.com/docker/docker/api/types"
9 8
 	containertypes "github.com/docker/docker/api/types/container"
10 9
 	"github.com/docker/docker/integration/internal/container"
11 10
 	"github.com/docker/docker/testutil"
12 11
 	"gotest.tools/v3/assert"
13
-	"gotest.tools/v3/poll"
14 12
 	"gotest.tools/v3/skip"
15 13
 )
16 14
 
... ...
@@ -107,11 +105,8 @@ func TestWindowsDevices(t *testing.T) {
107 107
 				assert.ErrorContains(t, err, d.expectedStartFailureMessage)
108 108
 				return
109 109
 			}
110
-
111 110
 			assert.NilError(t, err)
112 111
 
113
-			poll.WaitOn(t, container.IsInState(ctx, apiClient, id, "running"), poll.WithDelay(100*time.Millisecond))
114
-
115 112
 			// /Windows/System32/HostDriverStore is mounted from the host when class GUID 5B45201D-F2F2-4F3B-85BB-30FF1F953599
116 113
 			// is mounted. See `C:\windows\System32\containers\devices.def` on a Windows host for (slightly more) details.
117 114
 			res, err := container.Exec(ctx, apiClient, id, []string{
... ...
@@ -152,7 +152,6 @@ func TestKillDifferentUserContainer(t *testing.T) {
152 152
 	id := container.Run(ctx, t, apiClient, func(c *container.TestContainerConfig) {
153 153
 		c.Config.User = "daemon"
154 154
 	})
155
-	poll.WaitOn(t, container.IsInState(ctx, apiClient, id, "running"), poll.WithDelay(100*time.Millisecond))
156 155
 
157 156
 	err := apiClient.ContainerKill(ctx, id, "SIGKILL")
158 157
 	assert.NilError(t, err)
... ...
@@ -94,7 +94,7 @@ func startServerContainer(ctx context.Context, t *testing.T, msg string, port in
94 94
 	t.Helper()
95 95
 	apiClient := testEnv.APIClient()
96 96
 
97
-	cID := container.Run(ctx, t, apiClient,
97
+	return container.Run(ctx, t, apiClient,
98 98
 		container.WithName("server-"+t.Name()),
99 99
 		container.WithCmd("sh", "-c", fmt.Sprintf("echo %q | nc -lp %d", msg, port)),
100 100
 		container.WithExposedPorts(fmt.Sprintf("%d/tcp", port)),
... ...
@@ -106,11 +106,8 @@ func startServerContainer(ctx context.Context, t *testing.T, msg string, port in
106 106
 					},
107 107
 				},
108 108
 			}
109
-		})
110
-
111
-	poll.WaitOn(t, container.IsInState(ctx, apiClient, cID, "running"), poll.WithDelay(100*time.Millisecond))
112
-
113
-	return cID
109
+		},
110
+	)
114 111
 }
115 112
 
116 113
 // getExternalAddress() returns the external IP-address from eth0. If eth0 has
... ...
@@ -27,7 +27,6 @@ func TestPause(t *testing.T) {
27 27
 	apiClient := testEnv.APIClient()
28 28
 
29 29
 	cID := container.Run(ctx, t, apiClient)
30
-	poll.WaitOn(t, container.IsInState(ctx, apiClient, cID, "running"), poll.WithDelay(100*time.Millisecond))
31 30
 
32 31
 	since := request.DaemonUnixTime(ctx, t, apiClient, testEnv)
33 32
 
... ...
@@ -58,8 +57,6 @@ func TestPauseFailsOnWindowsServerContainers(t *testing.T) {
58 58
 	apiClient := testEnv.APIClient()
59 59
 
60 60
 	cID := container.Run(ctx, t, apiClient)
61
-	poll.WaitOn(t, container.IsInState(ctx, apiClient, cID, "running"), poll.WithDelay(100*time.Millisecond))
62
-
63 61
 	err := apiClient.ContainerPause(ctx, cID)
64 62
 	assert.Check(t, is.ErrorContains(err, cerrdefs.ErrNotImplemented.Error()))
65 63
 }
... ...
@@ -72,8 +69,6 @@ func TestPauseStopPausedContainer(t *testing.T) {
72 72
 	apiClient := testEnv.APIClient()
73 73
 
74 74
 	cID := container.Run(ctx, t, apiClient)
75
-	poll.WaitOn(t, container.IsInState(ctx, apiClient, cID, "running"), poll.WithDelay(100*time.Millisecond))
76
-
77 75
 	err := apiClient.ContainerPause(ctx, cID)
78 76
 	assert.NilError(t, err)
79 77
 
... ...
@@ -3,14 +3,12 @@ package container // import "github.com/docker/docker/integration/container"
3 3
 import (
4 4
 	"os"
5 5
 	"testing"
6
-	"time"
7 6
 
8 7
 	"github.com/docker/docker/api/types"
9 8
 	"github.com/docker/docker/errdefs"
10 9
 	"github.com/docker/docker/integration/internal/container"
11 10
 	"gotest.tools/v3/assert"
12 11
 	is "gotest.tools/v3/assert/cmp"
13
-	"gotest.tools/v3/poll"
14 12
 	"gotest.tools/v3/skip"
15 13
 )
16 14
 
... ...
@@ -25,12 +23,10 @@ func TestPIDModeHost(t *testing.T) {
25 25
 	apiClient := testEnv.APIClient()
26 26
 
27 27
 	cID := container.Run(ctx, t, apiClient, container.WithPIDMode("host"))
28
-	poll.WaitOn(t, container.IsInState(ctx, apiClient, cID, "running"), poll.WithDelay(100*time.Millisecond))
29 28
 	cPid := container.GetContainerNS(ctx, t, apiClient, cID, "pid")
30 29
 	assert.Assert(t, hostPid == cPid)
31 30
 
32 31
 	cID = container.Run(ctx, t, apiClient)
33
-	poll.WaitOn(t, container.IsInState(ctx, apiClient, cID, "running"), poll.WithDelay(100*time.Millisecond))
34 32
 	cPid = container.GetContainerNS(ctx, t, apiClient, cID, "pid")
35 33
 	assert.Assert(t, hostPid != cPid)
36 34
 }
... ...
@@ -52,7 +52,6 @@ func TestRenameStoppedContainer(t *testing.T) {
52 52
 
53 53
 	oldName := "first_name" + t.Name()
54 54
 	cID := container.Run(ctx, t, apiClient, container.WithName(oldName), container.WithCmd("sh"))
55
-	poll.WaitOn(t, container.IsInState(ctx, apiClient, cID, "exited"), poll.WithDelay(100*time.Millisecond))
56 55
 
57 56
 	inspect, err := apiClient.ContainerInspect(ctx, cID)
58 57
 	assert.NilError(t, err)
... ...
@@ -73,7 +72,6 @@ func TestRenameRunningContainerAndReuse(t *testing.T) {
73 73
 
74 74
 	oldName := "first_name" + t.Name()
75 75
 	cID := container.Run(ctx, t, apiClient, container.WithName(oldName))
76
-	poll.WaitOn(t, container.IsInState(ctx, apiClient, cID, "running"), poll.WithDelay(100*time.Millisecond))
77 76
 
78 77
 	newName := "new_name" + stringid.GenerateRandomID()
79 78
 	err := apiClient.ContainerRename(ctx, oldName, newName)
... ...
@@ -87,7 +85,6 @@ func TestRenameRunningContainerAndReuse(t *testing.T) {
87 87
 	assert.Check(t, is.ErrorContains(err, "No such container: "+oldName))
88 88
 
89 89
 	cID = container.Run(ctx, t, apiClient, container.WithName(oldName))
90
-	poll.WaitOn(t, container.IsInState(ctx, apiClient, cID, "running"), poll.WithDelay(100*time.Millisecond))
91 90
 
92 91
 	inspect, err = apiClient.ContainerInspect(ctx, cID)
93 92
 	assert.NilError(t, err)
... ...
@@ -100,7 +97,6 @@ func TestRenameInvalidName(t *testing.T) {
100 100
 
101 101
 	oldName := "first_name" + t.Name()
102 102
 	cID := container.Run(ctx, t, apiClient, container.WithName(oldName))
103
-	poll.WaitOn(t, container.IsInState(ctx, apiClient, cID, "running"), poll.WithDelay(100*time.Millisecond))
104 103
 
105 104
 	err := apiClient.ContainerRename(ctx, oldName, "new:invalid")
106 105
 	assert.Check(t, is.ErrorContains(err, "Invalid container name"))
... ...
@@ -142,8 +138,6 @@ func TestRenameAnonymousContainer(t *testing.T) {
142 142
 	err = apiClient.ContainerStart(ctx, container1Name, types.ContainerStartOptions{})
143 143
 	assert.NilError(t, err)
144 144
 
145
-	poll.WaitOn(t, container.IsInState(ctx, apiClient, cID, "running"), poll.WithDelay(100*time.Millisecond))
146
-
147 145
 	count := "-c"
148 146
 	if testEnv.DaemonInfo.OSType == "windows" {
149 147
 		count = "-n"
... ...
@@ -168,8 +162,6 @@ func TestRenameContainerWithSameName(t *testing.T) {
168 168
 
169 169
 	oldName := "old" + t.Name()
170 170
 	cID := container.Run(ctx, t, apiClient, container.WithName(oldName))
171
-
172
-	poll.WaitOn(t, container.IsInState(ctx, apiClient, cID, "running"), poll.WithDelay(100*time.Millisecond))
173 171
 	err := apiClient.ContainerRename(ctx, oldName, oldName)
174 172
 	assert.Check(t, is.ErrorContains(err, "Renaming a container with the same name"))
175 173
 	err = apiClient.ContainerRename(ctx, cID, oldName)
... ...
@@ -190,12 +182,10 @@ func TestRenameContainerWithLinkedContainer(t *testing.T) {
190 190
 
191 191
 	db1Name := "db1" + t.Name()
192 192
 	db1ID := container.Run(ctx, t, apiClient, container.WithName(db1Name))
193
-	poll.WaitOn(t, container.IsInState(ctx, apiClient, db1ID, "running"), poll.WithDelay(100*time.Millisecond))
194 193
 
195 194
 	app1Name := "app1" + t.Name()
196 195
 	app2Name := "app2" + t.Name()
197
-	app1ID := container.Run(ctx, t, apiClient, container.WithName(app1Name), container.WithLinks(db1Name+":/mysql"))
198
-	poll.WaitOn(t, container.IsInState(ctx, apiClient, app1ID, "running"), poll.WithDelay(100*time.Millisecond))
196
+	container.Run(ctx, t, apiClient, container.WithName(app1Name), container.WithLinks(db1Name+":/mysql"))
199 197
 
200 198
 	err := apiClient.ContainerRename(ctx, app1Name, app2Name)
201 199
 	assert.NilError(t, err)
... ...
@@ -3,7 +3,6 @@ package container // import "github.com/docker/docker/integration/container"
3 3
 import (
4 4
 	"context"
5 5
 	"testing"
6
-	"time"
7 6
 
8 7
 	"github.com/docker/docker/client"
9 8
 	"github.com/docker/docker/integration/internal/container"
... ...
@@ -11,7 +10,6 @@ import (
11 11
 	"github.com/docker/docker/testutil"
12 12
 	"github.com/docker/docker/testutil/daemon"
13 13
 	"gotest.tools/v3/assert"
14
-	"gotest.tools/v3/poll"
15 14
 	"gotest.tools/v3/skip"
16 15
 )
17 16
 
... ...
@@ -24,7 +22,6 @@ func testRunWithCgroupNs(ctx context.Context, t *testing.T, daemonNsMode string,
24 24
 	defer d.Stop(t)
25 25
 
26 26
 	cID := container.Run(ctx, t, apiClient, containerOpts...)
27
-	poll.WaitOn(t, container.IsInState(ctx, apiClient, cID, "running"), poll.WithDelay(100*time.Millisecond))
28 27
 
29 28
 	daemonCgroup := d.CgroupNamespace(t)
30 29
 	containerCgroup := container.GetContainerNS(ctx, t, apiClient, cID, "cgroup")
... ...
@@ -148,7 +145,6 @@ func TestCgroupNamespacesRunOlderClient(t *testing.T) {
148 148
 	defer d.Stop(t)
149 149
 
150 150
 	cID := container.Run(ctx, t, apiClient)
151
-	poll.WaitOn(t, container.IsInState(ctx, apiClient, cID, "running"), poll.WithDelay(100*time.Millisecond))
152 151
 
153 152
 	daemonCgroup := d.CgroupNamespace(t)
154 153
 	containerCgroup := container.GetContainerNS(ctx, t, apiClient, cID, "cgroup")
... ...
@@ -49,9 +49,6 @@ func TestNISDomainname(t *testing.T) {
49 49
 		c.Config.Hostname = hostname
50 50
 		c.Config.Domainname = domainname
51 51
 	})
52
-
53
-	poll.WaitOn(t, container.IsInState(ctx, apiClient, cID, "running"), poll.WithDelay(100*time.Millisecond))
54
-
55 52
 	inspect, err := apiClient.ContainerInspect(ctx, cID)
56 53
 	assert.NilError(t, err)
57 54
 	assert.Check(t, is.Equal(hostname, inspect.Config.Hostname))
... ...
@@ -92,9 +89,6 @@ func TestHostnameDnsResolution(t *testing.T) {
92 92
 		c.Config.Hostname = hostname
93 93
 		c.HostConfig.NetworkMode = containertypes.NetworkMode(netName)
94 94
 	})
95
-
96
-	poll.WaitOn(t, container.IsInState(ctx, apiClient, cID, "running"), poll.WithDelay(100*time.Millisecond))
97
-
98 95
 	inspect, err := apiClient.ContainerInspect(ctx, cID)
99 96
 	assert.NilError(t, err)
100 97
 	assert.Check(t, is.Equal(hostname, inspect.Config.Hostname))
... ...
@@ -118,8 +112,6 @@ func TestUnprivilegedPortsAndPing(t *testing.T) {
118 118
 		c.Config.User = "1000:1000"
119 119
 	})
120 120
 
121
-	poll.WaitOn(t, container.IsInState(ctx, apiClient, cID, "running"), poll.WithDelay(100*time.Millisecond))
122
-
123 121
 	// Check net.ipv4.ping_group_range.
124 122
 	res, err := container.Exec(ctx, apiClient, cID, []string{"cat", "/proc/sys/net/ipv4/ping_group_range"})
125 123
 	assert.NilError(t, err)
... ...
@@ -165,8 +157,6 @@ func TestPrivilegedHostDevices(t *testing.T) {
165 165
 
166 166
 	cID := container.Run(ctx, t, apiClient, container.WithPrivileged(true))
167 167
 
168
-	poll.WaitOn(t, container.IsInState(ctx, apiClient, cID, "running"), poll.WithDelay(100*time.Millisecond))
169
-
170 168
 	// Check test device.
171 169
 	res, err := container.Exec(ctx, apiClient, cID, []string{"ls", devTest})
172 170
 	assert.NilError(t, err)
... ...
@@ -5,13 +5,11 @@ import (
5 5
 	"io"
6 6
 	"reflect"
7 7
 	"testing"
8
-	"time"
9 8
 
10 9
 	"github.com/docker/docker/api/types"
11 10
 	"github.com/docker/docker/integration/internal/container"
12 11
 	"gotest.tools/v3/assert"
13 12
 	is "gotest.tools/v3/assert/cmp"
14
-	"gotest.tools/v3/poll"
15 13
 	"gotest.tools/v3/skip"
16 14
 )
17 15
 
... ...
@@ -26,9 +24,6 @@ func TestStats(t *testing.T) {
26 26
 	assert.NilError(t, err)
27 27
 
28 28
 	cID := container.Run(ctx, t, apiClient)
29
-
30
-	poll.WaitOn(t, container.IsInState(ctx, apiClient, cID, "running"), poll.WithDelay(100*time.Millisecond))
31
-
32 29
 	resp, err := apiClient.ContainerStats(ctx, cID, false)
33 30
 	assert.NilError(t, err)
34 31
 	defer resp.Body.Close()
... ...
@@ -88,7 +88,6 @@ func TestStopContainerWithTimeoutCancel(t *testing.T) {
88 88
 	id := container.Run(ctx, t, apiClient,
89 89
 		container.WithCmd("sh", "-c", "trap 'echo received TERM' TERM; while true; do usleep 10; done"),
90 90
 	)
91
-	poll.WaitOn(t, container.IsInState(ctx, apiClient, id, "running"))
92 91
 
93 92
 	ctxCancel, cancel := context.WithCancel(ctx)
94 93
 	t.Cleanup(cancel)
... ...
@@ -14,7 +14,6 @@ import (
14 14
 	"github.com/docker/docker/testutil/request"
15 15
 	"gotest.tools/v3/assert"
16 16
 	is "gotest.tools/v3/assert/cmp"
17
-	"gotest.tools/v3/poll"
18 17
 	"gotest.tools/v3/skip"
19 18
 )
20 19
 
... ...
@@ -33,8 +32,6 @@ func TestUpdateMemory(t *testing.T) {
33 33
 		}
34 34
 	})
35 35
 
36
-	poll.WaitOn(t, container.IsInState(ctx, apiClient, cID, "running"), poll.WithDelay(100*time.Millisecond))
37
-
38 36
 	const (
39 37
 		setMemory     int64 = 314572800
40 38
 		setMemorySwap int64 = 524288000
... ...
@@ -86,8 +86,6 @@ func TestWaitBlocked(t *testing.T) {
86 86
 			t.Parallel()
87 87
 			ctx := testutil.StartSpan(ctx, t)
88 88
 			containerID := container.Run(ctx, t, cli, container.WithCmd("sh", "-c", tc.cmd))
89
-			poll.WaitOn(t, container.IsInState(ctx, cli, containerID, "running"), poll.WithTimeout(30*time.Second), poll.WithDelay(100*time.Millisecond))
90
-
91 89
 			waitResC, errC := cli.ContainerWait(ctx, containerID, "")
92 90
 
93 91
 			err := cli.ContainerStop(ctx, containerID, containertypes.StopOptions{})
... ...
@@ -214,8 +212,6 @@ func TestWaitRestartedContainer(t *testing.T) {
214 214
 			)
215 215
 			defer cli.ContainerRemove(ctx, containerID, types.ContainerRemoveOptions{Force: true})
216 216
 
217
-			poll.WaitOn(t, container.IsInState(ctx, cli, containerID, "running"), poll.WithTimeout(30*time.Second), poll.WithDelay(100*time.Millisecond))
218
-
219 217
 			// Container is running now, wait for exit
220 218
 			waitResC, errC := cli.ContainerWait(ctx, containerID, tc.waitCond)
221 219
 
... ...
@@ -25,7 +25,6 @@ import (
25 25
 	"github.com/docker/docker/pkg/authorization"
26 26
 	"github.com/docker/docker/testutil/environment"
27 27
 	"gotest.tools/v3/assert"
28
-	"gotest.tools/v3/poll"
29 28
 	"gotest.tools/v3/skip"
30 29
 )
31 30
 
... ...
@@ -227,7 +226,6 @@ func TestAuthZPluginAllowEventStream(t *testing.T) {
227 227
 
228 228
 	// Create a container and wait for the creation events
229 229
 	cID := container.Run(ctx, t, c)
230
-	poll.WaitOn(t, container.IsInState(ctx, c, cID, "running"))
231 230
 
232 231
 	created := false
233 232
 	started := false