Browse code

Move containerIsStopped/containerIsInState to integration/internal/container

This fix moves helper functions containerIsStopped and
containerIsInState to integration/internal/container,
so that they could be used outside of integration/container.

Signed-off-by: Yong Tang <yong.tang.github@outlook.com>

Yong Tang authored on 2018/02/22 19:30:51
Showing 13 changed files
... ...
@@ -29,7 +29,7 @@ func TestDiffFilenameShownInOutput(t *testing.T) {
29 29
 	// a "Files/" prefix.
30 30
 	lookingFor := containertypes.ContainerChangeResponseItem{Kind: archive.ChangeAdd, Path: "/foo/bar"}
31 31
 	if testEnv.OSType == "windows" {
32
-		poll.WaitOn(t, containerIsInState(ctx, client, cID, "exited"), poll.WithDelay(100*time.Millisecond), poll.WithTimeout(60*time.Second))
32
+		poll.WaitOn(t, container.IsInState(ctx, client, cID, "exited"), poll.WithDelay(100*time.Millisecond), poll.WithTimeout(60*time.Second))
33 33
 		lookingFor = containertypes.ContainerChangeResponseItem{Kind: archive.ChangeModify, Path: "Files/foo/bar"}
34 34
 	}
35 35
 
... ...
@@ -30,7 +30,7 @@ func TestInspectCpusetInConfigPre120(t *testing.T) {
30 30
 			c.HostConfig.Resources.CpusetCpus = "0"
31 31
 		},
32 32
 	)
33
-	poll.WaitOn(t, containerIsInState(ctx, client, name, "exited"), poll.WithDelay(100*time.Millisecond))
33
+	poll.WaitOn(t, container.IsInState(ctx, client, name, "exited"), poll.WithDelay(100*time.Millisecond))
34 34
 
35 35
 	_, body, err := client.ContainerInspectWithRaw(ctx, name, false)
36 36
 	require.NoError(t, err)
... ...
@@ -23,11 +23,11 @@ func TestKillContainerInvalidSignal(t *testing.T) {
23 23
 
24 24
 	err := client.ContainerKill(ctx, id, "0")
25 25
 	require.EqualError(t, err, "Error response from daemon: Invalid signal: 0")
26
-	poll.WaitOn(t, containerIsInState(ctx, client, id, "running"), poll.WithDelay(100*time.Millisecond))
26
+	poll.WaitOn(t, container.IsInState(ctx, client, id, "running"), poll.WithDelay(100*time.Millisecond))
27 27
 
28 28
 	err = client.ContainerKill(ctx, id, "SIG42")
29 29
 	require.EqualError(t, err, "Error response from daemon: Invalid signal: SIG42")
30
-	poll.WaitOn(t, containerIsInState(ctx, client, id, "running"), poll.WithDelay(100*time.Millisecond))
30
+	poll.WaitOn(t, container.IsInState(ctx, client, id, "running"), poll.WithDelay(100*time.Millisecond))
31 31
 }
32 32
 
33 33
 func TestKillContainer(t *testing.T) {
... ...
@@ -64,7 +64,7 @@ func TestKillContainer(t *testing.T) {
64 64
 			err := client.ContainerKill(ctx, id, tc.signal)
65 65
 			require.NoError(t, err)
66 66
 
67
-			poll.WaitOn(t, containerIsInState(ctx, client, id, tc.status), poll.WithDelay(100*time.Millisecond))
67
+			poll.WaitOn(t, container.IsInState(ctx, client, id, tc.status), poll.WithDelay(100*time.Millisecond))
68 68
 		})
69 69
 	}
70 70
 }
... ...
@@ -104,7 +104,7 @@ func TestKillWithStopSignalAndRestartPolicies(t *testing.T) {
104 104
 			err := client.ContainerKill(ctx, id, "TERM")
105 105
 			require.NoError(t, err)
106 106
 
107
-			poll.WaitOn(t, containerIsInState(ctx, client, id, tc.status), poll.WithDelay(100*time.Millisecond))
107
+			poll.WaitOn(t, container.IsInState(ctx, client, id, tc.status), poll.WithDelay(100*time.Millisecond))
108 108
 		})
109 109
 	}
110 110
 }
