github.com/containers/podman/v2@v2.2.2-0.20210501105131-c1e07d070c4c/test/e2e/pod_rm_test.go (about)

     1  package integration
     2  
     3  import (
     4  	"fmt"
     5  	"io/ioutil"
     6  	"os"
     7  	"path/filepath"
     8  	"strings"
     9  
    10  	. "github.com/containers/podman/v2/test/utils"
    11  	. "github.com/onsi/ginkgo"
    12  	. "github.com/onsi/gomega"
    13  )
    14  
    15  var _ = Describe("Podman pod rm", func() {
    16  	var (
    17  		tempdir    string
    18  		err        error
    19  		podmanTest *PodmanTestIntegration
    20  	)
    21  
    22  	BeforeEach(func() {
    23  		tempdir, err = CreateTempDirInTempDir()
    24  		if err != nil {
    25  			os.Exit(1)
    26  		}
    27  		podmanTest = PodmanTestCreate(tempdir)
    28  		podmanTest.Setup()
    29  		podmanTest.SeedImages()
    30  	})
    31  
    32  	AfterEach(func() {
    33  		podmanTest.Cleanup()
    34  		f := CurrentGinkgoTestDescription()
    35  		processTestResult(f)
    36  
    37  	})
    38  
    39  	It("podman pod rm empty pod", func() {
    40  		_, ec, podid := podmanTest.CreatePod("")
    41  		Expect(ec).To(Equal(0))
    42  
    43  		result := podmanTest.Podman([]string{"pod", "rm", podid})
    44  		result.WaitWithDefaultTimeout()
    45  		Expect(result.ExitCode()).To(Equal(0))
    46  
    47  		// Also check that we don't leak cgroups
    48  		err := filepath.Walk("/sys/fs/cgroup", func(path string, info os.FileInfo, err error) error {
    49  			if err != nil {
    50  				return err
    51  			}
    52  			if !info.IsDir() {
    53  				Expect(err).To(BeNil())
    54  			}
    55  			if strings.Contains(info.Name(), podid) {
    56  				return fmt.Errorf("leaking cgroup path %s", path)
    57  			}
    58  			return nil
    59  		})
    60  		Expect(err).To(BeNil())
    61  	})
    62  
    63  	It("podman pod rm latest pod", func() {
    64  		_, ec, podid := podmanTest.CreatePod("")
    65  		Expect(ec).To(Equal(0))
    66  
    67  		_, ec2, podid2 := podmanTest.CreatePod("pod2")
    68  		Expect(ec2).To(Equal(0))
    69  
    70  		latest := "--latest"
    71  		if IsRemote() {
    72  			latest = "pod2"
    73  		}
    74  		result := podmanTest.Podman([]string{"pod", "rm", latest})
    75  		result.WaitWithDefaultTimeout()
    76  		Expect(result.ExitCode()).To(Equal(0))
    77  
    78  		result = podmanTest.Podman([]string{"pod", "ps", "-q", "--no-trunc"})
    79  		result.WaitWithDefaultTimeout()
    80  		Expect(result.ExitCode()).To(Equal(0))
    81  		Expect(result.OutputToString()).To(ContainSubstring(podid))
    82  		Expect(result.OutputToString()).To(Not(ContainSubstring(podid2)))
    83  	})
    84  
    85  	It("podman pod rm removes a pod with a container", func() {
    86  		_, ec, podid := podmanTest.CreatePod("")
    87  		Expect(ec).To(Equal(0))
    88  
    89  		_, ec2, _ := podmanTest.RunLsContainerInPod("", podid)
    90  		Expect(ec2).To(Equal(0))
    91  
    92  		result := podmanTest.Podman([]string{"pod", "rm", podid})
    93  		result.WaitWithDefaultTimeout()
    94  		Expect(result.ExitCode()).To(Equal(0))
    95  
    96  		result = podmanTest.Podman([]string{"ps", "-qa"})
    97  		result.WaitWithDefaultTimeout()
    98  		Expect(len(result.OutputToStringArray())).To(Equal(0))
    99  	})
   100  
   101  	It("podman pod rm -f does remove a running container", func() {
   102  		_, ec, podid := podmanTest.CreatePod("")
   103  		Expect(ec).To(Equal(0))
   104  
   105  		session := podmanTest.RunTopContainerInPod("", podid)
   106  		session.WaitWithDefaultTimeout()
   107  		Expect(session.ExitCode()).To(Equal(0))
   108  
   109  		result := podmanTest.Podman([]string{"pod", "rm", "-f", podid})
   110  		result.WaitWithDefaultTimeout()
   111  		Expect(result.ExitCode()).To(Equal(0))
   112  
   113  		result = podmanTest.Podman([]string{"ps", "-q"})
   114  		result.WaitWithDefaultTimeout()
   115  		Expect(result.OutputToString()).To(BeEmpty())
   116  	})
   117  
   118  	It("podman pod rm -a doesn't remove a running container", func() {
   119  		fmt.Printf("To start, there are %d pods\n", podmanTest.NumberOfPods())
   120  		_, ec, podid1 := podmanTest.CreatePod("")
   121  		Expect(ec).To(Equal(0))
   122  
   123  		_, ec, _ = podmanTest.CreatePod("")
   124  		Expect(ec).To(Equal(0))
   125  		fmt.Printf("Started %d pods\n", podmanTest.NumberOfPods())
   126  
   127  		session := podmanTest.RunTopContainerInPod("", podid1)
   128  		session.WaitWithDefaultTimeout()
   129  		Expect(session.ExitCode()).To(Equal(0))
   130  		podmanTest.WaitForContainer()
   131  		Expect(podmanTest.NumberOfContainersRunning()).To(Equal(1))
   132  		fmt.Printf("Started container running in one pod")
   133  
   134  		num_pods := podmanTest.NumberOfPods()
   135  		Expect(num_pods).To(Equal(2))
   136  		ps := podmanTest.Podman([]string{"pod", "ps"})
   137  		ps.WaitWithDefaultTimeout()
   138  		fmt.Printf("Current %d pod(s):\n%s\n", num_pods, ps.OutputToString())
   139  
   140  		fmt.Printf("Removing all empty pods\n")
   141  		result := podmanTest.Podman([]string{"pod", "rm", "-a"})
   142  		result.WaitWithDefaultTimeout()
   143  		Expect(result).To(ExitWithError())
   144  		foundExpectedError, _ := result.ErrorGrepString("cannot be removed")
   145  		Expect(foundExpectedError).To(Equal(true))
   146  
   147  		num_pods = podmanTest.NumberOfPods()
   148  		ps = podmanTest.Podman([]string{"pod", "ps"})
   149  		ps.WaitWithDefaultTimeout()
   150  		fmt.Printf("Final %d pod(s):\n%s\n", num_pods, ps.OutputToString())
   151  		Expect(num_pods).To(Equal(1))
   152  		// Confirm top container still running inside remaining pod
   153  		Expect(podmanTest.NumberOfContainersRunning()).To(Equal(1))
   154  	})
   155  
   156  	It("podman pod rm -fa removes everything", func() {
   157  		_, ec, podid1 := podmanTest.CreatePod("")
   158  		Expect(ec).To(Equal(0))
   159  
   160  		_, ec, podid2 := podmanTest.CreatePod("")
   161  		Expect(ec).To(Equal(0))
   162  
   163  		_, ec, _ = podmanTest.CreatePod("")
   164  		Expect(ec).To(Equal(0))
   165  
   166  		session := podmanTest.RunTopContainerInPod("", podid1)
   167  		session.WaitWithDefaultTimeout()
   168  		Expect(session.ExitCode()).To(Equal(0))
   169  
   170  		session = podmanTest.Podman([]string{"create", "--pod", podid1, ALPINE, "ls"})
   171  		session.WaitWithDefaultTimeout()
   172  		Expect(session.ExitCode()).To(Equal(0))
   173  
   174  		_, ec, _ = podmanTest.RunLsContainerInPod("", podid2)
   175  		Expect(ec).To(Equal(0))
   176  
   177  		session = podmanTest.RunTopContainerInPod("", podid2)
   178  		session.WaitWithDefaultTimeout()
   179  		Expect(session.ExitCode()).To(Equal(0))
   180  
   181  		result := podmanTest.Podman([]string{"pod", "rm", "-fa"})
   182  		result.WaitWithDefaultTimeout()
   183  		Expect(result.ExitCode()).To(Equal(0))
   184  
   185  		result = podmanTest.Podman([]string{"ps", "-q"})
   186  		result.WaitWithDefaultTimeout()
   187  		Expect(result.OutputToString()).To(BeEmpty())
   188  
   189  		// one pod should have been deleted
   190  		result = podmanTest.Podman([]string{"pod", "ps", "-q"})
   191  		result.WaitWithDefaultTimeout()
   192  		Expect(result.OutputToString()).To(BeEmpty())
   193  	})
   194  
   195  	It("podman rm bogus pod", func() {
   196  		session := podmanTest.Podman([]string{"pod", "rm", "bogus"})
   197  		session.WaitWithDefaultTimeout()
   198  		Expect(session.ExitCode()).To(Equal(1))
   199  	})
   200  
   201  	It("podman rm bogus pod and a running pod", func() {
   202  		_, ec, podid1 := podmanTest.CreatePod("")
   203  		Expect(ec).To(Equal(0))
   204  
   205  		session := podmanTest.RunTopContainerInPod("test1", podid1)
   206  		session.WaitWithDefaultTimeout()
   207  		Expect(session.ExitCode()).To(Equal(0))
   208  
   209  		session = podmanTest.Podman([]string{"pod", "rm", "bogus", "test1"})
   210  		session.WaitWithDefaultTimeout()
   211  		Expect(session.ExitCode()).To(Equal(1))
   212  
   213  		session = podmanTest.Podman([]string{"pod", "rm", "test1", "bogus"})
   214  		session.WaitWithDefaultTimeout()
   215  		Expect(session.ExitCode()).To(Equal(1))
   216  	})
   217  
   218  	It("podman rm --ignore bogus pod and a running pod", func() {
   219  
   220  		_, ec, podid1 := podmanTest.CreatePod("")
   221  		Expect(ec).To(Equal(0))
   222  
   223  		session := podmanTest.RunTopContainerInPod("test1", podid1)
   224  		session.WaitWithDefaultTimeout()
   225  		Expect(session.ExitCode()).To(Equal(0))
   226  
   227  		session = podmanTest.Podman([]string{"pod", "rm", "--force", "--ignore", "bogus", "test1"})
   228  		session.WaitWithDefaultTimeout()
   229  		Expect(session.ExitCode()).To(Equal(0))
   230  
   231  		session = podmanTest.Podman([]string{"pod", "rm", "--ignore", "test1", "bogus"})
   232  		session.WaitWithDefaultTimeout()
   233  		Expect(session.ExitCode()).To(Equal(0))
   234  	})
   235  
   236  	It("podman pod start/remove single pod via --pod-id-file", func() {
   237  		tmpDir, err := ioutil.TempDir("", "")
   238  		Expect(err).To(BeNil())
   239  		tmpFile := tmpDir + "podID"
   240  		defer os.RemoveAll(tmpDir)
   241  
   242  		podName := "rudolph"
   243  
   244  		// Create a pod with --pod-id-file.
   245  		session := podmanTest.Podman([]string{"pod", "create", "--name", podName, "--pod-id-file", tmpFile})
   246  		session.WaitWithDefaultTimeout()
   247  		Expect(session.ExitCode()).To(Equal(0))
   248  
   249  		// Create container inside the pod.
   250  		session = podmanTest.Podman([]string{"create", "--pod", podName, ALPINE, "top"})
   251  		session.WaitWithDefaultTimeout()
   252  		Expect(session.ExitCode()).To(Equal(0))
   253  
   254  		session = podmanTest.Podman([]string{"pod", "start", "--pod-id-file", tmpFile})
   255  		session.WaitWithDefaultTimeout()
   256  		Expect(session.ExitCode()).To(Equal(0))
   257  		Expect(podmanTest.NumberOfContainersRunning()).To(Equal(2)) // infra+top
   258  
   259  		session = podmanTest.Podman([]string{"pod", "rm", "--pod-id-file", tmpFile, "--force"})
   260  		session.WaitWithDefaultTimeout()
   261  		Expect(session.ExitCode()).To(Equal(0))
   262  		Expect(podmanTest.NumberOfContainersRunning()).To(Equal(0))
   263  	})
   264  
   265  	It("podman pod start/remove multiple pods via --pod-id-file", func() {
   266  		tmpDir, err := ioutil.TempDir("", "")
   267  		Expect(err).To(BeNil())
   268  		defer os.RemoveAll(tmpDir)
   269  
   270  		podIDFiles := []string{}
   271  		for _, i := range "0123456789" {
   272  			tmpFile := tmpDir + "cid" + string(i)
   273  			podName := "rudolph" + string(i)
   274  			// Create a pod with --pod-id-file.
   275  			session := podmanTest.Podman([]string{"pod", "create", "--name", podName, "--pod-id-file", tmpFile})
   276  			session.WaitWithDefaultTimeout()
   277  			Expect(session.ExitCode()).To(Equal(0))
   278  
   279  			// Create container inside the pod.
   280  			session = podmanTest.Podman([]string{"create", "--pod", podName, ALPINE, "top"})
   281  			session.WaitWithDefaultTimeout()
   282  			Expect(session.ExitCode()).To(Equal(0))
   283  
   284  			// Append the id files along with the command.
   285  			podIDFiles = append(podIDFiles, "--pod-id-file")
   286  			podIDFiles = append(podIDFiles, tmpFile)
   287  		}
   288  
   289  		cmd := []string{"pod", "start"}
   290  		cmd = append(cmd, podIDFiles...)
   291  		session := podmanTest.Podman(cmd)
   292  		session.WaitWithDefaultTimeout()
   293  		Expect(session.ExitCode()).To(Equal(0))
   294  		Expect(podmanTest.NumberOfContainersRunning()).To(Equal(20)) // 10*(infra+top)
   295  
   296  		cmd = []string{"pod", "rm", "--force"}
   297  		cmd = append(cmd, podIDFiles...)
   298  		session = podmanTest.Podman(cmd)
   299  		session.WaitWithDefaultTimeout()
   300  		Expect(session.ExitCode()).To(Equal(0))
   301  		Expect(podmanTest.NumberOfContainersRunning()).To(Equal(0))
   302  	})
   303  })