github.com/containers/podman/v2@v2.2.2-0.20210501105131-c1e07d070c4c/pkg/bindings/test/pods_test.go (about) 1 package test_bindings 2 3 import ( 4 "net/http" 5 "strings" 6 "time" 7 8 "github.com/containers/podman/v2/libpod/define" 9 "github.com/containers/podman/v2/pkg/bindings" 10 "github.com/containers/podman/v2/pkg/bindings/pods" 11 "github.com/containers/podman/v2/pkg/specgen" 12 . "github.com/onsi/ginkgo" 13 . "github.com/onsi/gomega" 14 "github.com/onsi/gomega/gexec" 15 ) 16 17 var _ = Describe("Podman pods", func() { 18 var ( 19 bt *bindingTest 20 s *gexec.Session 21 newpod string 22 err error 23 ) 24 25 BeforeEach(func() { 26 bt = newBindingTest() 27 newpod = "newpod" 28 bt.RestoreImagesFromCache() 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("inspect pod", func() { 42 //Inspect an invalid pod name 43 _, err := pods.Inspect(bt.conn, "dummyname") 44 Expect(err).ToNot(BeNil()) 45 code, _ := bindings.CheckResponseCode(err) 46 Expect(code).To(BeNumerically("==", http.StatusNotFound)) 47 48 //Inspect an valid pod name 49 response, err := pods.Inspect(bt.conn, newpod) 50 Expect(err).To(BeNil()) 51 Expect(response.Name).To(Equal(newpod)) 52 }) 53 54 // Test validates the list all api returns 55 It("list pod", func() { 56 //List all the pods in the current instance 57 podSummary, err := pods.List(bt.conn, nil) 58 Expect(err).To(BeNil()) 59 Expect(len(podSummary)).To(Equal(1)) 60 61 // Start the pod 62 _, err = pods.Start(bt.conn, newpod) 63 Expect(err).To(BeNil()) 64 65 // Adding an alpine container to the existing pod 66 _, err = bt.RunTopContainer(nil, bindings.PTrue, &newpod) 67 Expect(err).To(BeNil()) 68 podSummary, err = pods.List(bt.conn, nil) 69 // Verify no errors. 70 Expect(err).To(BeNil()) 71 // Verify number of containers in the pod. 72 Expect(len(podSummary[0].Containers)).To(Equal(2)) 73 74 // Add multiple pods and verify them by name and size. 75 var newpod2 string = "newpod2" 76 bt.Podcreate(&newpod2) 77 podSummary, err = pods.List(bt.conn, nil) 78 Expect(len(podSummary)).To(Equal(2)) 79 var names []string 80 for _, i := range podSummary { 81 names = append(names, i.Name) 82 } 83 Expect(StringInSlice(newpod, names)).To(BeTrue()) 84 Expect(StringInSlice("newpod2", names)).To(BeTrue()) 85 }) 86 87 // The test validates the list pod endpoint with passing filters as the params. 88 It("List pods with filters", func() { 89 newpod2 := "newpod2" 90 bt.Podcreate(&newpod2) 91 92 // Start the pod 93 _, err = pods.Start(bt.conn, newpod) 94 Expect(err).To(BeNil()) 95 96 _, err = bt.RunTopContainer(nil, bindings.PTrue, &newpod) 97 Expect(err).To(BeNil()) 98 99 // Expected err with invalid filter params 100 filters := make(map[string][]string) 101 filters["dummy"] = []string{"dummy"} 102 filteredPods, err := pods.List(bt.conn, filters) 103 Expect(err).ToNot(BeNil()) 104 code, _ := bindings.CheckResponseCode(err) 105 Expect(code).To(BeNumerically("==", http.StatusInternalServerError)) 106 107 // Expected empty response with invalid filters 108 filters = make(map[string][]string) 109 filters["name"] = []string{"dummy"} 110 filteredPods, err = pods.List(bt.conn, filters) 111 Expect(err).To(BeNil()) 112 Expect(len(filteredPods)).To(BeNumerically("==", 0)) 113 114 // Validate list pod with name filter 115 filters = make(map[string][]string) 116 filters["name"] = []string{newpod2} 117 filteredPods, err = pods.List(bt.conn, filters) 118 Expect(err).To(BeNil()) 119 Expect(len(filteredPods)).To(BeNumerically("==", 1)) 120 var names []string 121 for _, i := range filteredPods { 122 names = append(names, i.Name) 123 } 124 Expect(StringInSlice("newpod2", names)).To(BeTrue()) 125 126 // Validate list pod with id filter 127 filters = make(map[string][]string) 128 response, err := pods.Inspect(bt.conn, newpod) 129 Expect(err).To(BeNil()) 130 id := response.ID 131 filters["id"] = []string{id} 132 filteredPods, err = pods.List(bt.conn, filters) 133 Expect(err).To(BeNil()) 134 Expect(len(filteredPods)).To(BeNumerically("==", 1)) 135 names = names[:0] 136 for _, i := range filteredPods { 137 names = append(names, i.Name) 138 } 139 Expect(StringInSlice("newpod", names)).To(BeTrue()) 140 141 // Using multiple filters 142 filters["name"] = []string{newpod} 143 filteredPods, err = pods.List(bt.conn, filters) 144 Expect(err).To(BeNil()) 145 Expect(len(filteredPods)).To(BeNumerically("==", 1)) 146 names = names[:0] 147 for _, i := range filteredPods { 148 names = append(names, i.Name) 149 } 150 Expect(StringInSlice("newpod", names)).To(BeTrue()) 151 }) 152 153 // The test validates if the exists responds 154 It("exists pod", func() { 155 response, err := pods.Exists(bt.conn, "dummyName") 156 Expect(err).To(BeNil()) 157 Expect(response).To(BeFalse()) 158 159 // Should exit with no error and response should be true 160 response, err = pods.Exists(bt.conn, "newpod") 161 Expect(err).To(BeNil()) 162 Expect(response).To(BeTrue()) 163 }) 164 165 // This test validates if All running containers within 166 // each specified pod are paused and unpaused 167 It("pause upause pod", func() { 168 // TODO fix this 169 Skip("Pod behavior is jacked right now.") 170 // Pause invalid container 171 _, err := pods.Pause(bt.conn, "dummyName") 172 Expect(err).ToNot(BeNil()) 173 code, _ := bindings.CheckResponseCode(err) 174 Expect(code).To(BeNumerically("==", http.StatusNotFound)) 175 176 // Adding an alpine container to the existing pod 177 _, err = bt.RunTopContainer(nil, bindings.PTrue, &newpod) 178 Expect(err).To(BeNil()) 179 180 // Binding needs to be modified to inspect the pod state. 181 // Since we don't have a pod state we inspect the states of the containers within the pod. 182 // Pause a valid container 183 _, err = pods.Pause(bt.conn, newpod) 184 Expect(err).To(BeNil()) 185 response, err := pods.Inspect(bt.conn, newpod) 186 Expect(err).To(BeNil()) 187 Expect(response.State).To(Equal(define.PodStatePaused)) 188 for _, i := range response.Containers { 189 Expect(define.StringToContainerStatus(i.State)). 190 To(Equal(define.ContainerStatePaused)) 191 } 192 193 // Unpause a valid container 194 _, err = pods.Unpause(bt.conn, newpod) 195 Expect(err).To(BeNil()) 196 response, err = pods.Inspect(bt.conn, newpod) 197 Expect(err).To(BeNil()) 198 Expect(response.State).To(Equal(define.PodStateRunning)) 199 for _, i := range response.Containers { 200 Expect(define.StringToContainerStatus(i.State)). 201 To(Equal(define.ContainerStateRunning)) 202 } 203 }) 204 205 It("start stop restart pod", func() { 206 // Start an invalid pod 207 _, err = pods.Start(bt.conn, "dummyName") 208 Expect(err).ToNot(BeNil()) 209 code, _ := bindings.CheckResponseCode(err) 210 Expect(code).To(BeNumerically("==", http.StatusNotFound)) 211 212 // Stop an invalid pod 213 _, err = pods.Stop(bt.conn, "dummyName", nil) 214 Expect(err).ToNot(BeNil()) 215 code, _ = bindings.CheckResponseCode(err) 216 Expect(code).To(BeNumerically("==", http.StatusNotFound)) 217 218 // Restart an invalid pod 219 _, err = pods.Restart(bt.conn, "dummyName") 220 Expect(err).ToNot(BeNil()) 221 code, _ = bindings.CheckResponseCode(err) 222 Expect(code).To(BeNumerically("==", http.StatusNotFound)) 223 224 // Start a valid pod and inspect status of each container 225 _, err = pods.Start(bt.conn, newpod) 226 Expect(err).To(BeNil()) 227 228 response, err := pods.Inspect(bt.conn, newpod) 229 Expect(err).To(BeNil()) 230 Expect(response.State).To(Equal(define.PodStateRunning)) 231 for _, i := range response.Containers { 232 Expect(define.StringToContainerStatus(i.State)). 233 To(Equal(define.ContainerStateRunning)) 234 } 235 236 // Start an already running pod 237 _, err = pods.Start(bt.conn, newpod) 238 Expect(err).To(BeNil()) 239 240 // Stop the running pods 241 _, err = pods.Stop(bt.conn, newpod, nil) 242 Expect(err).To(BeNil()) 243 response, _ = pods.Inspect(bt.conn, newpod) 244 Expect(response.State).To(Equal(define.PodStateExited)) 245 for _, i := range response.Containers { 246 Expect(define.StringToContainerStatus(i.State)). 247 To(Equal(define.ContainerStateExited)) 248 } 249 250 // Stop an already stopped pod 251 _, err = pods.Stop(bt.conn, newpod, nil) 252 Expect(err).To(BeNil()) 253 254 _, err = pods.Restart(bt.conn, newpod) 255 Expect(err).To(BeNil()) 256 response, _ = pods.Inspect(bt.conn, newpod) 257 Expect(response.State).To(Equal(define.PodStateRunning)) 258 for _, i := range response.Containers { 259 Expect(define.StringToContainerStatus(i.State)). 260 To(Equal(define.ContainerStateRunning)) 261 } 262 }) 263 264 // Test to validate all the pods in the stopped/exited state are pruned successfully. 265 It("prune pod", func() { 266 // Add a new pod 267 var newpod2 string = "newpod2" 268 bt.Podcreate(&newpod2) 269 // No pods pruned since no pod in exited state 270 pruneResponse, err := pods.Prune(bt.conn) 271 Expect(err).To(BeNil()) 272 podSummary, err := pods.List(bt.conn, nil) 273 Expect(err).To(BeNil()) 274 Expect(len(podSummary)).To(Equal(2)) 275 276 // Prune only one pod which is in exited state. 277 // Start then stop a pod. 278 // pod moves to exited state one pod should be pruned now. 279 _, err = pods.Start(bt.conn, newpod) 280 Expect(err).To(BeNil()) 281 _, err = pods.Stop(bt.conn, newpod, nil) 282 Expect(err).To(BeNil()) 283 response, err := pods.Inspect(bt.conn, newpod) 284 Expect(err).To(BeNil()) 285 Expect(response.State).To(Equal(define.PodStateExited)) 286 pruneResponse, err = pods.Prune(bt.conn) 287 Expect(err).To(BeNil()) 288 // Validate status and record pod id of pod to be pruned 289 Expect(response.State).To(Equal(define.PodStateExited)) 290 podID := response.ID 291 // Check if right pod was pruned 292 Expect(len(pruneResponse)).To(Equal(1)) 293 Expect(pruneResponse[0].Id).To(Equal(podID)) 294 // One pod is pruned hence only one pod should be active. 295 podSummary, err = pods.List(bt.conn, nil) 296 Expect(err).To(BeNil()) 297 Expect(len(podSummary)).To(Equal(1)) 298 299 // Test prune multiple pods. 300 bt.Podcreate(&newpod) 301 _, err = pods.Start(bt.conn, newpod) 302 Expect(err).To(BeNil()) 303 _, err = pods.Start(bt.conn, newpod2) 304 Expect(err).To(BeNil()) 305 _, err = pods.Stop(bt.conn, newpod, nil) 306 Expect(err).To(BeNil()) 307 response, err = pods.Inspect(bt.conn, newpod) 308 Expect(err).To(BeNil()) 309 Expect(response.State).To(Equal(define.PodStateExited)) 310 for _, i := range response.Containers { 311 Expect(define.StringToContainerStatus(i.State)). 312 To(Equal(define.ContainerStateExited)) 313 } 314 _, err = pods.Stop(bt.conn, newpod2, nil) 315 Expect(err).To(BeNil()) 316 response, err = pods.Inspect(bt.conn, newpod2) 317 Expect(err).To(BeNil()) 318 Expect(response.State).To(Equal(define.PodStateExited)) 319 for _, i := range response.Containers { 320 Expect(define.StringToContainerStatus(i.State)). 321 To(Equal(define.ContainerStateExited)) 322 } 323 _, err = pods.Prune(bt.conn) 324 Expect(err).To(BeNil()) 325 podSummary, err = pods.List(bt.conn, nil) 326 Expect(err).To(BeNil()) 327 Expect(len(podSummary)).To(Equal(0)) 328 }) 329 330 It("simple create pod", func() { 331 ps := specgen.PodSpecGenerator{} 332 ps.Name = "foobar" 333 _, err := pods.CreatePodFromSpec(bt.conn, &ps) 334 Expect(err).To(BeNil()) 335 336 exists, err := pods.Exists(bt.conn, "foobar") 337 Expect(err).To(BeNil()) 338 Expect(exists).To(BeTrue()) 339 }) 340 341 // Test validates the pod top bindings 342 It("pod top", func() { 343 var name string = "podA" 344 345 bt.Podcreate(&name) 346 _, err := pods.Start(bt.conn, name) 347 Expect(err).To(BeNil()) 348 349 // By name 350 _, err = pods.Top(bt.conn, name, nil) 351 Expect(err).To(BeNil()) 352 353 // With descriptors 354 output, err := pods.Top(bt.conn, name, []string{"user,pid,hpid"}) 355 Expect(err).To(BeNil()) 356 header := strings.Split(output[0], "\t") 357 for _, d := range []string{"USER", "PID", "HPID"} { 358 Expect(d).To(BeElementOf(header)) 359 } 360 361 // With bogus ID 362 _, err = pods.Top(bt.conn, "IdoNotExist", nil) 363 Expect(err).ToNot(BeNil()) 364 365 // With bogus descriptors 366 _, err = pods.Top(bt.conn, name, []string{"Me,Neither"}) 367 Expect(err).ToNot(BeNil()) 368 }) 369 })