github.com/AbhinandanKurakure/podman/v3@v3.4.10/test/e2e/rmi_test.go (about) 1 package integration 2 3 import ( 4 "fmt" 5 "os" 6 "sync" 7 8 . "github.com/containers/podman/v3/test/utils" 9 . "github.com/onsi/ginkgo" 10 . "github.com/onsi/gomega" 11 . "github.com/onsi/gomega/gexec" 12 ) 13 14 var _ = Describe("Podman rmi", func() { 15 var ( 16 tempdir string 17 err error 18 podmanTest *PodmanTestIntegration 19 ) 20 21 BeforeEach(func() { 22 tempdir, err = CreateTempDirInTempDir() 23 if err != nil { 24 os.Exit(1) 25 } 26 podmanTest = PodmanTestCreate(tempdir) 27 podmanTest.Setup() 28 }) 29 30 AfterEach(func() { 31 podmanTest.Cleanup() 32 f := CurrentGinkgoTestDescription() 33 processTestResult(f) 34 35 }) 36 37 It("podman rmi bogus image", func() { 38 session := podmanTest.Podman([]string{"rmi", "debian:6.0.10"}) 39 session.WaitWithDefaultTimeout() 40 Expect(session).Should(Exit(1)) 41 42 }) 43 44 It("podman rmi with fq name", func() { 45 podmanTest.AddImageToRWStore(ALPINE) 46 session := podmanTest.Podman([]string{"rmi", ALPINE}) 47 session.WaitWithDefaultTimeout() 48 Expect(session).Should(Exit(0)) 49 50 }) 51 52 It("podman rmi with short name", func() { 53 podmanTest.AddImageToRWStore(cirros) 54 session := podmanTest.Podman([]string{"rmi", "cirros"}) 55 session.WaitWithDefaultTimeout() 56 Expect(session).Should(Exit(0)) 57 58 }) 59 60 It("podman rmi all images", func() { 61 podmanTest.AddImageToRWStore(nginx) 62 session := podmanTest.Podman([]string{"rmi", "-a"}) 63 session.WaitWithDefaultTimeout() 64 images := podmanTest.Podman([]string{"images"}) 65 images.WaitWithDefaultTimeout() 66 Expect(session).Should(Exit(0)) 67 68 }) 69 70 It("podman rmi all images forcibly with short options", func() { 71 podmanTest.AddImageToRWStore(nginx) 72 session := podmanTest.Podman([]string{"rmi", "-fa"}) 73 session.WaitWithDefaultTimeout() 74 Expect(session).Should(Exit(0)) 75 76 }) 77 78 It("podman rmi tagged image", func() { 79 podmanTest.AddImageToRWStore(cirros) 80 setup := podmanTest.Podman([]string{"images", "-q", cirros}) 81 setup.WaitWithDefaultTimeout() 82 Expect(setup).Should(Exit(0)) 83 84 session := podmanTest.Podman([]string{"tag", cirros, "foo:bar", "foo"}) 85 session.WaitWithDefaultTimeout() 86 Expect(session).Should(Exit(0)) 87 88 result := podmanTest.Podman([]string{"images", "-q", "foo"}) 89 result.WaitWithDefaultTimeout() 90 Expect(result).Should(Exit(0)) 91 92 Expect(result.LineInOutputContains(setup.OutputToString())).To(BeTrue()) 93 }) 94 95 It("podman rmi image with tags by ID cannot be done without force", func() { 96 podmanTest.AddImageToRWStore(cirros) 97 setup := podmanTest.Podman([]string{"images", "-q", cirros}) 98 setup.WaitWithDefaultTimeout() 99 Expect(setup).Should(Exit(0)) 100 cirrosId := setup.OutputToString() 101 102 session := podmanTest.Podman([]string{"tag", "cirros", "foo:bar", "foo"}) 103 session.WaitWithDefaultTimeout() 104 Expect(session).Should(Exit(0)) 105 106 // Trying without --force should fail 107 result := podmanTest.Podman([]string{"rmi", cirrosId}) 108 result.WaitWithDefaultTimeout() 109 Expect(result).To(ExitWithError()) 110 111 // With --force it should work 112 resultForce := podmanTest.Podman([]string{"rmi", "-f", cirrosId}) 113 resultForce.WaitWithDefaultTimeout() 114 Expect(resultForce).Should(Exit(0)) 115 }) 116 117 It("podman rmi image that is a parent of another image", func() { 118 Skip("I need help with this one. i don't understand what is going on") 119 podmanTest.AddImageToRWStore(cirros) 120 session := podmanTest.Podman([]string{"run", "--name", "c_test", cirros, "true"}) 121 session.WaitWithDefaultTimeout() 122 Expect(session).Should(Exit(0)) 123 124 session = podmanTest.Podman([]string{"commit", "-q", "c_test", "test"}) 125 session.WaitWithDefaultTimeout() 126 Expect(session).Should(Exit(0)) 127 128 session = podmanTest.Podman([]string{"rm", "c_test"}) 129 session.WaitWithDefaultTimeout() 130 Expect(session).Should(Exit(0)) 131 132 session = podmanTest.Podman([]string{"rmi", cirros}) 133 session.WaitWithDefaultTimeout() 134 Expect(session).Should(Exit(0)) 135 136 session = podmanTest.Podman([]string{"images", "-q"}) 137 session.WaitWithDefaultTimeout() 138 Expect(session).Should(Exit(0)) 139 Expect(len(session.OutputToStringArray())).To(Equal(12)) 140 141 session = podmanTest.Podman([]string{"images", "--sort", "created", "--format", "{{.Id}}", "--all"}) 142 session.WaitWithDefaultTimeout() 143 Expect(session).Should(Exit(0)) 144 Expect(len(session.OutputToStringArray())).To(Equal(13), 145 "Output from 'podman images -q -a':'%s'", session.Out.Contents()) 146 untaggedImg := session.OutputToStringArray()[1] 147 148 session = podmanTest.Podman([]string{"rmi", "-f", untaggedImg}) 149 session.WaitWithDefaultTimeout() 150 Expect(session).Should(Exit(2), "UntaggedImg is '%s'", untaggedImg) 151 }) 152 153 It("podman rmi image that is created from another named imaged", func() { 154 podmanTest.AddImageToRWStore(ALPINE) 155 session := podmanTest.Podman([]string{"create", "--name", "c_test1", ALPINE, "true"}) 156 session.WaitWithDefaultTimeout() 157 Expect(session).Should(Exit(0)) 158 159 session = podmanTest.Podman([]string{"commit", "-q", "c_test1", "test1"}) 160 session.WaitWithDefaultTimeout() 161 Expect(session).Should(Exit(0)) 162 163 session = podmanTest.Podman([]string{"create", "--name", "c_test2", "test1", "true"}) 164 session.WaitWithDefaultTimeout() 165 Expect(session).Should(Exit(0)) 166 167 session = podmanTest.Podman([]string{"commit", "-q", "c_test2", "test2"}) 168 session.WaitWithDefaultTimeout() 169 Expect(session).Should(Exit(0)) 170 171 session = podmanTest.Podman([]string{"rm", "-a"}) 172 session.WaitWithDefaultTimeout() 173 Expect(session).Should(Exit(0)) 174 175 session = podmanTest.Podman([]string{"rmi", "test2"}) 176 session.WaitWithDefaultTimeout() 177 Expect(session).Should(Exit(0)) 178 179 session = podmanTest.Podman([]string{"images", "-q"}) 180 session.WaitWithDefaultTimeout() 181 Expect(session).Should(Exit(0)) 182 Expect(len(session.OutputToStringArray())).To(Equal(len(CACHE_IMAGES) + 1)) 183 }) 184 185 It("podman rmi with cached images", func() { 186 podmanTest.AddImageToRWStore(cirros) 187 dockerfile := fmt.Sprintf(`FROM %s 188 RUN mkdir hello 189 RUN touch test.txt 190 ENV foo=bar 191 `, cirros) 192 podmanTest.BuildImage(dockerfile, "test", "true") 193 194 dockerfile = fmt.Sprintf(`FROM %s 195 RUN mkdir hello 196 RUN touch test.txt 197 RUN mkdir blah 198 ENV foo=bar 199 `, cirros) 200 201 podmanTest.BuildImage(dockerfile, "test2", "true") 202 203 session := podmanTest.Podman([]string{"images", "-q", "-a"}) 204 session.WaitWithDefaultTimeout() 205 Expect(session).Should(Exit(0)) 206 numOfImages := len(session.OutputToStringArray()) 207 208 session = podmanTest.Podman([]string{"rmi", "test2"}) 209 session.WaitWithDefaultTimeout() 210 Expect(session).Should(Exit(0)) 211 212 session = podmanTest.Podman([]string{"images", "-q", "-a"}) 213 session.WaitWithDefaultTimeout() 214 Expect(session).Should(Exit(0)) 215 Expect(numOfImages - len(session.OutputToStringArray())).To(Equal(2)) 216 217 session = podmanTest.Podman([]string{"rmi", "test"}) 218 session.WaitWithDefaultTimeout() 219 Expect(session).Should(Exit(0)) 220 221 session = podmanTest.Podman([]string{"images", "-q", "-a"}) 222 session.WaitWithDefaultTimeout() 223 Expect(session).Should(Exit(0)) 224 Expect(len(session.OutputToStringArray())).To(Equal(len(CACHE_IMAGES) + 1)) 225 226 podmanTest.BuildImage(dockerfile, "test3", "true") 227 228 session = podmanTest.Podman([]string{"rmi", cirros}) 229 session.WaitWithDefaultTimeout() 230 Expect(session).Should(Exit(0)) 231 232 session = podmanTest.Podman([]string{"rmi", "test3"}) 233 session.WaitWithDefaultTimeout() 234 Expect(session).Should(Exit(0)) 235 236 session = podmanTest.Podman([]string{"images", "-q", "-a"}) 237 session.WaitWithDefaultTimeout() 238 Expect(session).Should(Exit(0)) 239 Expect(len(session.OutputToString())).To(Equal(155)) 240 }) 241 242 It("podman rmi -a with no images should be exit 0", func() { 243 session := podmanTest.Podman([]string{"rmi", "-fa"}) 244 session.WaitWithDefaultTimeout() 245 Expect(session).Should(Exit(0)) 246 247 session2 := podmanTest.Podman([]string{"rmi", "-fa"}) 248 session2.WaitWithDefaultTimeout() 249 Expect(session2).Should(Exit(0)) 250 }) 251 252 It("podman rmi -a with parent|child images", func() { 253 podmanTest.AddImageToRWStore(cirros) 254 dockerfile := fmt.Sprintf(`FROM %s AS base 255 RUN touch /1 256 ENV LOCAL=/1 257 RUN find $LOCAL 258 FROM base 259 RUN find $LOCAL 260 261 `, cirros) 262 podmanTest.BuildImage(dockerfile, "test", "true") 263 session := podmanTest.Podman([]string{"rmi", "-a"}) 264 session.WaitWithDefaultTimeout() 265 Expect(session).Should(Exit(0)) 266 267 images := podmanTest.Podman([]string{"images", "-aq"}) 268 images.WaitWithDefaultTimeout() 269 Expect(images).Should(Exit(0)) 270 Expect(len(images.OutputToStringArray())).To(Equal(len(CACHE_IMAGES))) 271 }) 272 273 // Don't rerun all tests; just assume that if we get that diagnostic, 274 // we're getting rmi 275 It("podman image rm is the same as rmi", func() { 276 session := podmanTest.Podman([]string{"image", "rm"}) 277 session.WaitWithDefaultTimeout() 278 Expect(session).Should(Exit(125)) 279 match, _ := session.ErrorGrepString("image name or ID must be specified") 280 Expect(match).To(BeTrue()) 281 }) 282 283 It("podman image rm - concurrent with shared layers", func() { 284 // #6510 has shown a fairly simple reproducer to force storage 285 // errors during parallel image removal. Since it's subject to 286 // a race, we may not hit the condition a 100 percent of times 287 // but ocal reproducers hit it all the time. 288 289 podmanTest.AddImageToRWStore(cirros) 290 var wg sync.WaitGroup 291 292 buildAndRemove := func(i int) { 293 defer GinkgoRecover() 294 defer wg.Done() 295 imageName := fmt.Sprintf("rmtest:%d", i) 296 containerfile := fmt.Sprintf(`FROM %s 297 RUN touch %s`, cirros, imageName) 298 299 podmanTest.BuildImage(containerfile, imageName, "false") 300 session := podmanTest.Podman([]string{"rmi", "-f", imageName}) 301 session.WaitWithDefaultTimeout() 302 Expect(session).Should(Exit(0)) 303 } 304 305 wg.Add(10) 306 for i := 0; i < 10; i++ { 307 go buildAndRemove(i) 308 } 309 wg.Wait() 310 }) 311 })