github.com/containers/podman/v2@v2.2.2-0.20210501105131-c1e07d070c4c/pkg/bindings/test/system_test.go (about)

     1  package test_bindings
     2  
     3  import (
     4  	"sync"
     5  	"time"
     6  
     7  	"github.com/containers/podman/v2/pkg/bindings"
     8  	"github.com/containers/podman/v2/pkg/bindings/containers"
     9  	"github.com/containers/podman/v2/pkg/bindings/pods"
    10  	"github.com/containers/podman/v2/pkg/bindings/system"
    11  	"github.com/containers/podman/v2/pkg/bindings/volumes"
    12  	"github.com/containers/podman/v2/pkg/domain/entities"
    13  	. "github.com/onsi/ginkgo"
    14  	. "github.com/onsi/gomega"
    15  	"github.com/onsi/gomega/gexec"
    16  )
    17  
    18  var _ = Describe("Podman system", func() {
    19  	var (
    20  		bt     *bindingTest
    21  		s      *gexec.Session
    22  		newpod string
    23  	)
    24  
    25  	BeforeEach(func() {
    26  		bt = newBindingTest()
    27  		bt.RestoreImagesFromCache()
    28  		newpod = "newpod"
    29  		bt.Podcreate(&newpod)
    30  		s = bt.startAPIService()
    31  		time.Sleep(1 * time.Second)
    32  		err := bt.NewConnection()
    33  		Expect(err).To(BeNil())
    34  	})
    35  
    36  	AfterEach(func() {
    37  		s.Kill()
    38  		bt.cleanup()
    39  	})
    40  
    41  	It("podman events", func() {
    42  		var name = "top"
    43  		_, err := bt.RunTopContainer(&name, bindings.PFalse, nil)
    44  		Expect(err).To(BeNil())
    45  
    46  		filters := make(map[string][]string)
    47  		filters["container"] = []string{name}
    48  
    49  		binChan := make(chan entities.Event)
    50  		done := sync.Mutex{}
    51  		done.Lock()
    52  		eventCounter := 0
    53  		go func() {
    54  			defer done.Unlock()
    55  			for range binChan {
    56  				eventCounter++
    57  			}
    58  		}()
    59  
    60  		err = system.Events(bt.conn, binChan, nil, nil, nil, filters, bindings.PFalse)
    61  		Expect(err).To(BeNil())
    62  		done.Lock()
    63  		Expect(eventCounter).To(BeNumerically(">", 0))
    64  	})
    65  
    66  	It("podman system prune - pod,container stopped", func() {
    67  		// Start and stop a pod to enter in exited state.
    68  		_, err := pods.Start(bt.conn, newpod)
    69  		Expect(err).To(BeNil())
    70  		_, err = pods.Stop(bt.conn, newpod, nil)
    71  		Expect(err).To(BeNil())
    72  		// Start and stop a container to enter in exited state.
    73  		var name = "top"
    74  		_, err = bt.RunTopContainer(&name, bindings.PFalse, nil)
    75  		Expect(err).To(BeNil())
    76  		err = containers.Stop(bt.conn, name, nil)
    77  		Expect(err).To(BeNil())
    78  
    79  		systemPruneResponse, err := system.Prune(bt.conn, bindings.PTrue, bindings.PFalse)
    80  		Expect(err).To(BeNil())
    81  		Expect(len(systemPruneResponse.PodPruneReport)).To(Equal(1))
    82  		Expect(len(systemPruneResponse.ContainerPruneReport.ID)).To(Equal(1))
    83  		Expect(len(systemPruneResponse.ImagePruneReport.Report.Id)).
    84  			To(BeNumerically(">", 0))
    85  		Expect(systemPruneResponse.ImagePruneReport.Report.Id).
    86  			To(ContainElement("docker.io/library/alpine:latest"))
    87  		Expect(len(systemPruneResponse.VolumePruneReport)).To(Equal(0))
    88  	})
    89  
    90  	It("podman system prune running alpine container", func() {
    91  		// Start and stop a pod to enter in exited state.
    92  		_, err := pods.Start(bt.conn, newpod)
    93  		Expect(err).To(BeNil())
    94  		_, err = pods.Stop(bt.conn, newpod, nil)
    95  		Expect(err).To(BeNil())
    96  
    97  		// Start and stop a container to enter in exited state.
    98  		var name = "top"
    99  		_, err = bt.RunTopContainer(&name, bindings.PFalse, nil)
   100  		Expect(err).To(BeNil())
   101  		err = containers.Stop(bt.conn, name, nil)
   102  		Expect(err).To(BeNil())
   103  
   104  		// Start container and leave in running
   105  		var name2 = "top2"
   106  		_, err = bt.RunTopContainer(&name2, bindings.PFalse, nil)
   107  		Expect(err).To(BeNil())
   108  
   109  		// Adding an unused volume
   110  		_, err = volumes.Create(bt.conn, entities.VolumeCreateOptions{})
   111  		Expect(err).To(BeNil())
   112  
   113  		systemPruneResponse, err := system.Prune(bt.conn, bindings.PTrue, bindings.PFalse)
   114  		Expect(err).To(BeNil())
   115  		Expect(len(systemPruneResponse.PodPruneReport)).To(Equal(1))
   116  		Expect(len(systemPruneResponse.ContainerPruneReport.ID)).To(Equal(1))
   117  		Expect(len(systemPruneResponse.ImagePruneReport.Report.Id)).
   118  			To(BeNumerically(">", 0))
   119  		// Alpine image should not be pruned as used by running container
   120  		Expect(systemPruneResponse.ImagePruneReport.Report.Id).
   121  			ToNot(ContainElement("docker.io/library/alpine:latest"))
   122  		// Though unused volume is available it should not be pruned as flag set to false.
   123  		Expect(len(systemPruneResponse.VolumePruneReport)).To(Equal(0))
   124  	})
   125  
   126  	It("podman system prune running alpine container volume prune", func() {
   127  		// Start a pod and leave it running
   128  		_, err := pods.Start(bt.conn, newpod)
   129  		Expect(err).To(BeNil())
   130  
   131  		// Start and stop a container to enter in exited state.
   132  		var name = "top"
   133  		_, err = bt.RunTopContainer(&name, bindings.PFalse, nil)
   134  		Expect(err).To(BeNil())
   135  		err = containers.Stop(bt.conn, name, nil)
   136  		Expect(err).To(BeNil())
   137  
   138  		// Start second container and leave in running
   139  		var name2 = "top2"
   140  		_, err = bt.RunTopContainer(&name2, bindings.PFalse, nil)
   141  		Expect(err).To(BeNil())
   142  
   143  		// Adding an unused volume should work
   144  		_, err = volumes.Create(bt.conn, entities.VolumeCreateOptions{})
   145  		Expect(err).To(BeNil())
   146  
   147  		systemPruneResponse, err := system.Prune(bt.conn, bindings.PTrue, bindings.PTrue)
   148  		Expect(err).To(BeNil())
   149  		Expect(len(systemPruneResponse.PodPruneReport)).To(Equal(0))
   150  		Expect(len(systemPruneResponse.ContainerPruneReport.ID)).To(Equal(1))
   151  		Expect(len(systemPruneResponse.ImagePruneReport.Report.Id)).
   152  			To(BeNumerically(">", 0))
   153  		// Alpine image should not be pruned as used by running container
   154  		Expect(systemPruneResponse.ImagePruneReport.Report.Id).
   155  			ToNot(ContainElement("docker.io/library/alpine:latest"))
   156  		// Volume should be pruned now as flag set true
   157  		Expect(len(systemPruneResponse.VolumePruneReport)).To(Equal(1))
   158  	})
   159  })