... ...
@@ -141,11 +141,11 @@ func TestKillDifferentUserContainer(t *testing.T) {
141 141
 	id := container.Run(t, ctx, client, func(c *container.TestContainerConfig) {
142 142
 		c.Config.User = "daemon"
143 143
 	})
144
-	poll.WaitOn(t, containerIsInState(ctx, client, id, "running"), poll.WithDelay(100*time.Millisecond))
144
+	poll.WaitOn(t, container.IsInState(ctx, client, id, "running"), poll.WithDelay(100*time.Millisecond))
145 145
 
146 146
 	err := client.ContainerKill(ctx, id, "SIGKILL")
147 147
 	require.NoError(t, err)
148
-	poll.WaitOn(t, containerIsInState(ctx, client, id, "exited"), poll.WithDelay(100*time.Millisecond))
148
+	poll.WaitOn(t, container.IsInState(ctx, client, id, "exited"), poll.WithDelay(100*time.Millisecond))
149 149
 }
150 150
 
151 151
 func TestInspectOomKilledTrue(t *testing.T) {
... ...
@@ -160,7 +160,7 @@ func TestInspectOomKilledTrue(t *testing.T) {
160 160
 		c.HostConfig.Resources.Memory = 32 * 1024 * 1024
161 161
 	})
162 162
 
163
-	poll.WaitOn(t, containerIsInState(ctx, client, cID, "exited"), poll.WithDelay(100*time.Millisecond))
163
+	poll.WaitOn(t, container.IsInState(ctx, client, cID, "exited"), poll.WithDelay(100*time.Millisecond))
164 164
 
165 165
 	inspect, err := client.ContainerInspect(ctx, cID)
166 166
 	require.NoError(t, err)
