github.com/containers/libpod@v1.9.4-0.20220419124438-4284fd425507/test/e2e/ps_test.go (about) 1 package integration 2 3 import ( 4 "fmt" 5 "os" 6 "regexp" 7 "sort" 8 "strings" 9 10 . "github.com/containers/libpod/test/utils" 11 "github.com/docker/go-units" 12 . "github.com/onsi/ginkgo" 13 . "github.com/onsi/gomega" 14 ) 15 16 var _ = Describe("Podman ps", func() { 17 var ( 18 tempdir string 19 err error 20 podmanTest *PodmanTestIntegration 21 ) 22 23 BeforeEach(func() { 24 tempdir, err = CreateTempDirInTempDir() 25 if err != nil { 26 os.Exit(1) 27 } 28 podmanTest = PodmanTestCreate(tempdir) 29 podmanTest.Setup() 30 podmanTest.SeedImages() 31 }) 32 33 AfterEach(func() { 34 podmanTest.Cleanup() 35 f := CurrentGinkgoTestDescription() 36 processTestResult(f) 37 38 }) 39 40 It("podman ps no containers", func() { 41 session := podmanTest.Podman([]string{"ps"}) 42 session.WaitWithDefaultTimeout() 43 Expect(session.ExitCode()).To(Equal(0)) 44 }) 45 46 It("podman ps default", func() { 47 session := podmanTest.RunTopContainer("") 48 session.WaitWithDefaultTimeout() 49 Expect(session.ExitCode()).To(Equal(0)) 50 51 result := podmanTest.Podman([]string{"ps"}) 52 result.WaitWithDefaultTimeout() 53 Expect(result.ExitCode()).To(Equal(0)) 54 Expect(len(result.OutputToStringArray())).Should(BeNumerically(">", 0)) 55 }) 56 57 It("podman ps all", func() { 58 _, ec, _ := podmanTest.RunLsContainer("") 59 Expect(ec).To(Equal(0)) 60 61 result := podmanTest.Podman([]string{"ps", "-a"}) 62 result.WaitWithDefaultTimeout() 63 Expect(result.ExitCode()).To(Equal(0)) 64 Expect(len(result.OutputToStringArray())).Should(BeNumerically(">", 0)) 65 }) 66 67 It("podman container list all", func() { 68 _, ec, _ := podmanTest.RunLsContainer("") 69 Expect(ec).To(Equal(0)) 70 71 result := podmanTest.Podman([]string{"container", "list", "-a"}) 72 result.WaitWithDefaultTimeout() 73 Expect(result.ExitCode()).To(Equal(0)) 74 Expect(len(result.OutputToStringArray())).Should(BeNumerically(">", 0)) 75 76 result = podmanTest.Podman([]string{"container", "ls", "-a"}) 77 result.WaitWithDefaultTimeout() 78 Expect(result.ExitCode()).To(Equal(0)) 79 Expect(len(result.OutputToStringArray())).Should(BeNumerically(">", 0)) 80 }) 81 82 It("podman ps size flag", func() { 83 _, ec, _ := podmanTest.RunLsContainer("") 84 Expect(ec).To(Equal(0)) 85 86 result := podmanTest.Podman([]string{"ps", "-a", "--size"}) 87 result.WaitWithDefaultTimeout() 88 Expect(result.ExitCode()).To(Equal(0)) 89 Expect(len(result.OutputToStringArray())).Should(BeNumerically(">", 0)) 90 }) 91 92 It("podman ps quiet flag", func() { 93 _, ec, fullCid := podmanTest.RunLsContainer("") 94 Expect(ec).To(Equal(0)) 95 96 result := podmanTest.Podman([]string{"ps", "-a", "-q"}) 97 result.WaitWithDefaultTimeout() 98 Expect(result.ExitCode()).To(Equal(0)) 99 Expect(len(result.OutputToStringArray())).Should(BeNumerically(">", 0)) 100 Expect(fullCid).To(ContainSubstring(result.OutputToStringArray()[0])) 101 }) 102 103 It("podman ps latest flag", func() { 104 _, ec, _ := podmanTest.RunLsContainer("") 105 Expect(ec).To(Equal(0)) 106 107 result := podmanTest.Podman([]string{"ps", "--latest"}) 108 result.WaitWithDefaultTimeout() 109 Expect(result.ExitCode()).To(Equal(0)) 110 Expect(len(result.OutputToStringArray())).Should(BeNumerically(">", 0)) 111 }) 112 113 It("podman ps last flag", func() { 114 Skip("--last flag nonfunctional and disabled") 115 116 _, ec, _ := podmanTest.RunLsContainer("test1") 117 Expect(ec).To(Equal(0)) 118 119 _, ec, _ = podmanTest.RunLsContainer("test2") 120 Expect(ec).To(Equal(0)) 121 122 _, ec, _ = podmanTest.RunLsContainer("test3") 123 Expect(ec).To(Equal(0)) 124 125 result := podmanTest.Podman([]string{"ps", "--last", "2"}) 126 result.WaitWithDefaultTimeout() 127 Expect(result.ExitCode()).To(Equal(0)) 128 Expect(len(result.OutputToStringArray())).Should(Equal(3)) 129 }) 130 131 It("podman ps no-trunc", func() { 132 _, ec, fullCid := podmanTest.RunLsContainer("") 133 Expect(ec).To(Equal(0)) 134 135 result := podmanTest.Podman([]string{"ps", "-aq", "--no-trunc"}) 136 result.WaitWithDefaultTimeout() 137 Expect(result.ExitCode()).To(Equal(0)) 138 Expect(len(result.OutputToStringArray())).Should(BeNumerically(">", 0)) 139 Expect(fullCid).To(Equal(result.OutputToStringArray()[0])) 140 }) 141 142 It("podman ps namespace flag", func() { 143 _, ec, _ := podmanTest.RunLsContainer("") 144 Expect(ec).To(Equal(0)) 145 146 result := podmanTest.Podman([]string{"ps", "-a", "--namespace"}) 147 result.WaitWithDefaultTimeout() 148 Expect(result.ExitCode()).To(Equal(0)) 149 Expect(len(result.OutputToStringArray())).Should(BeNumerically(">", 0)) 150 }) 151 152 It("podman ps with no containers is valid json format", func() { 153 result := podmanTest.Podman([]string{"ps", "--format", "json"}) 154 result.WaitWithDefaultTimeout() 155 Expect(result.ExitCode()).To(Equal(0)) 156 Expect(result.IsJSONOutputValid()).To(BeTrue()) 157 }) 158 159 It("podman ps namespace flag with json format", func() { 160 _, ec, _ := podmanTest.RunLsContainer("test1") 161 Expect(ec).To(Equal(0)) 162 163 result := podmanTest.Podman([]string{"ps", "-a", "--ns", "--format", "json"}) 164 result.WaitWithDefaultTimeout() 165 Expect(result.ExitCode()).To(Equal(0)) 166 Expect(result.IsJSONOutputValid()).To(BeTrue()) 167 }) 168 169 It("podman ps namespace flag with go template format", func() { 170 _, ec, _ := podmanTest.RunLsContainer("test1") 171 Expect(ec).To(Equal(0)) 172 173 result := podmanTest.Podman([]string{"ps", "-a", "--format", "table {{.ID}} {{.Image}} {{.ImageID}} {{.Labels}}"}) 174 result.WaitWithDefaultTimeout() 175 Expect(strings.Contains(result.OutputToStringArray()[0], "table")).To(BeFalse()) 176 Expect(strings.Contains(result.OutputToStringArray()[0], "ID")).To(BeTrue()) 177 Expect(strings.Contains(result.OutputToStringArray()[0], "ImageID")).To(BeTrue()) 178 Expect(strings.Contains(result.OutputToStringArray()[1], "alpine:latest")).To(BeTrue()) 179 Expect(result.ExitCode()).To(Equal(0)) 180 }) 181 182 It("podman ps ancestor filter flag", func() { 183 _, ec, _ := podmanTest.RunLsContainer("test1") 184 Expect(ec).To(Equal(0)) 185 186 result := podmanTest.Podman([]string{"ps", "-a", "--filter", "ancestor=docker.io/library/alpine:latest"}) 187 result.WaitWithDefaultTimeout() 188 Expect(result.ExitCode()).To(Equal(0)) 189 }) 190 191 It("podman ps id filter flag", func() { 192 _, ec, fullCid := podmanTest.RunLsContainer("") 193 Expect(ec).To(Equal(0)) 194 195 result := podmanTest.Podman([]string{"ps", "-a", "--filter", fmt.Sprintf("id=%s", fullCid)}) 196 result.WaitWithDefaultTimeout() 197 Expect(result.ExitCode()).To(Equal(0)) 198 }) 199 200 It("podman ps id filter flag", func() { 201 session := podmanTest.RunTopContainer("") 202 session.WaitWithDefaultTimeout() 203 Expect(session.ExitCode()).To(Equal(0)) 204 fullCid := session.OutputToString() 205 206 result := podmanTest.Podman([]string{"ps", "-aq", "--no-trunc", "--filter", "status=running"}) 207 result.WaitWithDefaultTimeout() 208 Expect(result.ExitCode()).To(Equal(0)) 209 Expect(result.OutputToStringArray()[0]).To(Equal(fullCid)) 210 }) 211 212 It("podman ps multiple filters", func() { 213 session := podmanTest.Podman([]string{"run", "-d", "--name", "test1", "--label", "key1=value1", ALPINE, "top"}) 214 session.WaitWithDefaultTimeout() 215 Expect(session.ExitCode()).To(Equal(0)) 216 fullCid := session.OutputToString() 217 218 session2 := podmanTest.Podman([]string{"run", "-d", "--name", "test2", "--label", "key1=value1", ALPINE, "top"}) 219 session2.WaitWithDefaultTimeout() 220 Expect(session2.ExitCode()).To(Equal(0)) 221 222 result := podmanTest.Podman([]string{"ps", "-aq", "--no-trunc", "--filter", "name=test1", "--filter", "label=key1=value1"}) 223 result.WaitWithDefaultTimeout() 224 Expect(result.ExitCode()).To(Equal(0)) 225 226 output := result.OutputToStringArray() 227 Expect(len(output)).To(Equal(1)) 228 Expect(output[0]).To(Equal(fullCid)) 229 }) 230 231 It("podman ps filter by exited does not need all", func() { 232 ctr := podmanTest.Podman([]string{"run", "-t", "-i", ALPINE, "ls", "/"}) 233 ctr.WaitWithDefaultTimeout() 234 Expect(ctr.ExitCode()).To(Equal(0)) 235 236 psAll := podmanTest.Podman([]string{"ps", "-aq", "--no-trunc"}) 237 psAll.WaitWithDefaultTimeout() 238 Expect(psAll.ExitCode()).To(Equal(0)) 239 240 psFilter := podmanTest.Podman([]string{"ps", "--no-trunc", "--quiet", "--filter", "status=exited"}) 241 psFilter.WaitWithDefaultTimeout() 242 Expect(psFilter.ExitCode()).To(Equal(0)) 243 244 Expect(psAll.OutputToString()).To(Equal(psFilter.OutputToString())) 245 }) 246 247 It("podman filter without status does not find non-running", func() { 248 ctrName := "aContainerName" 249 ctr := podmanTest.Podman([]string{"create", "--name", ctrName, "-t", "-i", ALPINE, "ls", "/"}) 250 ctr.WaitWithDefaultTimeout() 251 Expect(ctr.ExitCode()).To(Equal(0)) 252 253 psFilter := podmanTest.Podman([]string{"ps", "--no-trunc", "--quiet", "--format", "{{.Names}}", "--filter", fmt.Sprintf("name=%s", ctrName)}) 254 psFilter.WaitWithDefaultTimeout() 255 Expect(psFilter.ExitCode()).To(Equal(0)) 256 257 Expect(strings.Contains(psFilter.OutputToString(), ctrName)).To(BeFalse()) 258 }) 259 260 It("podman ps mutually exclusive flags", func() { 261 session := podmanTest.Podman([]string{"ps", "-aqs"}) 262 session.WaitWithDefaultTimeout() 263 Expect(session).To(ExitWithError()) 264 265 session = podmanTest.Podman([]string{"ps", "-a", "--ns", "-s"}) 266 session.WaitWithDefaultTimeout() 267 Expect(session).To(ExitWithError()) 268 }) 269 270 It("podman --sort by size", func() { 271 session := podmanTest.Podman([]string{"create", "busybox", "ls"}) 272 session.WaitWithDefaultTimeout() 273 Expect(session.ExitCode()).To(Equal(0)) 274 275 session = podmanTest.Podman([]string{"create", "-dt", ALPINE, "top"}) 276 session.WaitWithDefaultTimeout() 277 Expect(session.ExitCode()).To(Equal(0)) 278 279 session = podmanTest.Podman([]string{"ps", "-a", "-s", "--sort=size", "--format", "{{.Size}}"}) 280 session.WaitWithDefaultTimeout() 281 Expect(session.ExitCode()).To(Equal(0)) 282 283 sortedArr := session.OutputToStringArray() 284 285 // TODO: This may be broken - the test was running without the 286 // ability to perform any sorting for months and succeeded 287 // without error. 288 Expect(sort.SliceIsSorted(sortedArr, func(i, j int) bool { 289 r := regexp.MustCompile(`^\S+\s+\(virtual (\S+)\)`) 290 matches1 := r.FindStringSubmatch(sortedArr[i]) 291 matches2 := r.FindStringSubmatch(sortedArr[j]) 292 293 // sanity check in case an oddly formatted size appears 294 if len(matches1) < 2 || len(matches2) < 2 { 295 return sortedArr[i] < sortedArr[j] 296 } else { 297 size1, _ := units.FromHumanSize(matches1[1]) 298 size2, _ := units.FromHumanSize(matches2[1]) 299 return size1 < size2 300 } 301 })).To(BeTrue()) 302 303 }) 304 305 It("podman --sort by command", func() { 306 session := podmanTest.RunTopContainer("") 307 session.WaitWithDefaultTimeout() 308 Expect(session.ExitCode()).To(Equal(0)) 309 310 session = podmanTest.Podman([]string{"run", "-d", ALPINE, "pwd"}) 311 session.WaitWithDefaultTimeout() 312 Expect(session.ExitCode()).To(Equal(0)) 313 314 session = podmanTest.Podman([]string{"ps", "-a", "--sort=command", "--format", "{{.Command}}"}) 315 316 session.WaitWithDefaultTimeout() 317 Expect(session.ExitCode()).To(Equal(0)) 318 319 sortedArr := session.OutputToStringArray() 320 321 Expect(sort.SliceIsSorted(sortedArr, func(i, j int) bool { return sortedArr[i] < sortedArr[j] })).To(BeTrue()) 322 323 }) 324 325 It("podman --pod", func() { 326 _, ec, podid := podmanTest.CreatePod("") 327 Expect(ec).To(Equal(0)) 328 329 session := podmanTest.RunTopContainerInPod("", podid) 330 session.WaitWithDefaultTimeout() 331 Expect(session.ExitCode()).To(Equal(0)) 332 333 session = podmanTest.Podman([]string{"ps", "--pod", "--no-trunc"}) 334 335 session.WaitWithDefaultTimeout() 336 Expect(session.ExitCode()).To(Equal(0)) 337 338 Expect(session.OutputToString()).To(ContainSubstring(podid)) 339 }) 340 341 It("podman --pod with a non-empty pod name", func() { 342 SkipIfRemote() 343 344 podName := "testPodName" 345 _, ec, podid := podmanTest.CreatePod(podName) 346 Expect(ec).To(Equal(0)) 347 348 session := podmanTest.RunTopContainerInPod("", podName) 349 session.WaitWithDefaultTimeout() 350 Expect(session.ExitCode()).To(Equal(0)) 351 352 // "--no-trunc" must be given. If not it will trunc the pod ID 353 // in the output and you will have to trunc it in the test too. 354 session = podmanTest.Podman([]string{"ps", "--pod", "--no-trunc"}) 355 356 session.WaitWithDefaultTimeout() 357 Expect(session.ExitCode()).To(Equal(0)) 358 359 output := session.OutputToString() 360 Expect(output).To(ContainSubstring(podid)) 361 Expect(output).To(ContainSubstring(podName)) 362 }) 363 364 It("podman ps test with port range", func() { 365 SkipIfRootless() 366 session := podmanTest.RunTopContainer("") 367 session.WaitWithDefaultTimeout() 368 Expect(session.ExitCode()).To(Equal(0)) 369 370 session = podmanTest.Podman([]string{"run", "-dt", "-p", "1000-1006:1000-1006", ALPINE, "top"}) 371 session.WaitWithDefaultTimeout() 372 Expect(session.ExitCode()).To(Equal(0)) 373 374 session = podmanTest.Podman([]string{"ps", "--format", "{{.Ports}}"}) 375 session.WaitWithDefaultTimeout() 376 Expect(session.OutputToString()).To(ContainSubstring("0.0.0.0:1000-1006")) 377 }) 378 379 It("podman ps sync flag", func() { 380 session := podmanTest.RunTopContainer("") 381 session.WaitWithDefaultTimeout() 382 Expect(session.ExitCode()).To(Equal(0)) 383 fullCid := session.OutputToString() 384 385 result := podmanTest.Podman([]string{"ps", "-q", "--no-trunc", "--sync"}) 386 result.WaitWithDefaultTimeout() 387 Expect(result.ExitCode()).To(Equal(0)) 388 Expect(result.OutputToStringArray()[0]).To(Equal(fullCid)) 389 }) 390 391 It("podman ps filter name regexp", func() { 392 session := podmanTest.Podman([]string{"run", "-d", "--name", "test1", ALPINE, "top"}) 393 session.WaitWithDefaultTimeout() 394 Expect(session.ExitCode()).To(Equal(0)) 395 fullCid := session.OutputToString() 396 397 session2 := podmanTest.Podman([]string{"run", "-d", "--name", "test11", ALPINE, "top"}) 398 session2.WaitWithDefaultTimeout() 399 Expect(session2.ExitCode()).To(Equal(0)) 400 401 result := podmanTest.Podman([]string{"ps", "-aq", "--no-trunc", "--filter", "name=test1"}) 402 result.WaitWithDefaultTimeout() 403 Expect(result.ExitCode()).To(Equal(0)) 404 405 output := result.OutputToStringArray() 406 Expect(len(output)).To(Equal(2)) 407 408 result = podmanTest.Podman([]string{"ps", "-aq", "--no-trunc", "--filter", "name=test1$"}) 409 result.WaitWithDefaultTimeout() 410 Expect(result.ExitCode()).To(Equal(0)) 411 412 output = result.OutputToStringArray() 413 Expect(len(output)).To(Equal(1)) 414 Expect(output[0]).To(Equal(fullCid)) 415 }) 416 417 It("podman ps quiet template", func() { 418 ctrName := "testCtr" 419 session := podmanTest.Podman([]string{"run", "-d", "--name", ctrName, ALPINE, "top"}) 420 session.WaitWithDefaultTimeout() 421 Expect(session.ExitCode()).To(Equal(0)) 422 423 result := podmanTest.Podman([]string{"ps", "-q", "-a", "--format", "{{ .Names }}"}) 424 result.WaitWithDefaultTimeout() 425 Expect(result.ExitCode()).To(Equal(0)) 426 427 output := result.OutputToStringArray() 428 Expect(len(output)).To(Equal(1)) 429 Expect(output[0]).To(Equal(ctrName)) 430 }) 431 })