github.com/containers/libpod@v1.9.4-0.20220419124438-4284fd425507/test/e2e/ps_test.go (about)

     1  package integration
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"regexp"
     7  	"sort"
     8  	"strings"
     9  
    10  	. "github.com/containers/libpod/test/utils"
    11  	"github.com/docker/go-units"
    12  	. "github.com/onsi/ginkgo"
    13  	. "github.com/onsi/gomega"
    14  )
    15  
    16  var _ = Describe("Podman ps", func() {
    17  	var (
    18  		tempdir    string
    19  		err        error
    20  		podmanTest *PodmanTestIntegration
    21  	)
    22  
    23  	BeforeEach(func() {
    24  		tempdir, err = CreateTempDirInTempDir()
    25  		if err != nil {
    26  			os.Exit(1)
    27  		}
    28  		podmanTest = PodmanTestCreate(tempdir)
    29  		podmanTest.Setup()
    30  		podmanTest.SeedImages()
    31  	})
    32  
    33  	AfterEach(func() {
    34  		podmanTest.Cleanup()
    35  		f := CurrentGinkgoTestDescription()
    36  		processTestResult(f)
    37  
    38  	})
    39  
    40  	It("podman ps no containers", func() {
    41  		session := podmanTest.Podman([]string{"ps"})
    42  		session.WaitWithDefaultTimeout()
    43  		Expect(session.ExitCode()).To(Equal(0))
    44  	})
    45  
    46  	It("podman ps default", func() {
    47  		session := podmanTest.RunTopContainer("")
    48  		session.WaitWithDefaultTimeout()
    49  		Expect(session.ExitCode()).To(Equal(0))
    50  
    51  		result := podmanTest.Podman([]string{"ps"})
    52  		result.WaitWithDefaultTimeout()
    53  		Expect(result.ExitCode()).To(Equal(0))
    54  		Expect(len(result.OutputToStringArray())).Should(BeNumerically(">", 0))
    55  	})
    56  
    57  	It("podman ps all", func() {
    58  		_, ec, _ := podmanTest.RunLsContainer("")
    59  		Expect(ec).To(Equal(0))
    60  
    61  		result := podmanTest.Podman([]string{"ps", "-a"})
    62  		result.WaitWithDefaultTimeout()
    63  		Expect(result.ExitCode()).To(Equal(0))
    64  		Expect(len(result.OutputToStringArray())).Should(BeNumerically(">", 0))
    65  	})
    66  
    67  	It("podman container list all", func() {
    68  		_, ec, _ := podmanTest.RunLsContainer("")
    69  		Expect(ec).To(Equal(0))
    70  
    71  		result := podmanTest.Podman([]string{"container", "list", "-a"})
    72  		result.WaitWithDefaultTimeout()
    73  		Expect(result.ExitCode()).To(Equal(0))
    74  		Expect(len(result.OutputToStringArray())).Should(BeNumerically(">", 0))
    75  
    76  		result = podmanTest.Podman([]string{"container", "ls", "-a"})
    77  		result.WaitWithDefaultTimeout()
    78  		Expect(result.ExitCode()).To(Equal(0))
    79  		Expect(len(result.OutputToStringArray())).Should(BeNumerically(">", 0))
    80  	})
    81  
    82  	It("podman ps size flag", func() {
    83  		_, ec, _ := podmanTest.RunLsContainer("")
    84  		Expect(ec).To(Equal(0))
    85  
    86  		result := podmanTest.Podman([]string{"ps", "-a", "--size"})
    87  		result.WaitWithDefaultTimeout()
    88  		Expect(result.ExitCode()).To(Equal(0))
    89  		Expect(len(result.OutputToStringArray())).Should(BeNumerically(">", 0))
    90  	})
    91  
    92  	It("podman ps quiet flag", func() {
    93  		_, ec, fullCid := podmanTest.RunLsContainer("")
    94  		Expect(ec).To(Equal(0))
    95  
    96  		result := podmanTest.Podman([]string{"ps", "-a", "-q"})
    97  		result.WaitWithDefaultTimeout()
    98  		Expect(result.ExitCode()).To(Equal(0))
    99  		Expect(len(result.OutputToStringArray())).Should(BeNumerically(">", 0))
   100  		Expect(fullCid).To(ContainSubstring(result.OutputToStringArray()[0]))
   101  	})
   102  
   103  	It("podman ps latest flag", func() {
   104  		_, ec, _ := podmanTest.RunLsContainer("")
   105  		Expect(ec).To(Equal(0))
   106  
   107  		result := podmanTest.Podman([]string{"ps", "--latest"})
   108  		result.WaitWithDefaultTimeout()
   109  		Expect(result.ExitCode()).To(Equal(0))
   110  		Expect(len(result.OutputToStringArray())).Should(BeNumerically(">", 0))
   111  	})
   112  
   113  	It("podman ps last flag", func() {
   114  		Skip("--last flag nonfunctional and disabled")
   115  
   116  		_, ec, _ := podmanTest.RunLsContainer("test1")
   117  		Expect(ec).To(Equal(0))
   118  
   119  		_, ec, _ = podmanTest.RunLsContainer("test2")
   120  		Expect(ec).To(Equal(0))
   121  
   122  		_, ec, _ = podmanTest.RunLsContainer("test3")
   123  		Expect(ec).To(Equal(0))
   124  
   125  		result := podmanTest.Podman([]string{"ps", "--last", "2"})
   126  		result.WaitWithDefaultTimeout()
   127  		Expect(result.ExitCode()).To(Equal(0))
   128  		Expect(len(result.OutputToStringArray())).Should(Equal(3))
   129  	})
   130  
   131  	It("podman ps no-trunc", func() {
   132  		_, ec, fullCid := podmanTest.RunLsContainer("")
   133  		Expect(ec).To(Equal(0))
   134  
   135  		result := podmanTest.Podman([]string{"ps", "-aq", "--no-trunc"})
   136  		result.WaitWithDefaultTimeout()
   137  		Expect(result.ExitCode()).To(Equal(0))
   138  		Expect(len(result.OutputToStringArray())).Should(BeNumerically(">", 0))
   139  		Expect(fullCid).To(Equal(result.OutputToStringArray()[0]))
   140  	})
   141  
   142  	It("podman ps namespace flag", func() {
   143  		_, ec, _ := podmanTest.RunLsContainer("")
   144  		Expect(ec).To(Equal(0))
   145  
   146  		result := podmanTest.Podman([]string{"ps", "-a", "--namespace"})
   147  		result.WaitWithDefaultTimeout()
   148  		Expect(result.ExitCode()).To(Equal(0))
   149  		Expect(len(result.OutputToStringArray())).Should(BeNumerically(">", 0))
   150  	})
   151  
   152  	It("podman ps with no containers is valid json format", func() {
   153  		result := podmanTest.Podman([]string{"ps", "--format", "json"})
   154  		result.WaitWithDefaultTimeout()
   155  		Expect(result.ExitCode()).To(Equal(0))
   156  		Expect(result.IsJSONOutputValid()).To(BeTrue())
   157  	})
   158  
   159  	It("podman ps namespace flag with json format", func() {
   160  		_, ec, _ := podmanTest.RunLsContainer("test1")
   161  		Expect(ec).To(Equal(0))
   162  
   163  		result := podmanTest.Podman([]string{"ps", "-a", "--ns", "--format", "json"})
   164  		result.WaitWithDefaultTimeout()
   165  		Expect(result.ExitCode()).To(Equal(0))
   166  		Expect(result.IsJSONOutputValid()).To(BeTrue())
   167  	})
   168  
   169  	It("podman ps namespace flag with go template format", func() {
   170  		_, ec, _ := podmanTest.RunLsContainer("test1")
   171  		Expect(ec).To(Equal(0))
   172  
   173  		result := podmanTest.Podman([]string{"ps", "-a", "--format", "table {{.ID}} {{.Image}} {{.ImageID}} {{.Labels}}"})
   174  		result.WaitWithDefaultTimeout()
   175  		Expect(strings.Contains(result.OutputToStringArray()[0], "table")).To(BeFalse())
   176  		Expect(strings.Contains(result.OutputToStringArray()[0], "ID")).To(BeTrue())
   177  		Expect(strings.Contains(result.OutputToStringArray()[0], "ImageID")).To(BeTrue())
   178  		Expect(strings.Contains(result.OutputToStringArray()[1], "alpine:latest")).To(BeTrue())
   179  		Expect(result.ExitCode()).To(Equal(0))
   180  	})
   181  
   182  	It("podman ps ancestor filter flag", func() {
   183  		_, ec, _ := podmanTest.RunLsContainer("test1")
   184  		Expect(ec).To(Equal(0))
   185  
   186  		result := podmanTest.Podman([]string{"ps", "-a", "--filter", "ancestor=docker.io/library/alpine:latest"})
   187  		result.WaitWithDefaultTimeout()
   188  		Expect(result.ExitCode()).To(Equal(0))
   189  	})
   190  
   191  	It("podman ps id filter flag", func() {
   192  		_, ec, fullCid := podmanTest.RunLsContainer("")
   193  		Expect(ec).To(Equal(0))
   194  
   195  		result := podmanTest.Podman([]string{"ps", "-a", "--filter", fmt.Sprintf("id=%s", fullCid)})
   196  		result.WaitWithDefaultTimeout()
   197  		Expect(result.ExitCode()).To(Equal(0))
   198  	})
   199  
   200  	It("podman ps id filter flag", func() {
   201  		session := podmanTest.RunTopContainer("")
   202  		session.WaitWithDefaultTimeout()
   203  		Expect(session.ExitCode()).To(Equal(0))
   204  		fullCid := session.OutputToString()
   205  
   206  		result := podmanTest.Podman([]string{"ps", "-aq", "--no-trunc", "--filter", "status=running"})
   207  		result.WaitWithDefaultTimeout()
   208  		Expect(result.ExitCode()).To(Equal(0))
   209  		Expect(result.OutputToStringArray()[0]).To(Equal(fullCid))
   210  	})
   211  
   212  	It("podman ps multiple filters", func() {
   213  		session := podmanTest.Podman([]string{"run", "-d", "--name", "test1", "--label", "key1=value1", ALPINE, "top"})
   214  		session.WaitWithDefaultTimeout()
   215  		Expect(session.ExitCode()).To(Equal(0))
   216  		fullCid := session.OutputToString()
   217  
   218  		session2 := podmanTest.Podman([]string{"run", "-d", "--name", "test2", "--label", "key1=value1", ALPINE, "top"})
   219  		session2.WaitWithDefaultTimeout()
   220  		Expect(session2.ExitCode()).To(Equal(0))
   221  
   222  		result := podmanTest.Podman([]string{"ps", "-aq", "--no-trunc", "--filter", "name=test1", "--filter", "label=key1=value1"})
   223  		result.WaitWithDefaultTimeout()
   224  		Expect(result.ExitCode()).To(Equal(0))
   225  
   226  		output := result.OutputToStringArray()
   227  		Expect(len(output)).To(Equal(1))
   228  		Expect(output[0]).To(Equal(fullCid))
   229  	})
   230  
   231  	It("podman ps filter by exited does not need all", func() {
   232  		ctr := podmanTest.Podman([]string{"run", "-t", "-i", ALPINE, "ls", "/"})
   233  		ctr.WaitWithDefaultTimeout()
   234  		Expect(ctr.ExitCode()).To(Equal(0))
   235  
   236  		psAll := podmanTest.Podman([]string{"ps", "-aq", "--no-trunc"})
   237  		psAll.WaitWithDefaultTimeout()
   238  		Expect(psAll.ExitCode()).To(Equal(0))
   239  
   240  		psFilter := podmanTest.Podman([]string{"ps", "--no-trunc", "--quiet", "--filter", "status=exited"})
   241  		psFilter.WaitWithDefaultTimeout()
   242  		Expect(psFilter.ExitCode()).To(Equal(0))
   243  
   244  		Expect(psAll.OutputToString()).To(Equal(psFilter.OutputToString()))
   245  	})
   246  
   247  	It("podman filter without status does not find non-running", func() {
   248  		ctrName := "aContainerName"
   249  		ctr := podmanTest.Podman([]string{"create", "--name", ctrName, "-t", "-i", ALPINE, "ls", "/"})
   250  		ctr.WaitWithDefaultTimeout()
   251  		Expect(ctr.ExitCode()).To(Equal(0))
   252  
   253  		psFilter := podmanTest.Podman([]string{"ps", "--no-trunc", "--quiet", "--format", "{{.Names}}", "--filter", fmt.Sprintf("name=%s", ctrName)})
   254  		psFilter.WaitWithDefaultTimeout()
   255  		Expect(psFilter.ExitCode()).To(Equal(0))
   256  
   257  		Expect(strings.Contains(psFilter.OutputToString(), ctrName)).To(BeFalse())
   258  	})
   259  
   260  	It("podman ps mutually exclusive flags", func() {
   261  		session := podmanTest.Podman([]string{"ps", "-aqs"})
   262  		session.WaitWithDefaultTimeout()
   263  		Expect(session).To(ExitWithError())
   264  
   265  		session = podmanTest.Podman([]string{"ps", "-a", "--ns", "-s"})
   266  		session.WaitWithDefaultTimeout()
   267  		Expect(session).To(ExitWithError())
   268  	})
   269  
   270  	It("podman --sort by size", func() {
   271  		session := podmanTest.Podman([]string{"create", "busybox", "ls"})
   272  		session.WaitWithDefaultTimeout()
   273  		Expect(session.ExitCode()).To(Equal(0))
   274  
   275  		session = podmanTest.Podman([]string{"create", "-dt", ALPINE, "top"})
   276  		session.WaitWithDefaultTimeout()
   277  		Expect(session.ExitCode()).To(Equal(0))
   278  
   279  		session = podmanTest.Podman([]string{"ps", "-a", "-s", "--sort=size", "--format", "{{.Size}}"})
   280  		session.WaitWithDefaultTimeout()
   281  		Expect(session.ExitCode()).To(Equal(0))
   282  
   283  		sortedArr := session.OutputToStringArray()
   284  
   285  		// TODO: This may be broken - the test was running without the
   286  		// ability to perform any sorting for months and succeeded
   287  		// without error.
   288  		Expect(sort.SliceIsSorted(sortedArr, func(i, j int) bool {
   289  			r := regexp.MustCompile(`^\S+\s+\(virtual (\S+)\)`)
   290  			matches1 := r.FindStringSubmatch(sortedArr[i])
   291  			matches2 := r.FindStringSubmatch(sortedArr[j])
   292  
   293  			// sanity check in case an oddly formatted size appears
   294  			if len(matches1) < 2 || len(matches2) < 2 {
   295  				return sortedArr[i] < sortedArr[j]
   296  			} else {
   297  				size1, _ := units.FromHumanSize(matches1[1])
   298  				size2, _ := units.FromHumanSize(matches2[1])
   299  				return size1 < size2
   300  			}
   301  		})).To(BeTrue())
   302  
   303  	})
   304  
   305  	It("podman --sort by command", func() {
   306  		session := podmanTest.RunTopContainer("")
   307  		session.WaitWithDefaultTimeout()
   308  		Expect(session.ExitCode()).To(Equal(0))
   309  
   310  		session = podmanTest.Podman([]string{"run", "-d", ALPINE, "pwd"})
   311  		session.WaitWithDefaultTimeout()
   312  		Expect(session.ExitCode()).To(Equal(0))
   313  
   314  		session = podmanTest.Podman([]string{"ps", "-a", "--sort=command", "--format", "{{.Command}}"})
   315  
   316  		session.WaitWithDefaultTimeout()
   317  		Expect(session.ExitCode()).To(Equal(0))
   318  
   319  		sortedArr := session.OutputToStringArray()
   320  
   321  		Expect(sort.SliceIsSorted(sortedArr, func(i, j int) bool { return sortedArr[i] < sortedArr[j] })).To(BeTrue())
   322  
   323  	})
   324  
   325  	It("podman --pod", func() {
   326  		_, ec, podid := podmanTest.CreatePod("")
   327  		Expect(ec).To(Equal(0))
   328  
   329  		session := podmanTest.RunTopContainerInPod("", podid)
   330  		session.WaitWithDefaultTimeout()
   331  		Expect(session.ExitCode()).To(Equal(0))
   332  
   333  		session = podmanTest.Podman([]string{"ps", "--pod", "--no-trunc"})
   334  
   335  		session.WaitWithDefaultTimeout()
   336  		Expect(session.ExitCode()).To(Equal(0))
   337  
   338  		Expect(session.OutputToString()).To(ContainSubstring(podid))
   339  	})
   340  
   341  	It("podman --pod with a non-empty pod name", func() {
   342  		SkipIfRemote()
   343  
   344  		podName := "testPodName"
   345  		_, ec, podid := podmanTest.CreatePod(podName)
   346  		Expect(ec).To(Equal(0))
   347  
   348  		session := podmanTest.RunTopContainerInPod("", podName)
   349  		session.WaitWithDefaultTimeout()
   350  		Expect(session.ExitCode()).To(Equal(0))
   351  
   352  		// "--no-trunc" must be given. If not it will trunc the pod ID
   353  		// in the output and you will have to trunc it in the test too.
   354  		session = podmanTest.Podman([]string{"ps", "--pod", "--no-trunc"})
   355  
   356  		session.WaitWithDefaultTimeout()
   357  		Expect(session.ExitCode()).To(Equal(0))
   358  
   359  		output := session.OutputToString()
   360  		Expect(output).To(ContainSubstring(podid))
   361  		Expect(output).To(ContainSubstring(podName))
   362  	})
   363  
   364  	It("podman ps test with port range", func() {
   365  		SkipIfRootless()
   366  		session := podmanTest.RunTopContainer("")
   367  		session.WaitWithDefaultTimeout()
   368  		Expect(session.ExitCode()).To(Equal(0))
   369  
   370  		session = podmanTest.Podman([]string{"run", "-dt", "-p", "1000-1006:1000-1006", ALPINE, "top"})
   371  		session.WaitWithDefaultTimeout()
   372  		Expect(session.ExitCode()).To(Equal(0))
   373  
   374  		session = podmanTest.Podman([]string{"ps", "--format", "{{.Ports}}"})
   375  		session.WaitWithDefaultTimeout()
   376  		Expect(session.OutputToString()).To(ContainSubstring("0.0.0.0:1000-1006"))
   377  	})
   378  
   379  	It("podman ps sync flag", func() {
   380  		session := podmanTest.RunTopContainer("")
   381  		session.WaitWithDefaultTimeout()
   382  		Expect(session.ExitCode()).To(Equal(0))
   383  		fullCid := session.OutputToString()
   384  
   385  		result := podmanTest.Podman([]string{"ps", "-q", "--no-trunc", "--sync"})
   386  		result.WaitWithDefaultTimeout()
   387  		Expect(result.ExitCode()).To(Equal(0))
   388  		Expect(result.OutputToStringArray()[0]).To(Equal(fullCid))
   389  	})
   390  
   391  	It("podman ps filter name regexp", func() {
   392  		session := podmanTest.Podman([]string{"run", "-d", "--name", "test1", ALPINE, "top"})
   393  		session.WaitWithDefaultTimeout()
   394  		Expect(session.ExitCode()).To(Equal(0))
   395  		fullCid := session.OutputToString()
   396  
   397  		session2 := podmanTest.Podman([]string{"run", "-d", "--name", "test11", ALPINE, "top"})
   398  		session2.WaitWithDefaultTimeout()
   399  		Expect(session2.ExitCode()).To(Equal(0))
   400  
   401  		result := podmanTest.Podman([]string{"ps", "-aq", "--no-trunc", "--filter", "name=test1"})
   402  		result.WaitWithDefaultTimeout()
   403  		Expect(result.ExitCode()).To(Equal(0))
   404  
   405  		output := result.OutputToStringArray()
   406  		Expect(len(output)).To(Equal(2))
   407  
   408  		result = podmanTest.Podman([]string{"ps", "-aq", "--no-trunc", "--filter", "name=test1$"})
   409  		result.WaitWithDefaultTimeout()
   410  		Expect(result.ExitCode()).To(Equal(0))
   411  
   412  		output = result.OutputToStringArray()
   413  		Expect(len(output)).To(Equal(1))
   414  		Expect(output[0]).To(Equal(fullCid))
   415  	})
   416  
   417  	It("podman ps quiet template", func() {
   418  		ctrName := "testCtr"
   419  		session := podmanTest.Podman([]string{"run", "-d", "--name", ctrName, ALPINE, "top"})
   420  		session.WaitWithDefaultTimeout()
   421  		Expect(session.ExitCode()).To(Equal(0))
   422  
   423  		result := podmanTest.Podman([]string{"ps", "-q", "-a", "--format", "{{ .Names }}"})
   424  		result.WaitWithDefaultTimeout()
   425  		Expect(result.ExitCode()).To(Equal(0))
   426  
   427  		output := result.OutputToStringArray()
   428  		Expect(len(output)).To(Equal(1))
   429  		Expect(output[0]).To(Equal(ctrName))
   430  	})
   431  })