... ...
@@ -177,7 +177,7 @@ func TestInspectOomKilledFalse(t *testing.T) {
177 177
 	name := "testoomkilled"
178 178
 	cID := container.Run(t, ctx, client, container.WithName(name), container.WithCmd("sh", "-c", "echo hello world"))
179 179
 
180
-	poll.WaitOn(t, containerIsInState(ctx, client, cID, "exited"), poll.WithDelay(100*time.Millisecond))
180
+	poll.WaitOn(t, container.IsInState(ctx, client, cID, "exited"), poll.WithDelay(100*time.Millisecond))
181 181
 
182 182
 	inspect, err := client.ContainerInspect(ctx, cID)
183 183
 	require.NoError(t, err)
... ...
@@ -31,7 +31,7 @@ func TestLinksEtcHostsContentMatch(t *testing.T) {
31 31
 
32 32
 	cID := container.Run(t, ctx, client, container.WithCmd("cat", "/etc/hosts"), container.WithNetworkMode("host"))
33 33
 
34
-	poll.WaitOn(t, containerIsStopped(ctx, client, cID), poll.WithDelay(100*time.Millisecond))
34
+	poll.WaitOn(t, container.IsStopped(ctx, client, cID), poll.WithDelay(100*time.Millisecond))
35 35
 
36 36
 	body, err := client.ContainerLogs(ctx, cID, types.ContainerLogsOptions{
37 37
 		ShowStdout: true,
... ...
@@ -69,7 +69,7 @@ func TestNetworkLoopbackNat(t *testing.T) {
69 69
 
70 70
 	cID := container.Run(t, ctx, client, container.WithCmd("sh", "-c", fmt.Sprintf("stty raw && nc -w 5 %s 8080", endpoint.String())), container.WithTty(true), container.WithNetworkMode("container:server"))
71 71
 
72
-	poll.WaitOn(t, containerIsStopped(ctx, client, cID), poll.WithDelay(100*time.Millisecond))
72
+	poll.WaitOn(t, container.IsStopped(ctx, client, cID), poll.WithDelay(100*time.Millisecond))
73 73
 
74 74
 	body, err := client.ContainerLogs(ctx, cID, types.ContainerLogsOptions{
75 75
 		ShowStdout: true,
... ...
@@ -98,7 +98,7 @@ func startServerContainer(t *testing.T, msg string, port int) string {
98 98
 		}
99 99
 	})
100 100
 
101
-	poll.WaitOn(t, containerIsInState(ctx, client, cID, "running"), poll.WithDelay(100*time.Millisecond))
101
+	poll.WaitOn(t, container.IsInState(ctx, client, cID, "running"), poll.WithDelay(100*time.Millisecond))
102 102
 
103 103
 	return cID
104 104
 }
... ...
@@ -27,7 +27,7 @@ func TestPause(t *testing.T) {
27 27
 
28 28
 	name := "testeventpause"
29 29
 	cID := container.Run(t, ctx, client, container.WithName(name))
30
-	poll.WaitOn(t, containerIsInState(ctx, client, cID, "running"), poll.WithDelay(100*time.Millisecond))
30
+	poll.WaitOn(t, container.IsInState(ctx, client, cID, "running"), poll.WithDelay(100*time.Millisecond))
31 31
 
32 32
 	since := request.DaemonUnixTime(ctx, t, client, testEnv)
33 33
 
... ...
@@ -59,7 +59,7 @@ func TestPauseFailsOnWindowsServerContainers(t *testing.T) {
59 59
 	ctx := context.Background()
60 60
 
61 61
 	cID := container.Run(t, ctx, client)
62
-	poll.WaitOn(t, containerIsInState(ctx, client, cID, "running"), poll.WithDelay(100*time.Millisecond))
62
+	poll.WaitOn(t, container.IsInState(ctx, client, cID, "running"), poll.WithDelay(100*time.Millisecond))
63 63
 
64 64
 	err := client.ContainerPause(ctx, cID)
65 65
 	testutil.ErrorContains(t, err, "cannot pause Windows Server Containers")
... ...
@@ -73,7 +73,7 @@ func TestPauseStopPausedContainer(t *testing.T) {
73 73
 	ctx := context.Background()
74 74
 
75 75
 	cID := container.Run(t, ctx, client)
76
-	poll.WaitOn(t, containerIsInState(ctx, client, cID, "running"), poll.WithDelay(100*time.Millisecond))
76
+	poll.WaitOn(t, container.IsInState(ctx, client, cID, "running"), poll.WithDelay(100*time.Millisecond))
77 77
 
78 78
 	err := client.ContainerPause(ctx, cID)
79 79
 	require.NoError(t, err)
... ...
@@ -81,7 +81,7 @@ func TestPauseStopPausedContainer(t *testing.T) {
81 81
 	err = client.ContainerStop(ctx, cID, nil)
82 82
 	require.NoError(t, err)
83 83
 
84
-	poll.WaitOn(t, containerIsStopped(ctx, client, cID), poll.WithDelay(100*time.Millisecond))
84
+	poll.WaitOn(t, container.IsStopped(ctx, client, cID), poll.WithDelay(100*time.Millisecond))
85 85
 }
86 86
 
87 87
 func getEventActions(t *testing.T, messages <-chan events.Message, errs <-chan error) []string {
... ...
@@ -51,7 +51,7 @@ func TestRenameStoppedContainer(t *testing.T) {
51 51
 
52 52
 	oldName := "first_name"
53 53
 	cID := container.Run(t, ctx, client, container.WithName(oldName), container.WithCmd("sh"))
54
-	poll.WaitOn(t, containerIsInState(ctx, client, cID, "exited"), poll.WithDelay(100*time.Millisecond))
54
+	poll.WaitOn(t, container.IsInState(ctx, client, cID, "exited"), poll.WithDelay(100*time.Millisecond))
55 55
 
56 56
 	inspect, err := client.ContainerInspect(ctx, cID)
57 57
 	require.NoError(t, err)
... ...
@@ -73,7 +73,7 @@ func TestRenameRunningContainerAndReuse(t *testing.T) {
73 73
 
74 74
 	oldName := "first_name"
75 75
 	cID := container.Run(t, ctx, client, container.WithName(oldName))
76
-	poll.WaitOn(t, containerIsInState(ctx, client, cID, "running"), poll.WithDelay(100*time.Millisecond))
76
+	poll.WaitOn(t, container.IsInState(ctx, client, cID, "running"), poll.WithDelay(100*time.Millisecond))
77 77
 
78 78
 	newName := "new_name" + stringid.GenerateNonCryptoID()
79 79
 	err := client.ContainerRename(ctx, oldName, newName)
... ...
@@ -87,7 +87,7 @@ func TestRenameRunningContainerAndReuse(t *testing.T) {
87 87
 	testutil.ErrorContains(t, err, "No such container: "+oldName)
88 88
 
89 89
 	cID = container.Run(t, ctx, client, container.WithName(oldName))
90
-	poll.WaitOn(t, containerIsInState(ctx, client, cID, "running"), poll.WithDelay(100*time.Millisecond))
90
+	poll.WaitOn(t, container.IsInState(ctx, client, cID, "running"), poll.WithDelay(100*time.Millisecond))
91 91
 
92 92
 	inspect, err = client.ContainerInspect(ctx, cID)
93 93
 	require.NoError(t, err)
... ...
@@ -101,7 +101,7 @@ func TestRenameInvalidName(t *testing.T) {
101 101
 
102 102
 	oldName := "first_name"
103 103
 	cID := container.Run(t, ctx, client, container.WithName(oldName))
104
-	poll.WaitOn(t, containerIsInState(ctx, client, cID, "running"), poll.WithDelay(100*time.Millisecond))
104
+	poll.WaitOn(t, container.IsInState(ctx, client, cID, "running"), poll.WithDelay(100*time.Millisecond))
105 105
 
106 106
 	err := client.ContainerRename(ctx, oldName, "new:invalid")
107 107
 	testutil.ErrorContains(t, err, "Invalid container name")
... ...
@@ -136,7 +136,7 @@ func TestRenameAnonymousContainer(t *testing.T) {
136 136
 	err = client.ContainerStart(ctx, "container1", types.ContainerStartOptions{})
137 137
 	require.NoError(t, err)
138 138
 
139
-	poll.WaitOn(t, containerIsInState(ctx, client, cID, "running"), poll.WithDelay(100*time.Millisecond))
139
+	poll.WaitOn(t, container.IsInState(ctx, client, cID, "running"), poll.WithDelay(100*time.Millisecond))
140 140
 
141 141
 	count := "-c"
142 142
 	if testEnv.OSType == "windows" {
... ...
@@ -148,7 +148,7 @@ func TestRenameAnonymousContainer(t *testing.T) {
148 148
 		}
149 149
 		c.HostConfig.NetworkMode = "network1"
150 150
 	}, container.WithCmd("ping", count, "1", "container1"))
151
-	poll.WaitOn(t, containerIsInState(ctx, client, cID, "exited"), poll.WithDelay(100*time.Millisecond))
151
+	poll.WaitOn(t, container.IsInState(ctx, client, cID, "exited"), poll.WithDelay(100*time.Millisecond))
152 152
 
153 153
 	inspect, err := client.ContainerInspect(ctx, cID)
154 154
 	require.NoError(t, err)
... ...
@@ -162,7 +162,7 @@ func TestRenameContainerWithSameName(t *testing.T) {
162 162
 	client := request.NewAPIClient(t)
163 163
 
164 164
 	cID := container.Run(t, ctx, client, container.WithName("old"))
165
-	poll.WaitOn(t, containerIsInState(ctx, client, cID, "running"), poll.WithDelay(100*time.Millisecond))
165
+	poll.WaitOn(t, container.IsInState(ctx, client, cID, "running"), poll.WithDelay(100*time.Millisecond))
166 166
 	err := client.ContainerRename(ctx, "old", "old")
167 167
 	testutil.ErrorContains(t, err, "Renaming a container with the same name")
168 168
 	err = client.ContainerRename(ctx, cID, "old")
... ...
@@ -182,10 +182,10 @@ func TestRenameContainerWithLinkedContainer(t *testing.T) {
182 182
 	client := request.NewAPIClient(t)
183 183
 
184 184
 	db1ID := container.Run(t, ctx, client, container.WithName("db1"))
185
-	poll.WaitOn(t, containerIsInState(ctx, client, db1ID, "running"), poll.WithDelay(100*time.Millisecond))
185
+	poll.WaitOn(t, container.IsInState(ctx, client, db1ID, "running"), poll.WithDelay(100*time.Millisecond))
186 186
 
187 187
 	app1ID := container.Run(t, ctx, client, container.WithName("app1"), container.WithLinks("db1:/mysql"))
188
-	poll.WaitOn(t, containerIsInState(ctx, client, app1ID, "running"), poll.WithDelay(100*time.Millisecond))
188
+	poll.WaitOn(t, container.IsInState(ctx, client, app1ID, "running"), poll.WithDelay(100*time.Millisecond))
189 189
 
190 190
 	err := client.ContainerRename(ctx, "app1", "app2")
191 191
 	require.NoError(t, err)
... ...
@@ -23,7 +23,7 @@ func TestResize(t *testing.T) {
23 23
 
24 24
 	cID := container.Run(t, ctx, client)
25 25
 
26
-	poll.WaitOn(t, containerIsInState(ctx, client, cID, "running"), poll.WithDelay(100*time.Millisecond))
26
+	poll.WaitOn(t, container.IsInState(ctx, client, cID, "running"), poll.WithDelay(100*time.Millisecond))
27 27
 
28 28
 	err := client.ContainerResize(ctx, cID, types.ResizeOptions{
29 29
 		Height: 40,
... ...
@@ -39,7 +39,7 @@ func TestResizeWithInvalidSize(t *testing.T) {
39 39
 
40 40
 	cID := container.Run(t, ctx, client)
41 41
 
42
-	poll.WaitOn(t, containerIsInState(ctx, client, cID, "running"), poll.WithDelay(100*time.Millisecond))
42
+	poll.WaitOn(t, container.IsInState(ctx, client, cID, "running"), poll.WithDelay(100*time.Millisecond))
43 43
 
44 44
 	endpoint := "/containers/" + cID + "/resize?h=foo&w=bar"
45 45
 	res, _, err := req.Post(endpoint)
... ...
@@ -54,7 +54,7 @@ func TestResizeWhenContainerNotStarted(t *testing.T) {
54 54
 
55 55
 	cID := container.Run(t, ctx, client, container.WithCmd("echo"))
56 56
 
57
-	poll.WaitOn(t, containerIsInState(ctx, client, cID, "exited"), poll.WithDelay(100*time.Millisecond))
57
+	poll.WaitOn(t, container.IsInState(ctx, client, cID, "exited"), poll.WithDelay(100*time.Millisecond))
58 58
 
59 59
 	err := client.ContainerResize(ctx, cID, types.ResizeOptions{
60 60
 		Height: 40,
... ...
@@ -28,7 +28,7 @@ func TestStats(t *testing.T) {
28 28
 
29 29
 	cID := container.Run(t, ctx, client)
30 30
 
31
-	poll.WaitOn(t, containerIsInState(ctx, client, cID, "running"), poll.WithDelay(100*time.Millisecond))
31
+	poll.WaitOn(t, container.IsInState(ctx, client, cID, "running"), poll.WithDelay(100*time.Millisecond))
32 32
 
33 33
 	resp, err := client.ContainerStats(ctx, cID, false)
34 34
 	require.NoError(t, err)
... ...
@@ -8,7 +8,6 @@ import (
8 8
 	"time"
9 9
 
10 10
 	"github.com/docker/docker/api/types"
11
-	"github.com/docker/docker/client"
12 11
 	"github.com/docker/docker/integration/internal/container"
13 12
 	"github.com/docker/docker/integration/internal/request"
14 13
 	"github.com/gotestyourself/gotestyourself/icmd"
... ...
@@ -30,7 +29,7 @@ func TestStopContainerWithRestartPolicyAlways(t *testing.T) {
30 30
 	}
31 31
 
32 32
 	for _, name := range names {
33
-		poll.WaitOn(t, containerIsInState(ctx, client, name, "running", "restarting"), poll.WithDelay(100*time.Millisecond))
33
+		poll.WaitOn(t, container.IsInState(ctx, client, name, "running", "restarting"), poll.WithDelay(100*time.Millisecond))
34 34
 	}
35 35
 
36 36
 	for _, name := range names {
... ...
@@ -39,7 +38,7 @@ func TestStopContainerWithRestartPolicyAlways(t *testing.T) {
39 39
 	}
40 40
 
41 41
 	for _, name := range names {
42
-		poll.WaitOn(t, containerIsStopped(ctx, client, name), poll.WithDelay(100*time.Millisecond))
42
+		poll.WaitOn(t, container.IsStopped(ctx, client, name), poll.WithDelay(100*time.Millisecond))
43 43
 	}
44 44
 }
45 45
 
... ...
@@ -52,7 +51,7 @@ func TestDeleteDevicemapper(t *testing.T) {
52 52
 
53 53
 	id := container.Run(t, ctx, client, container.WithName("foo"), container.WithCmd("echo"))
54 54
 
55
-	poll.WaitOn(t, containerIsStopped(ctx, client, id), poll.WithDelay(100*time.Millisecond))
55
+	poll.WaitOn(t, container.IsStopped(ctx, client, id), poll.WithDelay(100*time.Millisecond))
56 56
 
57 57
 	inspect, err := client.ContainerInspect(ctx, id)
58 58
 	require.NoError(t, err)
... ...
@@ -70,33 +69,3 @@ func TestDeleteDevicemapper(t *testing.T) {
70 70
 	err = client.ContainerRemove(ctx, id, types.ContainerRemoveOptions{})
71 71
 	require.NoError(t, err)
72 72
 }
73
-
74
-func containerIsStopped(ctx context.Context, client client.APIClient, containerID string) func(log poll.LogT) poll.Result {
75
-	return func(log poll.LogT) poll.Result {
76
-		inspect, err := client.ContainerInspect(ctx, containerID)
77
-
78
-		switch {
79
-		case err != nil:
80
-			return poll.Error(err)
81
-		case !inspect.State.Running:
82
-			return poll.Success()
83
-		default:
84
-			return poll.Continue("waiting for container to be stopped")
85
-		}
86
-	}
87
-}
88
-
89
-func containerIsInState(ctx context.Context, client client.APIClient, containerID string, state ...string) func(log poll.LogT) poll.Result {
90
-	return func(log poll.LogT) poll.Result {
91
-		inspect, err := client.ContainerInspect(ctx, containerID)
92
-		if err != nil {
93
-			return poll.Error(err)
94
-		}
95
-		for _, v := range state {
96
-			if inspect.State.Status == v {
97
-				return poll.Success()
98
-			}
99
-		}
100
-		return poll.Continue("waiting for container to be running, currently %s", inspect.State.Status)
101
-	}
102
-}
... ...
@@ -31,7 +31,7 @@ func TestUpdateMemory(t *testing.T) {
31 31
 		}
32 32
 	})
33 33
 
34
-	poll.WaitOn(t, containerIsInState(ctx, client, cID, "running"), poll.WithDelay(100*time.Millisecond))
34
+	poll.WaitOn(t, container.IsInState(ctx, client, cID, "running"), poll.WithDelay(100*time.Millisecond))
35 35
 
36 36
 	const (
37 37
 		setMemory     int64 = 314572800
... ...
@@ -39,7 +39,7 @@ func TestUpdateRestartPolicy(t *testing.T) {
39 39
 		timeout = 180 * time.Second
40 40
 	}
41 41
 
42
-	poll.WaitOn(t, containerIsInState(ctx, client, cID, "exited"), poll.WithDelay(100*time.Millisecond), poll.WithTimeout(timeout))
42
+	poll.WaitOn(t, container.IsInState(ctx, client, cID, "exited"), poll.WithDelay(100*time.Millisecond), poll.WithTimeout(timeout))
43 43
 
44 44
 	inspect, err := client.ContainerInspect(ctx, cID)
45 45
 	require.NoError(t, err)
46 46
new file mode 100644
... ...
@@ -0,0 +1,41 @@
0
+package container
1
+
2
+import (
3
+	"strings"
4
+
5
+	"github.com/docker/docker/client"
6
+	"github.com/gotestyourself/gotestyourself/poll"
7
+	"golang.org/x/net/context"
8
+)
9
+
10
+// IsStopped verifies the container is in stopped state.
11
+func IsStopped(ctx context.Context, client client.APIClient, containerID string) func(log poll.LogT) poll.Result {
12
+	return func(log poll.LogT) poll.Result {
13
+		inspect, err := client.ContainerInspect(ctx, containerID)
14
+
15
+		switch {
16
+		case err != nil:
17
+			return poll.Error(err)
18
+		case !inspect.State.Running:
19
+			return poll.Success()
20
+		default:
21
+			return poll.Continue("waiting for container to be stopped")
22
+		}
23
+	}
24
+}
25
+
26
+// IsInState verifies the container is in one of the specified state, e.g., "running", "exited", etc.
27
+func IsInState(ctx context.Context, client client.APIClient, containerID string, state ...string) func(log poll.LogT) poll.Result {
28
+	return func(log poll.LogT) poll.Result {
29
+		inspect, err := client.ContainerInspect(ctx, containerID)
30
+		if err != nil {
31
+			return poll.Error(err)
32
+		}
33
+		for _, v := range state {
34
+			if inspect.State.Status == v {
35
+				return poll.Success()
36
+			}
37
+		}
38
+		return poll.Continue("waiting for container to be one of (%s), currently %s", strings.Join(state, ", "), inspect.State.Status)
39
+	}
40
+}