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