Signed-off-by: Christopher Crone <christopher.crone@docker.com>
Christopher Crone authored on 2017/09/09 00:16:15... | ... |
@@ -81,6 +81,7 @@ func (s *DockerSuite) TestAPINetworkInspect(c *check.C) { |
81 | 81 |
// Inspect default bridge network |
82 | 82 |
nr := getNetworkResource(c, "bridge") |
83 | 83 |
c.Assert(nr.Name, checker.Equals, "bridge") |
84 |
+ connCount := len(nr.Containers) |
|
84 | 85 |
|
85 | 86 |
// run a container and attach it to the default bridge network |
86 | 87 |
out, _ := dockerCmd(c, "run", "-d", "--name", "test", "busybox", "top") |
... | ... |
@@ -94,7 +95,7 @@ func (s *DockerSuite) TestAPINetworkInspect(c *check.C) { |
94 | 94 |
c.Assert(nr.Internal, checker.Equals, false) |
95 | 95 |
c.Assert(nr.EnableIPv6, checker.Equals, false) |
96 | 96 |
c.Assert(nr.IPAM.Driver, checker.Equals, "default") |
97 |
- c.Assert(len(nr.Containers), checker.Equals, 1) |
|
97 |
+ c.Assert(len(nr.Containers), checker.Equals, connCount+1) |
|
98 | 98 |
c.Assert(nr.Containers[containerID], checker.NotNil) |
99 | 99 |
|
100 | 100 |
ip, _, err := net.ParseCIDR(nr.Containers[containerID].IPv4Address) |
... | ... |
@@ -291,9 +292,16 @@ func getNetworkIDByName(c *check.C, name string) string { |
291 | 291 |
nJSON := []types.NetworkResource{} |
292 | 292 |
err = json.NewDecoder(body).Decode(&nJSON) |
293 | 293 |
c.Assert(err, checker.IsNil) |
294 |
- c.Assert(len(nJSON), checker.Equals, 1) |
|
294 |
+ var res string |
|
295 |
+ for _, n := range nJSON { |
|
296 |
+ // Find exact match |
|
297 |
+ if n.Name == name { |
|
298 |
+ res = n.ID |
|
299 |
+ } |
|
300 |
+ } |
|
301 |
+ c.Assert(res, checker.Not(checker.Equals), "") |
|
295 | 302 |
|
296 |
- return nJSON[0].ID |
|
303 |
+ return res |
|
297 | 304 |
} |
298 | 305 |
|
299 | 306 |
func getNetworkResource(c *check.C, id string) *types.NetworkResource { |
... | ... |
@@ -47,6 +47,9 @@ func (s *DockerAuthzV2Suite) TearDownTest(c *check.C) { |
47 | 47 |
|
48 | 48 |
func (s *DockerAuthzV2Suite) TestAuthZPluginAllowNonVolumeRequest(c *check.C) { |
49 | 49 |
testRequires(c, DaemonIsLinux, IsAmd64, Network) |
50 |
+ |
|
51 |
+ existingContainers := ExistingContainerIDs(c) |
|
52 |
+ |
|
50 | 53 |
// Install authz plugin |
51 | 54 |
_, err := s.d.Cmd("plugin", "install", "--grant-all-permissions", authzPluginNameWithTag) |
52 | 55 |
c.Assert(err, checker.IsNil) |
... | ... |
@@ -72,7 +75,7 @@ func (s *DockerAuthzV2Suite) TestAuthZPluginAllowNonVolumeRequest(c *check.C) { |
72 | 72 |
|
73 | 73 |
out, err = s.d.Cmd("ps") |
74 | 74 |
c.Assert(err, check.IsNil) |
75 |
- c.Assert(assertContainerList(out, []string{id}), check.Equals, true) |
|
75 |
+ c.Assert(assertContainerList(RemoveOutputForExistingElements(out, existingContainers), []string{id}), check.Equals, true) |
|
76 | 76 |
} |
77 | 77 |
|
78 | 78 |
func (s *DockerAuthzV2Suite) TestAuthZPluginDisable(c *check.C) { |
... | ... |
@@ -204,6 +204,8 @@ func (s *DockerAuthzSuite) TearDownSuite(c *check.C) { |
204 | 204 |
} |
205 | 205 |
|
206 | 206 |
func (s *DockerAuthzSuite) TestAuthZPluginAllowRequest(c *check.C) { |
207 |
+ existingContainers := ExistingContainerIDs(c) |
|
208 |
+ |
|
207 | 209 |
// start the daemon and load busybox, --net=none build fails otherwise |
208 | 210 |
// cause it needs to pull busybox |
209 | 211 |
s.d.Start(c, "--authorization-plugin="+testAuthZPlugin) |
... | ... |
@@ -221,7 +223,7 @@ func (s *DockerAuthzSuite) TestAuthZPluginAllowRequest(c *check.C) { |
221 | 221 |
|
222 | 222 |
out, err = s.d.Cmd("ps") |
223 | 223 |
c.Assert(err, check.IsNil) |
224 |
- c.Assert(assertContainerList(out, []string{id}), check.Equals, true) |
|
224 |
+ c.Assert(assertContainerList(RemoveOutputForExistingElements(out, existingContainers), []string{id}), check.Equals, true) |
|
225 | 225 |
c.Assert(s.ctrl.psRequestCnt, check.Equals, 1) |
226 | 226 |
c.Assert(s.ctrl.psResponseCnt, check.Equals, 1) |
227 | 227 |
} |
... | ... |
@@ -407,6 +407,8 @@ func (s *DockerRegistrySuite) TestInspectImageWithDigests(c *check.C) { |
407 | 407 |
} |
408 | 408 |
|
409 | 409 |
func (s *DockerRegistrySuite) TestPsListContainersFilterAncestorImageByDigest(c *check.C) { |
410 |
+ existingContainers := ExistingContainerIDs(c) |
|
411 |
+ |
|
410 | 412 |
digest, err := setupImage(c) |
411 | 413 |
c.Assert(err, checker.IsNil, check.Commentf("error setting up image")) |
412 | 414 |
|
... | ... |
@@ -438,7 +440,7 @@ func (s *DockerRegistrySuite) TestPsListContainersFilterAncestorImageByDigest(c |
438 | 438 |
|
439 | 439 |
// Valid imageReference |
440 | 440 |
out, _ = dockerCmd(c, "ps", "-a", "-q", "--no-trunc", "--filter=ancestor="+imageReference) |
441 |
- checkPsAncestorFilterOutput(c, out, imageReference, expectedIDs) |
|
441 |
+ checkPsAncestorFilterOutput(c, RemoveOutputForExistingElements(out, existingContainers), imageReference, expectedIDs) |
|
442 | 442 |
} |
443 | 443 |
|
444 | 444 |
func (s *DockerRegistrySuite) TestDeleteImageByIDOnlyPulledByDigest(c *check.C) { |
... | ... |
@@ -39,6 +39,8 @@ func getHealth(c *check.C, name string) *types.Health { |
39 | 39 |
func (s *DockerSuite) TestHealth(c *check.C) { |
40 | 40 |
testRequires(c, DaemonIsLinux) // busybox doesn't work on Windows |
41 | 41 |
|
42 |
+ existingContainers := ExistingContainerNames(c) |
|
43 |
+ |
|
42 | 44 |
imageName := "testhealth" |
43 | 45 |
buildImageSuccessfully(c, imageName, build.WithDockerfile(`FROM busybox |
44 | 46 |
RUN echo OK > /status |
... | ... |
@@ -51,6 +53,7 @@ func (s *DockerSuite) TestHealth(c *check.C) { |
51 | 51 |
name := "test_health" |
52 | 52 |
dockerCmd(c, "create", "--name", name, imageName) |
53 | 53 |
out, _ := dockerCmd(c, "ps", "-a", "--format={{.Status}}") |
54 |
+ out = RemoveOutputForExistingElements(out, existingContainers) |
|
54 | 55 |
c.Check(out, checker.Equals, "Created\n") |
55 | 56 |
|
56 | 57 |
// Inspect the options |
... | ... |
@@ -135,42 +135,48 @@ func (s *DockerSuite) TestInfoDiscoveryAdvertiseInterfaceName(c *check.C) { |
135 | 135 |
func (s *DockerSuite) TestInfoDisplaysRunningContainers(c *check.C) { |
136 | 136 |
testRequires(c, DaemonIsLinux) |
137 | 137 |
|
138 |
+ existing := existingContainerStates(c) |
|
139 |
+ |
|
138 | 140 |
dockerCmd(c, "run", "-d", "busybox", "top") |
139 | 141 |
out, _ := dockerCmd(c, "info") |
140 |
- c.Assert(out, checker.Contains, fmt.Sprintf("Containers: %d\n", 1)) |
|
141 |
- c.Assert(out, checker.Contains, fmt.Sprintf(" Running: %d\n", 1)) |
|
142 |
- c.Assert(out, checker.Contains, fmt.Sprintf(" Paused: %d\n", 0)) |
|
143 |
- c.Assert(out, checker.Contains, fmt.Sprintf(" Stopped: %d\n", 0)) |
|
142 |
+ c.Assert(out, checker.Contains, fmt.Sprintf("Containers: %d\n", existing["Containers"]+1)) |
|
143 |
+ c.Assert(out, checker.Contains, fmt.Sprintf(" Running: %d\n", existing["ContainersRunning"]+1)) |
|
144 |
+ c.Assert(out, checker.Contains, fmt.Sprintf(" Paused: %d\n", existing["ContainersPaused"])) |
|
145 |
+ c.Assert(out, checker.Contains, fmt.Sprintf(" Stopped: %d\n", existing["ContainersStopped"])) |
|
144 | 146 |
} |
145 | 147 |
|
146 | 148 |
func (s *DockerSuite) TestInfoDisplaysPausedContainers(c *check.C) { |
147 | 149 |
testRequires(c, IsPausable) |
148 | 150 |
|
151 |
+ existing := existingContainerStates(c) |
|
152 |
+ |
|
149 | 153 |
out := runSleepingContainer(c, "-d") |
150 | 154 |
cleanedContainerID := strings.TrimSpace(out) |
151 | 155 |
|
152 | 156 |
dockerCmd(c, "pause", cleanedContainerID) |
153 | 157 |
|
154 | 158 |
out, _ = dockerCmd(c, "info") |
155 |
- c.Assert(out, checker.Contains, fmt.Sprintf("Containers: %d\n", 1)) |
|
156 |
- c.Assert(out, checker.Contains, fmt.Sprintf(" Running: %d\n", 0)) |
|
157 |
- c.Assert(out, checker.Contains, fmt.Sprintf(" Paused: %d\n", 1)) |
|
158 |
- c.Assert(out, checker.Contains, fmt.Sprintf(" Stopped: %d\n", 0)) |
|
159 |
+ c.Assert(out, checker.Contains, fmt.Sprintf("Containers: %d\n", existing["Containers"]+1)) |
|
160 |
+ c.Assert(out, checker.Contains, fmt.Sprintf(" Running: %d\n", existing["ContainersRunning"])) |
|
161 |
+ c.Assert(out, checker.Contains, fmt.Sprintf(" Paused: %d\n", existing["ContainersPaused"]+1)) |
|
162 |
+ c.Assert(out, checker.Contains, fmt.Sprintf(" Stopped: %d\n", existing["ContainersStopped"])) |
|
159 | 163 |
} |
160 | 164 |
|
161 | 165 |
func (s *DockerSuite) TestInfoDisplaysStoppedContainers(c *check.C) { |
162 | 166 |
testRequires(c, DaemonIsLinux) |
163 | 167 |
|
168 |
+ existing := existingContainerStates(c) |
|
169 |
+ |
|
164 | 170 |
out, _ := dockerCmd(c, "run", "-d", "busybox", "top") |
165 | 171 |
cleanedContainerID := strings.TrimSpace(out) |
166 | 172 |
|
167 | 173 |
dockerCmd(c, "stop", cleanedContainerID) |
168 | 174 |
|
169 | 175 |
out, _ = dockerCmd(c, "info") |
170 |
- c.Assert(out, checker.Contains, fmt.Sprintf("Containers: %d\n", 1)) |
|
171 |
- c.Assert(out, checker.Contains, fmt.Sprintf(" Running: %d\n", 0)) |
|
172 |
- c.Assert(out, checker.Contains, fmt.Sprintf(" Paused: %d\n", 0)) |
|
173 |
- c.Assert(out, checker.Contains, fmt.Sprintf(" Stopped: %d\n", 1)) |
|
176 |
+ c.Assert(out, checker.Contains, fmt.Sprintf("Containers: %d\n", existing["Containers"]+1)) |
|
177 |
+ c.Assert(out, checker.Contains, fmt.Sprintf(" Running: %d\n", existing["ContainersRunning"])) |
|
178 |
+ c.Assert(out, checker.Contains, fmt.Sprintf(" Paused: %d\n", existing["ContainersPaused"])) |
|
179 |
+ c.Assert(out, checker.Contains, fmt.Sprintf(" Stopped: %d\n", existing["ContainersStopped"]+1)) |
|
174 | 180 |
} |
175 | 181 |
|
176 | 182 |
func (s *DockerSuite) TestInfoDebug(c *check.C) { |
... | ... |
@@ -237,3 +243,16 @@ func (s *DockerDaemonSuite) TestInfoLabels(c *check.C) { |
237 | 237 |
c.Assert(err, checker.IsNil) |
238 | 238 |
c.Assert(out, checker.Contains, "WARNING: labels with duplicate keys and conflicting values have been deprecated") |
239 | 239 |
} |
240 |
+ |
|
241 |
+func existingContainerStates(c *check.C) map[string]int { |
|
242 |
+ out, _ := dockerCmd(c, "info", "--format", "{{json .}}") |
|
243 |
+ var m map[string]interface{} |
|
244 |
+ err := json.Unmarshal([]byte(out), &m) |
|
245 |
+ c.Assert(err, checker.IsNil) |
|
246 |
+ res := map[string]int{} |
|
247 |
+ res["Containers"] = int(m["Containers"].(float64)) |
|
248 |
+ res["ContainersRunning"] = int(m["ContainersRunning"].(float64)) |
|
249 |
+ res["ContainersPaused"] = int(m["ContainersPaused"].(float64)) |
|
250 |
+ res["ContainersStopped"] = int(m["ContainersStopped"].(float64)) |
|
251 |
+ return res |
|
252 |
+} |
... | ... |
@@ -5,6 +5,7 @@ import ( |
5 | 5 |
"net" |
6 | 6 |
"regexp" |
7 | 7 |
"sort" |
8 |
+ "strconv" |
|
8 | 9 |
"strings" |
9 | 10 |
|
10 | 11 |
"github.com/docker/docker/integration-cli/checker" |
... | ... |
@@ -148,9 +149,7 @@ func (s *DockerSuite) TestPortList(c *check.C) { |
148 | 148 |
|
149 | 149 |
out, _ = dockerCmd(c, "port", ID) |
150 | 150 |
|
151 |
- err = assertPortList(c, out, []string{ |
|
152 |
- "80/tcp -> 0.0.0.0:8000", |
|
153 |
- "80/udp -> 0.0.0.0:8000"}) |
|
151 |
+ err = assertPortRange(c, out, []int{8000, 8080}, []int{8000, 8080}) |
|
154 | 152 |
// Port list is not correct |
155 | 153 |
c.Assert(err, checker.IsNil) |
156 | 154 |
dockerCmd(c, "rm", "-f", ID) |
... | ... |
@@ -173,6 +172,38 @@ func assertPortList(c *check.C, out string, expected []string) error { |
173 | 173 |
return nil |
174 | 174 |
} |
175 | 175 |
|
176 |
+func assertPortRange(c *check.C, out string, expectedTcp, expectedUdp []int) error { |
|
177 |
+ lines := strings.Split(strings.Trim(out, "\n "), "\n") |
|
178 |
+ |
|
179 |
+ var validTcp, validUdp bool |
|
180 |
+ for _, l := range lines { |
|
181 |
+ // 80/tcp -> 0.0.0.0:8015 |
|
182 |
+ port, err := strconv.Atoi(strings.Split(l, ":")[1]) |
|
183 |
+ if err != nil { |
|
184 |
+ return err |
|
185 |
+ } |
|
186 |
+ if strings.Contains(l, "tcp") && expectedTcp != nil { |
|
187 |
+ if port < expectedTcp[0] || port > expectedTcp[1] { |
|
188 |
+ return fmt.Errorf("tcp port (%d) not in range expected range %d-%d", port, expectedTcp[0], expectedTcp[1]) |
|
189 |
+ } |
|
190 |
+ validTcp = true |
|
191 |
+ } |
|
192 |
+ if strings.Contains(l, "udp") && expectedUdp != nil { |
|
193 |
+ if port < expectedUdp[0] || port > expectedUdp[1] { |
|
194 |
+ return fmt.Errorf("udp port (%d) not in range expected range %d-%d", port, expectedUdp[0], expectedUdp[1]) |
|
195 |
+ } |
|
196 |
+ validUdp = true |
|
197 |
+ } |
|
198 |
+ } |
|
199 |
+ if !validTcp { |
|
200 |
+ return fmt.Errorf("tcp port not found") |
|
201 |
+ } |
|
202 |
+ if !validUdp { |
|
203 |
+ return fmt.Errorf("udp port not found") |
|
204 |
+ } |
|
205 |
+ return nil |
|
206 |
+} |
|
207 |
+ |
|
176 | 208 |
func stopRemoveContainer(id string, c *check.C) { |
177 | 209 |
dockerCmd(c, "rm", "-f", id) |
178 | 210 |
} |
... | ... |
@@ -19,6 +19,8 @@ import ( |
19 | 19 |
) |
20 | 20 |
|
21 | 21 |
func (s *DockerSuite) TestPsListContainersBase(c *check.C) { |
22 |
+ existingContainers := ExistingContainerIDs(c) |
|
23 |
+ |
|
22 | 24 |
out := runSleepingContainer(c, "-d") |
23 | 25 |
firstID := strings.TrimSpace(out) |
24 | 26 |
|
... | ... |
@@ -43,79 +45,79 @@ func (s *DockerSuite) TestPsListContainersBase(c *check.C) { |
43 | 43 |
|
44 | 44 |
// all |
45 | 45 |
out, _ = dockerCmd(c, "ps", "-a") |
46 |
- c.Assert(assertContainerList(out, []string{fourthID, thirdID, secondID, firstID}), checker.Equals, true, check.Commentf("ALL: Container list is not in the correct order: \n%s", out)) |
|
46 |
+ c.Assert(assertContainerList(RemoveOutputForExistingElements(out, existingContainers), []string{fourthID, thirdID, secondID, firstID}), checker.Equals, true, check.Commentf("ALL: Container list is not in the correct order: \n%s", out)) |
|
47 | 47 |
|
48 | 48 |
// running |
49 | 49 |
out, _ = dockerCmd(c, "ps") |
50 |
- c.Assert(assertContainerList(out, []string{fourthID, secondID, firstID}), checker.Equals, true, check.Commentf("RUNNING: Container list is not in the correct order: \n%s", out)) |
|
50 |
+ c.Assert(assertContainerList(RemoveOutputForExistingElements(out, existingContainers), []string{fourthID, secondID, firstID}), checker.Equals, true, check.Commentf("RUNNING: Container list is not in the correct order: \n%s", out)) |
|
51 | 51 |
|
52 | 52 |
// limit |
53 | 53 |
out, _ = dockerCmd(c, "ps", "-n=2", "-a") |
54 | 54 |
expected := []string{fourthID, thirdID} |
55 |
- c.Assert(assertContainerList(out, expected), checker.Equals, true, check.Commentf("LIMIT & ALL: Container list is not in the correct order: \n%s", out)) |
|
55 |
+ c.Assert(assertContainerList(RemoveOutputForExistingElements(out, existingContainers), expected), checker.Equals, true, check.Commentf("LIMIT & ALL: Container list is not in the correct order: \n%s", out)) |
|
56 | 56 |
|
57 | 57 |
out, _ = dockerCmd(c, "ps", "-n=2") |
58 |
- c.Assert(assertContainerList(out, expected), checker.Equals, true, check.Commentf("LIMIT: Container list is not in the correct order: \n%s", out)) |
|
58 |
+ c.Assert(assertContainerList(RemoveOutputForExistingElements(out, existingContainers), expected), checker.Equals, true, check.Commentf("LIMIT: Container list is not in the correct order: \n%s", out)) |
|
59 | 59 |
|
60 | 60 |
// filter since |
61 | 61 |
out, _ = dockerCmd(c, "ps", "-f", "since="+firstID, "-a") |
62 | 62 |
expected = []string{fourthID, thirdID, secondID} |
63 |
- c.Assert(assertContainerList(out, expected), checker.Equals, true, check.Commentf("SINCE filter & ALL: Container list is not in the correct order: \n%s", out)) |
|
63 |
+ c.Assert(assertContainerList(RemoveOutputForExistingElements(out, existingContainers), expected), checker.Equals, true, check.Commentf("SINCE filter & ALL: Container list is not in the correct order: \n%s", out)) |
|
64 | 64 |
|
65 | 65 |
out, _ = dockerCmd(c, "ps", "-f", "since="+firstID) |
66 | 66 |
expected = []string{fourthID, secondID} |
67 |
- c.Assert(assertContainerList(out, expected), checker.Equals, true, check.Commentf("SINCE filter: Container list is not in the correct order: \n%s", out)) |
|
67 |
+ c.Assert(assertContainerList(RemoveOutputForExistingElements(out, existingContainers), expected), checker.Equals, true, check.Commentf("SINCE filter: Container list is not in the correct order: \n%s", out)) |
|
68 | 68 |
|
69 | 69 |
out, _ = dockerCmd(c, "ps", "-f", "since="+thirdID) |
70 | 70 |
expected = []string{fourthID} |
71 |
- c.Assert(assertContainerList(out, expected), checker.Equals, true, check.Commentf("SINCE filter: Container list is not in the correct order: \n%s", out)) |
|
71 |
+ c.Assert(assertContainerList(RemoveOutputForExistingElements(out, existingContainers), expected), checker.Equals, true, check.Commentf("SINCE filter: Container list is not in the correct order: \n%s", out)) |
|
72 | 72 |
|
73 | 73 |
// filter before |
74 | 74 |
out, _ = dockerCmd(c, "ps", "-f", "before="+fourthID, "-a") |
75 | 75 |
expected = []string{thirdID, secondID, firstID} |
76 |
- c.Assert(assertContainerList(out, expected), checker.Equals, true, check.Commentf("BEFORE filter & ALL: Container list is not in the correct order: \n%s", out)) |
|
76 |
+ c.Assert(assertContainerList(RemoveOutputForExistingElements(out, existingContainers), expected), checker.Equals, true, check.Commentf("BEFORE filter & ALL: Container list is not in the correct order: \n%s", out)) |
|
77 | 77 |
|
78 | 78 |
out, _ = dockerCmd(c, "ps", "-f", "before="+fourthID) |
79 | 79 |
expected = []string{secondID, firstID} |
80 |
- c.Assert(assertContainerList(out, expected), checker.Equals, true, check.Commentf("BEFORE filter: Container list is not in the correct order: \n%s", out)) |
|
80 |
+ c.Assert(assertContainerList(RemoveOutputForExistingElements(out, existingContainers), expected), checker.Equals, true, check.Commentf("BEFORE filter: Container list is not in the correct order: \n%s", out)) |
|
81 | 81 |
|
82 | 82 |
out, _ = dockerCmd(c, "ps", "-f", "before="+thirdID) |
83 | 83 |
expected = []string{secondID, firstID} |
84 |
- c.Assert(assertContainerList(out, expected), checker.Equals, true, check.Commentf("SINCE filter: Container list is not in the correct order: \n%s", out)) |
|
84 |
+ c.Assert(assertContainerList(RemoveOutputForExistingElements(out, existingContainers), expected), checker.Equals, true, check.Commentf("SINCE filter: Container list is not in the correct order: \n%s", out)) |
|
85 | 85 |
|
86 | 86 |
// filter since & before |
87 | 87 |
out, _ = dockerCmd(c, "ps", "-f", "since="+firstID, "-f", "before="+fourthID, "-a") |
88 | 88 |
expected = []string{thirdID, secondID} |
89 |
- c.Assert(assertContainerList(out, expected), checker.Equals, true, check.Commentf("SINCE filter, BEFORE filter & ALL: Container list is not in the correct order: \n%s", out)) |
|
89 |
+ c.Assert(assertContainerList(RemoveOutputForExistingElements(out, existingContainers), expected), checker.Equals, true, check.Commentf("SINCE filter, BEFORE filter & ALL: Container list is not in the correct order: \n%s", out)) |
|
90 | 90 |
|
91 | 91 |
out, _ = dockerCmd(c, "ps", "-f", "since="+firstID, "-f", "before="+fourthID) |
92 | 92 |
expected = []string{secondID} |
93 |
- c.Assert(assertContainerList(out, expected), checker.Equals, true, check.Commentf("SINCE filter, BEFORE filter: Container list is not in the correct order: \n%s", out)) |
|
93 |
+ c.Assert(assertContainerList(RemoveOutputForExistingElements(out, existingContainers), expected), checker.Equals, true, check.Commentf("SINCE filter, BEFORE filter: Container list is not in the correct order: \n%s", out)) |
|
94 | 94 |
|
95 | 95 |
// filter since & limit |
96 | 96 |
out, _ = dockerCmd(c, "ps", "-f", "since="+firstID, "-n=2", "-a") |
97 | 97 |
expected = []string{fourthID, thirdID} |
98 | 98 |
|
99 |
- c.Assert(assertContainerList(out, expected), checker.Equals, true, check.Commentf("SINCE filter, LIMIT & ALL: Container list is not in the correct order: \n%s", out)) |
|
99 |
+ c.Assert(assertContainerList(RemoveOutputForExistingElements(out, existingContainers), expected), checker.Equals, true, check.Commentf("SINCE filter, LIMIT & ALL: Container list is not in the correct order: \n%s", out)) |
|
100 | 100 |
|
101 | 101 |
out, _ = dockerCmd(c, "ps", "-f", "since="+firstID, "-n=2") |
102 |
- c.Assert(assertContainerList(out, expected), checker.Equals, true, check.Commentf("SINCE filter, LIMIT: Container list is not in the correct order: \n%s", out)) |
|
102 |
+ c.Assert(assertContainerList(RemoveOutputForExistingElements(out, existingContainers), expected), checker.Equals, true, check.Commentf("SINCE filter, LIMIT: Container list is not in the correct order: \n%s", out)) |
|
103 | 103 |
|
104 | 104 |
// filter before & limit |
105 | 105 |
out, _ = dockerCmd(c, "ps", "-f", "before="+fourthID, "-n=1", "-a") |
106 | 106 |
expected = []string{thirdID} |
107 |
- c.Assert(assertContainerList(out, expected), checker.Equals, true, check.Commentf("BEFORE filter, LIMIT & ALL: Container list is not in the correct order: \n%s", out)) |
|
107 |
+ c.Assert(assertContainerList(RemoveOutputForExistingElements(out, existingContainers), expected), checker.Equals, true, check.Commentf("BEFORE filter, LIMIT & ALL: Container list is not in the correct order: \n%s", out)) |
|
108 | 108 |
|
109 | 109 |
out, _ = dockerCmd(c, "ps", "-f", "before="+fourthID, "-n=1") |
110 |
- c.Assert(assertContainerList(out, expected), checker.Equals, true, check.Commentf("BEFORE filter, LIMIT: Container list is not in the correct order: \n%s", out)) |
|
110 |
+ c.Assert(assertContainerList(RemoveOutputForExistingElements(out, existingContainers), expected), checker.Equals, true, check.Commentf("BEFORE filter, LIMIT: Container list is not in the correct order: \n%s", out)) |
|
111 | 111 |
|
112 | 112 |
// filter since & filter before & limit |
113 | 113 |
out, _ = dockerCmd(c, "ps", "-f", "since="+firstID, "-f", "before="+fourthID, "-n=1", "-a") |
114 | 114 |
expected = []string{thirdID} |
115 |
- c.Assert(assertContainerList(out, expected), checker.Equals, true, check.Commentf("SINCE filter, BEFORE filter, LIMIT & ALL: Container list is not in the correct order: \n%s", out)) |
|
115 |
+ c.Assert(assertContainerList(RemoveOutputForExistingElements(out, existingContainers), expected), checker.Equals, true, check.Commentf("SINCE filter, BEFORE filter, LIMIT & ALL: Container list is not in the correct order: \n%s", out)) |
|
116 | 116 |
|
117 | 117 |
out, _ = dockerCmd(c, "ps", "-f", "since="+firstID, "-f", "before="+fourthID, "-n=1") |
118 |
- c.Assert(assertContainerList(out, expected), checker.Equals, true, check.Commentf("SINCE filter, BEFORE filter, LIMIT: Container list is not in the correct order: \n%s", out)) |
|
118 |
+ c.Assert(assertContainerList(RemoveOutputForExistingElements(out, existingContainers), expected), checker.Equals, true, check.Commentf("SINCE filter, BEFORE filter, LIMIT: Container list is not in the correct order: \n%s", out)) |
|
119 | 119 |
|
120 | 120 |
} |
121 | 121 |
|
... | ... |
@@ -185,6 +187,8 @@ func (s *DockerSuite) TestPsListContainersSize(c *check.C) { |
185 | 185 |
} |
186 | 186 |
|
187 | 187 |
func (s *DockerSuite) TestPsListContainersFilterStatus(c *check.C) { |
188 |
+ existingContainers := ExistingContainerIDs(c) |
|
189 |
+ |
|
188 | 190 |
// start exited container |
189 | 191 |
out := cli.DockerCmd(c, "run", "-d", "busybox").Combined() |
190 | 192 |
firstID := strings.TrimSpace(out) |
... | ... |
@@ -199,11 +203,11 @@ func (s *DockerSuite) TestPsListContainersFilterStatus(c *check.C) { |
199 | 199 |
// filter containers by exited |
200 | 200 |
out = cli.DockerCmd(c, "ps", "--no-trunc", "-q", "--filter=status=exited").Combined() |
201 | 201 |
containerOut := strings.TrimSpace(out) |
202 |
- c.Assert(containerOut, checker.Equals, firstID) |
|
202 |
+ c.Assert(RemoveOutputForExistingElements(containerOut, existingContainers), checker.Equals, firstID) |
|
203 | 203 |
|
204 | 204 |
out = cli.DockerCmd(c, "ps", "-a", "--no-trunc", "-q", "--filter=status=running").Combined() |
205 | 205 |
containerOut = strings.TrimSpace(out) |
206 |
- c.Assert(containerOut, checker.Equals, secondID) |
|
206 |
+ c.Assert(RemoveOutputForExistingElements(containerOut, existingContainers), checker.Equals, secondID) |
|
207 | 207 |
|
208 | 208 |
result := cli.Docker(cli.Args("ps", "-a", "-q", "--filter=status=rubbish"), cli.WithTimeout(time.Second*60)) |
209 | 209 |
result.Assert(c, icmd.Expected{ |
... | ... |
@@ -222,7 +226,7 @@ func (s *DockerSuite) TestPsListContainersFilterStatus(c *check.C) { |
222 | 222 |
|
223 | 223 |
out = cli.DockerCmd(c, "ps", "--no-trunc", "-q", "--filter=status=paused").Combined() |
224 | 224 |
containerOut = strings.TrimSpace(out) |
225 |
- c.Assert(containerOut, checker.Equals, pausedID) |
|
225 |
+ c.Assert(RemoveOutputForExistingElements(containerOut, existingContainers), checker.Equals, pausedID) |
|
226 | 226 |
} |
227 | 227 |
} |
228 | 228 |
|
... | ... |
@@ -305,6 +309,8 @@ func (s *DockerSuite) TestPsListContainersFilterName(c *check.C) { |
305 | 305 |
// - Run containers for each of those image (busybox, images_ps_filter_test1, images_ps_filter_test2) |
306 | 306 |
// - Filter them out :P |
307 | 307 |
func (s *DockerSuite) TestPsListContainersFilterAncestorImage(c *check.C) { |
308 |
+ existingContainers := ExistingContainerIDs(c) |
|
309 |
+ |
|
308 | 310 |
// Build images |
309 | 311 |
imageName1 := "images_ps_filter_test1" |
310 | 312 |
buildImageSuccessfully(c, imageName1, build.WithDockerfile(`FROM busybox |
... | ... |
@@ -367,12 +373,12 @@ func (s *DockerSuite) TestPsListContainersFilterAncestorImage(c *check.C) { |
367 | 367 |
var out string |
368 | 368 |
for _, filter := range filterTestSuite { |
369 | 369 |
out, _ = dockerCmd(c, "ps", "-a", "-q", "--no-trunc", "--filter=ancestor="+filter.filterName) |
370 |
- checkPsAncestorFilterOutput(c, out, filter.filterName, filter.expectedIDs) |
|
370 |
+ checkPsAncestorFilterOutput(c, RemoveOutputForExistingElements(out, existingContainers), filter.filterName, filter.expectedIDs) |
|
371 | 371 |
} |
372 | 372 |
|
373 | 373 |
// Multiple ancestor filter |
374 | 374 |
out, _ = dockerCmd(c, "ps", "-a", "-q", "--no-trunc", "--filter=ancestor="+imageName2, "--filter=ancestor="+imageName1Tagged) |
375 |
- checkPsAncestorFilterOutput(c, out, imageName2+","+imageName1Tagged, []string{fourthID, fifthID}) |
|
375 |
+ checkPsAncestorFilterOutput(c, RemoveOutputForExistingElements(out, existingContainers), imageName2+","+imageName1Tagged, []string{fourthID, fifthID}) |
|
376 | 376 |
} |
377 | 377 |
|
378 | 378 |
func checkPsAncestorFilterOutput(c *check.C, out string, filterName string, expectedIDs []string) { |
... | ... |
@@ -469,6 +475,9 @@ func (s *DockerSuite) TestPsListContainersFilterExited(c *check.C) { |
469 | 469 |
func (s *DockerSuite) TestPsRightTagName(c *check.C) { |
470 | 470 |
// TODO Investigate further why this fails on Windows to Windows CI |
471 | 471 |
testRequires(c, DaemonIsLinux) |
472 |
+ |
|
473 |
+ existingContainers := ExistingContainerNames(c) |
|
474 |
+ |
|
472 | 475 |
tag := "asybox:shmatest" |
473 | 476 |
dockerCmd(c, "tag", "busybox", tag) |
474 | 477 |
|
... | ... |
@@ -490,6 +499,7 @@ func (s *DockerSuite) TestPsRightTagName(c *check.C) { |
490 | 490 |
|
491 | 491 |
out, _ = dockerCmd(c, "ps", "--no-trunc") |
492 | 492 |
lines := strings.Split(strings.TrimSpace(string(out)), "\n") |
493 |
+ lines = RemoveLinesForExistingElements(lines, existingContainers) |
|
493 | 494 |
// skip header |
494 | 495 |
lines = lines[1:] |
495 | 496 |
c.Assert(lines, checker.HasLen, 3, check.Commentf("There should be 3 running container, got %d", len(lines))) |
... | ... |
@@ -581,12 +591,14 @@ func (s *DockerSuite) TestPsListContainersFilterCreated(c *check.C) { |
581 | 581 |
func (s *DockerSuite) TestPsFormatMultiNames(c *check.C) { |
582 | 582 |
// Problematic on Windows as it doesn't support link as of Jan 2016 |
583 | 583 |
testRequires(c, DaemonIsLinux) |
584 |
+ existingContainers := ExistingContainerNames(c) |
|
584 | 585 |
//create 2 containers and link them |
585 | 586 |
dockerCmd(c, "run", "--name=child", "-d", "busybox", "top") |
586 | 587 |
dockerCmd(c, "run", "--name=parent", "--link=child:linkedone", "-d", "busybox", "top") |
587 | 588 |
|
588 | 589 |
//use the new format capabilities to only list the names and --no-trunc to get all names |
589 | 590 |
out, _ := dockerCmd(c, "ps", "--format", "{{.Names}}", "--no-trunc") |
591 |
+ out = RemoveOutputForExistingElements(out, existingContainers) |
|
590 | 592 |
lines := strings.Split(strings.TrimSpace(string(out)), "\n") |
591 | 593 |
expected := []string{"parent", "child,parent/linkedone"} |
592 | 594 |
var names []string |
... | ... |
@@ -595,6 +607,7 @@ func (s *DockerSuite) TestPsFormatMultiNames(c *check.C) { |
595 | 595 |
|
596 | 596 |
//now list without turning off truncation and make sure we only get the non-link names |
597 | 597 |
out, _ = dockerCmd(c, "ps", "--format", "{{.Names}}") |
598 |
+ out = RemoveOutputForExistingElements(out, existingContainers) |
|
598 | 599 |
lines = strings.Split(strings.TrimSpace(string(out)), "\n") |
599 | 600 |
expected = []string{"parent", "child"} |
600 | 601 |
var truncNames []string |
... | ... |
@@ -604,12 +617,14 @@ func (s *DockerSuite) TestPsFormatMultiNames(c *check.C) { |
604 | 604 |
|
605 | 605 |
// Test for GitHub issue #21772 |
606 | 606 |
func (s *DockerSuite) TestPsNamesMultipleTime(c *check.C) { |
607 |
+ existingContainers := ExistingContainerNames(c) |
|
607 | 608 |
runSleepingContainer(c, "--name=test1") |
608 | 609 |
runSleepingContainer(c, "--name=test2") |
609 | 610 |
|
610 | 611 |
//use the new format capabilities to list the names twice |
611 | 612 |
out, _ := dockerCmd(c, "ps", "--format", "{{.Names}} {{.Names}}") |
612 | 613 |
lines := strings.Split(strings.TrimSpace(string(out)), "\n") |
614 |
+ lines = RemoveLinesForExistingElements(lines, existingContainers) |
|
613 | 615 |
expected := []string{"test2 test2", "test1 test1"} |
614 | 616 |
var names []string |
615 | 617 |
names = append(names, lines...) |
... | ... |
@@ -628,6 +643,7 @@ func (s *DockerSuite) TestPsFormatHeaders(c *check.C) { |
628 | 628 |
} |
629 | 629 |
|
630 | 630 |
func (s *DockerSuite) TestPsDefaultFormatAndQuiet(c *check.C) { |
631 |
+ existingContainers := ExistingContainerIDs(c) |
|
631 | 632 |
config := `{ |
632 | 633 |
"psFormat": "default {{ .ID }}" |
633 | 634 |
}` |
... | ... |
@@ -642,6 +658,7 @@ func (s *DockerSuite) TestPsDefaultFormatAndQuiet(c *check.C) { |
642 | 642 |
id := strings.TrimSpace(out) |
643 | 643 |
|
644 | 644 |
out, _ = dockerCmd(c, "--config", d, "ps", "-q") |
645 |
+ out = RemoveOutputForExistingElements(out, existingContainers) |
|
645 | 646 |
c.Assert(id, checker.HasPrefix, strings.TrimSpace(out), check.Commentf("Expected to print only the container id, got %v\n", out)) |
646 | 647 |
} |
647 | 648 |
|
... | ... |
@@ -652,6 +669,8 @@ func (s *DockerSuite) TestPsImageIDAfterUpdate(c *check.C) { |
652 | 652 |
originalImageName := "busybox:TestPsImageIDAfterUpdate-original" |
653 | 653 |
updatedImageName := "busybox:TestPsImageIDAfterUpdate-updated" |
654 | 654 |
|
655 |
+ existingContainers := ExistingContainerIDs(c) |
|
656 |
+ |
|
655 | 657 |
icmd.RunCommand(dockerBinary, "tag", "busybox:latest", originalImageName).Assert(c, icmd.Success) |
656 | 658 |
|
657 | 659 |
originalImageID := getIDByName(c, originalImageName) |
... | ... |
@@ -664,6 +683,7 @@ func (s *DockerSuite) TestPsImageIDAfterUpdate(c *check.C) { |
664 | 664 |
result.Assert(c, icmd.Success) |
665 | 665 |
|
666 | 666 |
lines := strings.Split(strings.TrimSpace(string(result.Combined())), "\n") |
667 |
+ lines = RemoveLinesForExistingElements(lines, existingContainers) |
|
667 | 668 |
// skip header |
668 | 669 |
lines = lines[1:] |
669 | 670 |
c.Assert(len(lines), checker.Equals, 1) |
... | ... |
@@ -680,6 +700,7 @@ func (s *DockerSuite) TestPsImageIDAfterUpdate(c *check.C) { |
680 | 680 |
result.Assert(c, icmd.Success) |
681 | 681 |
|
682 | 682 |
lines = strings.Split(strings.TrimSpace(string(result.Combined())), "\n") |
683 |
+ lines = RemoveLinesForExistingElements(lines, existingContainers) |
|
683 | 684 |
// skip header |
684 | 685 |
lines = lines[1:] |
685 | 686 |
c.Assert(len(lines), checker.Equals, 1) |
... | ... |
@@ -710,6 +731,8 @@ func (s *DockerSuite) TestPsNotShowPortsOfStoppedContainer(c *check.C) { |
710 | 710 |
} |
711 | 711 |
|
712 | 712 |
func (s *DockerSuite) TestPsShowMounts(c *check.C) { |
713 |
+ existingContainers := ExistingContainerNames(c) |
|
714 |
+ |
|
713 | 715 |
prefix, slash := getPrefixAndSlashFromDaemonPlatform() |
714 | 716 |
|
715 | 717 |
mp := prefix + slash + "test" |
... | ... |
@@ -736,6 +759,7 @@ func (s *DockerSuite) TestPsShowMounts(c *check.C) { |
736 | 736 |
out, _ := dockerCmd(c, "ps", "--format", "{{.Names}} {{.Mounts}}") |
737 | 737 |
|
738 | 738 |
lines := strings.Split(strings.TrimSpace(string(out)), "\n") |
739 |
+ lines = RemoveLinesForExistingElements(lines, existingContainers) |
|
739 | 740 |
c.Assert(lines, checker.HasLen, 3) |
740 | 741 |
|
741 | 742 |
fields := strings.Fields(lines[0]) |
... | ... |
@@ -755,6 +779,7 @@ func (s *DockerSuite) TestPsShowMounts(c *check.C) { |
755 | 755 |
out, _ = dockerCmd(c, "ps", "--format", "{{.Names}} {{.Mounts}}", "--filter", "volume=ps-volume-test") |
756 | 756 |
|
757 | 757 |
lines = strings.Split(strings.TrimSpace(string(out)), "\n") |
758 |
+ lines = RemoveLinesForExistingElements(lines, existingContainers) |
|
758 | 759 |
c.Assert(lines, checker.HasLen, 1) |
759 | 760 |
|
760 | 761 |
fields = strings.Fields(lines[0]) |
... | ... |
@@ -768,6 +793,7 @@ func (s *DockerSuite) TestPsShowMounts(c *check.C) { |
768 | 768 |
out, _ = dockerCmd(c, "ps", "--format", "{{.Names}} {{.Mounts}}", "--filter", "volume="+mp) |
769 | 769 |
|
770 | 770 |
lines = strings.Split(strings.TrimSpace(string(out)), "\n") |
771 |
+ lines = RemoveLinesForExistingElements(lines, existingContainers) |
|
771 | 772 |
c.Assert(lines, checker.HasLen, 2) |
772 | 773 |
|
773 | 774 |
fields = strings.Fields(lines[0]) |
... | ... |
@@ -779,6 +805,7 @@ func (s *DockerSuite) TestPsShowMounts(c *check.C) { |
779 | 779 |
out, _ = dockerCmd(c, "ps", "--format", "{{.Names}} {{.Mounts}}", "--filter", "volume="+bindMountSource) |
780 | 780 |
|
781 | 781 |
lines = strings.Split(strings.TrimSpace(string(out)), "\n") |
782 |
+ lines = RemoveLinesForExistingElements(lines, existingContainers) |
|
782 | 783 |
c.Assert(lines, checker.HasLen, 1) |
783 | 784 |
|
784 | 785 |
fields = strings.Fields(lines[0]) |
... | ... |
@@ -790,6 +817,7 @@ func (s *DockerSuite) TestPsShowMounts(c *check.C) { |
790 | 790 |
out, _ = dockerCmd(c, "ps", "--format", "{{.Names}} {{.Mounts}}", "--filter", "volume="+bindMountDestination) |
791 | 791 |
|
792 | 792 |
lines = strings.Split(strings.TrimSpace(string(out)), "\n") |
793 |
+ lines = RemoveLinesForExistingElements(lines, existingContainers) |
|
793 | 794 |
c.Assert(lines, checker.HasLen, 1) |
794 | 795 |
|
795 | 796 |
fields = strings.Fields(lines[0]) |
... | ... |
@@ -820,6 +848,8 @@ func (s *DockerSuite) TestPsFormatSize(c *check.C) { |
820 | 820 |
} |
821 | 821 |
|
822 | 822 |
func (s *DockerSuite) TestPsListContainersFilterNetwork(c *check.C) { |
823 |
+ existing := ExistingContainerIDs(c) |
|
824 |
+ |
|
823 | 825 |
// TODO default network on Windows is not called "bridge", and creating a |
824 | 826 |
// custom network fails on Windows fails with "Error response from daemon: plugin not found") |
825 | 827 |
testRequires(c, DaemonIsLinux) |
... | ... |
@@ -837,7 +867,7 @@ func (s *DockerSuite) TestPsListContainersFilterNetwork(c *check.C) { |
837 | 837 |
lines = lines[1:] |
838 | 838 |
|
839 | 839 |
// ps output should have no containers |
840 |
- c.Assert(lines, checker.HasLen, 0) |
|
840 |
+ c.Assert(RemoveLinesForExistingElements(lines, existing), checker.HasLen, 0) |
|
841 | 841 |
|
842 | 842 |
// Filter docker ps on network bridge |
843 | 843 |
out, _ = dockerCmd(c, "ps", "--filter", "network=bridge") |
... | ... |
@@ -849,7 +879,7 @@ func (s *DockerSuite) TestPsListContainersFilterNetwork(c *check.C) { |
849 | 849 |
lines = lines[1:] |
850 | 850 |
|
851 | 851 |
// ps output should have only one container |
852 |
- c.Assert(lines, checker.HasLen, 1) |
|
852 |
+ c.Assert(RemoveLinesForExistingElements(lines, existing), checker.HasLen, 1) |
|
853 | 853 |
|
854 | 854 |
// Making sure onbridgenetwork is on the output |
855 | 855 |
c.Assert(containerOut, checker.Contains, "onbridgenetwork", check.Commentf("Missing the container on network\n")) |
... | ... |
@@ -864,7 +894,7 @@ func (s *DockerSuite) TestPsListContainersFilterNetwork(c *check.C) { |
864 | 864 |
lines = lines[1:] |
865 | 865 |
|
866 | 866 |
//ps output should have both the containers |
867 |
- c.Assert(lines, checker.HasLen, 2) |
|
867 |
+ c.Assert(RemoveLinesForExistingElements(lines, existing), checker.HasLen, 2) |
|
868 | 868 |
|
869 | 869 |
// Making sure onbridgenetwork and onnonenetwork is on the output |
870 | 870 |
c.Assert(containerOut, checker.Contains, "onnonenetwork", check.Commentf("Missing the container on none network\n")) |
... | ... |
@@ -885,11 +915,12 @@ func (s *DockerSuite) TestPsListContainersFilterNetwork(c *check.C) { |
885 | 885 |
containerOut = strings.TrimSpace(string(out)) |
886 | 886 |
|
887 | 887 |
lines = strings.Split(containerOut, "\n") |
888 |
+ |
|
888 | 889 |
// skip header |
889 | 890 |
lines = lines[1:] |
890 | 891 |
|
891 | 892 |
// ps output should have only one container |
892 |
- c.Assert(lines, checker.HasLen, 1) |
|
893 |
+ c.Assert(RemoveLinesForExistingElements(lines, existing), checker.HasLen, 1) |
|
893 | 894 |
|
894 | 895 |
// Making sure onbridgenetwork is on the output |
895 | 896 |
c.Assert(containerOut, checker.Contains, "onbridgenetwork", check.Commentf("Missing the container on network\n")) |
... | ... |
@@ -927,8 +958,10 @@ func (s *DockerSuite) TestPsFilterMissingArgErrorCode(c *check.C) { |
927 | 927 |
|
928 | 928 |
// Test case for 30291 |
929 | 929 |
func (s *DockerSuite) TestPsFormatTemplateWithArg(c *check.C) { |
930 |
+ existingContainers := ExistingContainerNames(c) |
|
930 | 931 |
runSleepingContainer(c, "-d", "--name", "top", "--label", "some.label=label.foo-bar") |
931 | 932 |
out, _ := dockerCmd(c, "ps", "--format", `{{.Names}} {{.Label "some.label"}}`) |
933 |
+ out = RemoveOutputForExistingElements(out, existingContainers) |
|
932 | 934 |
c.Assert(strings.TrimSpace(out), checker.Equals, "top label.foo-bar") |
933 | 935 |
} |
934 | 936 |
|
... | ... |
@@ -969,11 +1002,14 @@ func (s *DockerSuite) TestPsListContainersFilterPorts(c *check.C) { |
969 | 969 |
func (s *DockerSuite) TestPsNotShowLinknamesOfDeletedContainer(c *check.C) { |
970 | 970 |
testRequires(c, DaemonIsLinux) |
971 | 971 |
|
972 |
+ existingContainers := ExistingContainerNames(c) |
|
973 |
+ |
|
972 | 974 |
dockerCmd(c, "create", "--name=aaa", "busybox", "top") |
973 | 975 |
dockerCmd(c, "create", "--name=bbb", "--link=aaa", "busybox", "top") |
974 | 976 |
|
975 | 977 |
out, _ := dockerCmd(c, "ps", "--no-trunc", "-a", "--format", "{{.Names}}") |
976 | 978 |
lines := strings.Split(strings.TrimSpace(string(out)), "\n") |
979 |
+ lines = RemoveLinesForExistingElements(lines, existingContainers) |
|
977 | 980 |
expected := []string{"bbb", "aaa,bbb/aaa"} |
978 | 981 |
var names []string |
979 | 982 |
names = append(names, lines...) |
... | ... |
@@ -982,5 +1018,6 @@ func (s *DockerSuite) TestPsNotShowLinknamesOfDeletedContainer(c *check.C) { |
982 | 982 |
dockerCmd(c, "rm", "bbb") |
983 | 983 |
|
984 | 984 |
out, _ = dockerCmd(c, "ps", "--no-trunc", "-a", "--format", "{{.Names}}") |
985 |
+ out = RemoveOutputForExistingElements(out, existingContainers) |
|
985 | 986 |
c.Assert(strings.TrimSpace(out), checker.Equals, "aaa") |
986 | 987 |
} |
... | ... |
@@ -2813,23 +2813,27 @@ func (s *DockerSuite) TestRunVolumesFromRestartAfterRemoved(c *check.C) { |
2813 | 2813 |
|
2814 | 2814 |
// run container with --rm should remove container if exit code != 0 |
2815 | 2815 |
func (s *DockerSuite) TestRunContainerWithRmFlagExitCodeNotEqualToZero(c *check.C) { |
2816 |
+ existingContainers := ExistingContainerIDs(c) |
|
2816 | 2817 |
name := "flowers" |
2817 | 2818 |
cli.Docker(cli.Args("run", "--name", name, "--rm", "busybox", "ls", "/notexists")).Assert(c, icmd.Expected{ |
2818 | 2819 |
ExitCode: 1, |
2819 | 2820 |
}) |
2820 | 2821 |
|
2821 | 2822 |
out := cli.DockerCmd(c, "ps", "-q", "-a").Combined() |
2823 |
+ out = RemoveOutputForExistingElements(out, existingContainers) |
|
2822 | 2824 |
if out != "" { |
2823 | 2825 |
c.Fatal("Expected not to have containers", out) |
2824 | 2826 |
} |
2825 | 2827 |
} |
2826 | 2828 |
|
2827 | 2829 |
func (s *DockerSuite) TestRunContainerWithRmFlagCannotStartContainer(c *check.C) { |
2830 |
+ existingContainers := ExistingContainerIDs(c) |
|
2828 | 2831 |
name := "sparkles" |
2829 | 2832 |
cli.Docker(cli.Args("run", "--name", name, "--rm", "busybox", "commandNotFound")).Assert(c, icmd.Expected{ |
2830 | 2833 |
ExitCode: 127, |
2831 | 2834 |
}) |
2832 | 2835 |
out := cli.DockerCmd(c, "ps", "-q", "-a").Combined() |
2836 |
+ out = RemoveOutputForExistingElements(out, existingContainers) |
|
2833 | 2837 |
if out != "" { |
2834 | 2838 |
c.Fatal("Expected not to have containers", out) |
2835 | 2839 |
} |
... | ... |
@@ -7,7 +7,10 @@ import ( |
7 | 7 |
"path/filepath" |
8 | 8 |
"strings" |
9 | 9 |
|
10 |
+ "github.com/docker/docker/api/types" |
|
11 |
+ "github.com/docker/docker/client" |
|
10 | 12 |
"github.com/docker/docker/pkg/stringutils" |
13 |
+ "github.com/go-check/check" |
|
11 | 14 |
"github.com/gotestyourself/gotestyourself/icmd" |
12 | 15 |
"github.com/pkg/errors" |
13 | 16 |
) |
... | ... |
@@ -112,3 +115,71 @@ func RunCommandPipelineWithOutput(cmds ...*exec.Cmd) (output string, err error) |
112 | 112 |
out, err := cmds[len(cmds)-1].CombinedOutput() |
113 | 113 |
return string(out), err |
114 | 114 |
} |
115 |
+ |
|
116 |
+type elementListOptions struct { |
|
117 |
+ element, format string |
|
118 |
+} |
|
119 |
+ |
|
120 |
+func existingElements(c *check.C, opts elementListOptions) []string { |
|
121 |
+ args := []string{} |
|
122 |
+ switch opts.element { |
|
123 |
+ case "container": |
|
124 |
+ args = append(args, "ps", "-a") |
|
125 |
+ case "image": |
|
126 |
+ args = append(args, "images", "-a") |
|
127 |
+ case "network": |
|
128 |
+ args = append(args, "network", "ls") |
|
129 |
+ case "plugin": |
|
130 |
+ args = append(args, "plugin", "ls") |
|
131 |
+ case "volume": |
|
132 |
+ args = append(args, "volume", "ls") |
|
133 |
+ } |
|
134 |
+ if opts.format != "" { |
|
135 |
+ args = append(args, "--format", opts.format) |
|
136 |
+ } |
|
137 |
+ out, _ := dockerCmd(c, args...) |
|
138 |
+ lines := []string{} |
|
139 |
+ for _, l := range strings.Split(out, "\n") { |
|
140 |
+ if l != "" { |
|
141 |
+ lines = append(lines, l) |
|
142 |
+ } |
|
143 |
+ } |
|
144 |
+ return lines |
|
145 |
+} |
|
146 |
+ |
|
147 |
+// ExistingContainerIDs returns a list of currently existing container IDs. |
|
148 |
+func ExistingContainerIDs(c *check.C) []string { |
|
149 |
+ return existingElements(c, elementListOptions{element: "container", format: "{{.ID}}"}) |
|
150 |
+} |
|
151 |
+ |
|
152 |
+// ExistingContainerNames returns a list of existing container names. |
|
153 |
+func ExistingContainerNames(c *check.C) []string { |
|
154 |
+ return existingElements(c, elementListOptions{element: "container", format: "{{.Names}}"}) |
|
155 |
+} |
|
156 |
+ |
|
157 |
+// RemoveLinesForExistingElements removes existing elements from the output of a |
|
158 |
+// docker command. |
|
159 |
+// This function takes an output []string and returns a []string. |
|
160 |
+func RemoveLinesForExistingElements(output, existing []string) []string { |
|
161 |
+ for _, e := range existing { |
|
162 |
+ index := -1 |
|
163 |
+ for i, line := range output { |
|
164 |
+ if strings.Contains(line, e) { |
|
165 |
+ index = i |
|
166 |
+ break |
|
167 |
+ } |
|
168 |
+ } |
|
169 |
+ if index != -1 { |
|
170 |
+ output = append(output[:index], output[index+1:]...) |
|
171 |
+ } |
|
172 |
+ } |
|
173 |
+ return output |
|
174 |
+} |
|
175 |
+ |
|
176 |
+// RemoveOutputForExistingElements removes existing elements from the output of |
|
177 |
+// a docker command. |
|
178 |
+// This function takes an output string and returns a string. |
|
179 |
+func RemoveOutputForExistingElements(output string, existing []string) string { |
|
180 |
+ res := RemoveLinesForExistingElements(strings.Split(output, "\n"), existing) |
|
181 |
+ return strings.Join(res, "\n") |
|
182 |
+} |