github.com/containers/podman/v2@v2.2.2-0.20210501105131-c1e07d070c4c/test/e2e/prune_test.go (about) 1 package integration 2 3 import ( 4 "os" 5 6 . "github.com/containers/podman/v2/test/utils" 7 . "github.com/onsi/ginkgo" 8 . "github.com/onsi/gomega" 9 ) 10 11 var pruneImage = ` 12 FROM alpine:latest 13 LABEL RUN podman --version 14 RUN apk update 15 RUN apk add bash` 16 17 var _ = Describe("Podman prune", func() { 18 var ( 19 tempdir string 20 err error 21 podmanTest *PodmanTestIntegration 22 ) 23 24 BeforeEach(func() { 25 tempdir, err = CreateTempDirInTempDir() 26 if err != nil { 27 os.Exit(1) 28 } 29 podmanTest = PodmanTestCreate(tempdir) 30 podmanTest.Setup() 31 podmanTest.SeedImages() 32 }) 33 34 AfterEach(func() { 35 podmanTest.Cleanup() 36 f := CurrentGinkgoTestDescription() 37 processTestResult(f) 38 39 }) 40 41 It("podman container prune containers", func() { 42 top := podmanTest.RunTopContainer("") 43 top.WaitWithDefaultTimeout() 44 Expect(top.ExitCode()).To(Equal(0)) 45 46 top = podmanTest.RunTopContainer("") 47 top.WaitWithDefaultTimeout() 48 Expect(top.ExitCode()).To(Equal(0)) 49 cid := top.OutputToString() 50 51 stop := podmanTest.Podman([]string{"stop", cid}) 52 stop.WaitWithDefaultTimeout() 53 Expect(stop.ExitCode()).To(Equal(0)) 54 55 prune := podmanTest.Podman([]string{"container", "prune", "-f"}) 56 prune.WaitWithDefaultTimeout() 57 Expect(prune.ExitCode()).To(Equal(0)) 58 59 Expect(podmanTest.NumberOfContainers()).To(Equal(1)) 60 }) 61 62 It("podman container prune after create containers", func() { 63 create := podmanTest.Podman([]string{"create", "--name", "test", BB}) 64 create.WaitWithDefaultTimeout() 65 Expect(create.ExitCode()).To(Equal(0)) 66 67 prune := podmanTest.Podman([]string{"container", "prune", "-f"}) 68 prune.WaitWithDefaultTimeout() 69 Expect(prune.ExitCode()).To(Equal(0)) 70 71 Expect(podmanTest.NumberOfContainers()).To(Equal(0)) 72 }) 73 74 It("podman container prune after create & init containers", func() { 75 create := podmanTest.Podman([]string{"create", "--name", "test", BB}) 76 create.WaitWithDefaultTimeout() 77 Expect(create.ExitCode()).To(Equal(0)) 78 79 init := podmanTest.Podman([]string{"init", "test"}) 80 init.WaitWithDefaultTimeout() 81 Expect(init.ExitCode()).To(Equal(0)) 82 83 prune := podmanTest.Podman([]string{"container", "prune", "-f"}) 84 prune.WaitWithDefaultTimeout() 85 Expect(prune.ExitCode()).To(Equal(0)) 86 87 Expect(podmanTest.NumberOfContainers()).To(Equal(0)) 88 }) 89 90 It("podman image prune skip cache images", func() { 91 SkipIfRemote("FIXME: podman-remote build is not working the same as local build") 92 podmanTest.BuildImage(pruneImage, "alpine_bash:latest", "true") 93 94 none := podmanTest.Podman([]string{"images", "-a"}) 95 none.WaitWithDefaultTimeout() 96 Expect(none.ExitCode()).To(Equal(0)) 97 hasNone, _ := none.GrepString("<none>") 98 Expect(hasNone).To(BeTrue()) 99 100 prune := podmanTest.Podman([]string{"image", "prune", "-f"}) 101 prune.WaitWithDefaultTimeout() 102 Expect(prune.ExitCode()).To(Equal(0)) 103 104 after := podmanTest.Podman([]string{"images", "-a"}) 105 after.WaitWithDefaultTimeout() 106 Expect(none.ExitCode()).To(Equal(0)) 107 hasNoneAfter, _ := after.GrepString("<none>") 108 Expect(hasNoneAfter).To(BeTrue()) 109 Expect(len(after.OutputToStringArray()) > 1).To(BeTrue()) 110 }) 111 112 It("podman image prune dangling images", func() { 113 SkipIfRemote("FIXME: podman-remote build is not working the same as local build") 114 podmanTest.BuildImage(pruneImage, "alpine_bash:latest", "true") 115 podmanTest.BuildImage(pruneImage, "alpine_bash:latest", "true") 116 117 none := podmanTest.Podman([]string{"images", "-a"}) 118 none.WaitWithDefaultTimeout() 119 Expect(none.ExitCode()).To(Equal(0)) 120 hasNone, result := none.GrepString("<none>") 121 Expect(len(result)).To(Equal(2)) 122 Expect(hasNone).To(BeTrue()) 123 124 prune := podmanTest.Podman([]string{"image", "prune", "-f"}) 125 prune.WaitWithDefaultTimeout() 126 Expect(prune.ExitCode()).To(Equal(0)) 127 128 after := podmanTest.Podman([]string{"images", "-a"}) 129 after.WaitWithDefaultTimeout() 130 Expect(none.ExitCode()).To(Equal(0)) 131 hasNoneAfter, result := none.GrepString("<none>") 132 Expect(hasNoneAfter).To(BeTrue()) 133 Expect(len(after.OutputToStringArray()) > 1).To(BeTrue()) 134 Expect(len(result) > 0).To(BeTrue()) 135 }) 136 137 It("podman image prune unused images", func() { 138 podmanTest.AddImageToRWStore(ALPINE) 139 podmanTest.AddImageToRWStore(BB) 140 prune := podmanTest.Podman([]string{"image", "prune", "-af"}) 141 prune.WaitWithDefaultTimeout() 142 Expect(prune.ExitCode()).To(Equal(0)) 143 144 images := podmanTest.Podman([]string{"images", "-aq"}) 145 images.WaitWithDefaultTimeout() 146 // all images are unused, so they all should be deleted! 147 Expect(len(images.OutputToStringArray())).To(Equal(len(CACHE_IMAGES))) 148 }) 149 150 It("podman system image prune unused images", func() { 151 podmanTest.AddImageToRWStore(ALPINE) 152 podmanTest.BuildImage(pruneImage, "alpine_bash:latest", "true") 153 prune := podmanTest.Podman([]string{"system", "prune", "-a", "--force"}) 154 prune.WaitWithDefaultTimeout() 155 Expect(prune.ExitCode()).To(Equal(0)) 156 157 images := podmanTest.Podman([]string{"images", "-aq"}) 158 images.WaitWithDefaultTimeout() 159 // all images are unused, so they all should be deleted! 160 Expect(len(images.OutputToStringArray())).To(Equal(len(CACHE_IMAGES))) 161 }) 162 163 It("podman system prune pods", func() { 164 session := podmanTest.Podman([]string{"pod", "create"}) 165 session.WaitWithDefaultTimeout() 166 Expect(session.ExitCode()).To(Equal(0)) 167 168 session = podmanTest.Podman([]string{"pod", "create"}) 169 session.WaitWithDefaultTimeout() 170 Expect(session.ExitCode()).To(Equal(0)) 171 podid1 := session.OutputToString() 172 173 session = podmanTest.Podman([]string{"pod", "start", podid1}) 174 session.WaitWithDefaultTimeout() 175 Expect(session.ExitCode()).To(Equal(0)) 176 177 session = podmanTest.Podman([]string{"pod", "stop", podid1}) 178 session.WaitWithDefaultTimeout() 179 Expect(session.ExitCode()).To(Equal(0)) 180 181 pods := podmanTest.Podman([]string{"pod", "ps"}) 182 pods.WaitWithDefaultTimeout() 183 Expect(pods.ExitCode()).To(Equal(0)) 184 Expect(len(pods.OutputToStringArray())).To(Equal(3)) 185 186 prune := podmanTest.Podman([]string{"system", "prune", "-f"}) 187 prune.WaitWithDefaultTimeout() 188 Expect(prune.ExitCode()).To(Equal(0)) 189 190 pods = podmanTest.Podman([]string{"pod", "ps"}) 191 pods.WaitWithDefaultTimeout() 192 Expect(pods.ExitCode()).To(Equal(0)) 193 Expect(len(pods.OutputToStringArray())).To(Equal(2)) 194 }) 195 196 It("podman system prune - pod,container stopped", func() { 197 session := podmanTest.Podman([]string{"pod", "create"}) 198 session.WaitWithDefaultTimeout() 199 Expect(session.ExitCode()).To(Equal(0)) 200 podid1 := session.OutputToString() 201 202 // Start and stop a pod to get it in exited state. 203 session = podmanTest.Podman([]string{"pod", "start", podid1}) 204 session.WaitWithDefaultTimeout() 205 Expect(session.ExitCode()).To(Equal(0)) 206 207 session = podmanTest.Podman([]string{"pod", "stop", podid1}) 208 session.WaitWithDefaultTimeout() 209 Expect(session.ExitCode()).To(Equal(0)) 210 211 // Create a container. This container should be pruned. 212 create := podmanTest.Podman([]string{"create", "--name", "test", BB}) 213 create.WaitWithDefaultTimeout() 214 Expect(create.ExitCode()).To(Equal(0)) 215 216 prune := podmanTest.Podman([]string{"system", "prune", "-f"}) 217 prune.WaitWithDefaultTimeout() 218 Expect(prune.ExitCode()).To(Equal(0)) 219 220 pods := podmanTest.Podman([]string{"pod", "ps"}) 221 pods.WaitWithDefaultTimeout() 222 Expect(pods.ExitCode()).To(Equal(0)) 223 Expect(podmanTest.NumberOfPods()).To(Equal(0)) 224 225 Expect(podmanTest.NumberOfContainers()).To(Equal(0)) 226 }) 227 228 It("podman system prune with running, exited pod and volume prune set true", func() { 229 // Start and stop a pod to get it in exited state. 230 session := podmanTest.Podman([]string{"pod", "create"}) 231 session.WaitWithDefaultTimeout() 232 Expect(session.ExitCode()).To(Equal(0)) 233 podid1 := session.OutputToString() 234 235 session = podmanTest.Podman([]string{"pod", "start", podid1}) 236 session.WaitWithDefaultTimeout() 237 Expect(session.ExitCode()).To(Equal(0)) 238 239 session = podmanTest.Podman([]string{"pod", "stop", podid1}) 240 session.WaitWithDefaultTimeout() 241 Expect(session.ExitCode()).To(Equal(0)) 242 243 // Start a pod and leave it running 244 session = podmanTest.Podman([]string{"pod", "create"}) 245 session.WaitWithDefaultTimeout() 246 Expect(session.ExitCode()).To(Equal(0)) 247 podid2 := session.OutputToString() 248 249 session = podmanTest.Podman([]string{"pod", "start", podid2}) 250 session.WaitWithDefaultTimeout() 251 Expect(session.ExitCode()).To(Equal(0)) 252 253 // Number of pod should be 2. One exited one running. 254 Expect(podmanTest.NumberOfPods()).To(Equal(2)) 255 256 // Create a container. This container should be pruned. 257 _, ec, _ := podmanTest.RunLsContainer("test1") 258 Expect(ec).To(Equal(0)) 259 260 // Number of containers should be three now. 261 // Two as pods infra container and one newly created. 262 Expect(podmanTest.NumberOfContainers()).To(Equal(3)) 263 264 // image list current count should not be pruned if all flag isn't enabled 265 session = podmanTest.Podman([]string{"images"}) 266 session.WaitWithDefaultTimeout() 267 numberOfImages := len(session.OutputToStringArray()) 268 269 // Adding unused volume should be pruned 270 session = podmanTest.Podman([]string{"volume", "create"}) 271 session.WaitWithDefaultTimeout() 272 Expect(session.ExitCode()).To(Equal(0)) 273 274 session = podmanTest.Podman([]string{"create", "-v", "myvol:/myvol", ALPINE, "ls"}) 275 session.WaitWithDefaultTimeout() 276 Expect(session.ExitCode()).To(Equal(0)) 277 278 session = podmanTest.Podman([]string{"volume", "ls"}) 279 session.WaitWithDefaultTimeout() 280 Expect(session.ExitCode()).To(Equal(0)) 281 Expect(len(session.OutputToStringArray())).To(Equal(3)) 282 283 session = podmanTest.Podman([]string{"system", "prune", "--force", "--volumes"}) 284 session.WaitWithDefaultTimeout() 285 Expect(session.ExitCode()).To(Equal(0)) 286 287 // Volumes should be pruned. 288 session = podmanTest.Podman([]string{"volume", "ls"}) 289 session.WaitWithDefaultTimeout() 290 Expect(session.ExitCode()).To(Equal(0)) 291 Expect(len(session.OutputToStringArray())).To(Equal(0)) 292 293 // One Pod should not be pruned as it was running 294 Expect(podmanTest.NumberOfPods()).To(Equal(1)) 295 296 // Running pods infra container should not be pruned. 297 Expect(podmanTest.NumberOfContainers()).To(Equal(1)) 298 299 // Image should not be pruned and number should be same. 300 images := podmanTest.Podman([]string{"images"}) 301 images.WaitWithDefaultTimeout() 302 Expect(len(images.OutputToStringArray())).To(Equal(numberOfImages)) 303 }) 304 305 It("podman system prune - with dangling images true", func() { 306 session := podmanTest.Podman([]string{"pod", "create"}) 307 session.WaitWithDefaultTimeout() 308 Expect(session.ExitCode()).To(Equal(0)) 309 podid1 := session.OutputToString() 310 311 // Start and stop a pod to get it in exited state. 312 session = podmanTest.Podman([]string{"pod", "start", podid1}) 313 session.WaitWithDefaultTimeout() 314 Expect(session.ExitCode()).To(Equal(0)) 315 316 session = podmanTest.Podman([]string{"pod", "stop", podid1}) 317 session.WaitWithDefaultTimeout() 318 Expect(session.ExitCode()).To(Equal(0)) 319 320 // Create a container. This container should be pruned. 321 create := podmanTest.Podman([]string{"create", "--name", "test", BB}) 322 create.WaitWithDefaultTimeout() 323 Expect(create.ExitCode()).To(Equal(0)) 324 325 // Adding unused volume should not be pruned as volumes not set 326 session = podmanTest.Podman([]string{"volume", "create"}) 327 session.WaitWithDefaultTimeout() 328 Expect(session.ExitCode()).To(Equal(0)) 329 330 prune := podmanTest.Podman([]string{"system", "prune", "-f", "-a"}) 331 prune.WaitWithDefaultTimeout() 332 Expect(prune.ExitCode()).To(Equal(0)) 333 334 pods := podmanTest.Podman([]string{"pod", "ps"}) 335 pods.WaitWithDefaultTimeout() 336 Expect(pods.ExitCode()).To(Equal(0)) 337 Expect(podmanTest.NumberOfPods()).To(Equal(0)) 338 339 Expect(podmanTest.NumberOfContainers()).To(Equal(0)) 340 341 // Volumes should not be pruned 342 session = podmanTest.Podman([]string{"volume", "ls"}) 343 session.WaitWithDefaultTimeout() 344 Expect(session.ExitCode()).To(Equal(0)) 345 Expect(len(session.OutputToStringArray())).To(Equal(2)) 346 347 images := podmanTest.Podman([]string{"images", "-aq"}) 348 images.WaitWithDefaultTimeout() 349 // all images are unused, so they all should be deleted! 350 Expect(len(images.OutputToStringArray())).To(Equal(len(CACHE_IMAGES))) 351 }) 352 })