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