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