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  })