github.com/hanks177/podman/v4@v4.1.3-0.20220613032544-16d90015bc83/test/e2e/container_clone_test.go (about)

     1  package integration
     2  
     3  import (
     4  	"os"
     5  
     6  	. "github.com/hanks177/podman/v4/test/utils"
     7  	. "github.com/onsi/ginkgo"
     8  	. "github.com/onsi/gomega"
     9  	. "github.com/onsi/gomega/gexec"
    10  )
    11  
    12  var _ = Describe("Podman container clone", func() {
    13  	var (
    14  		tempdir    string
    15  		err        error
    16  		podmanTest *PodmanTestIntegration
    17  	)
    18  
    19  	BeforeEach(func() {
    20  		SkipIfRemote("podman container clone is not supported in remote")
    21  		tempdir, err = CreateTempDirInTempDir()
    22  		if err != nil {
    23  			os.Exit(1)
    24  		}
    25  		podmanTest = PodmanTestCreate(tempdir)
    26  		podmanTest.Setup()
    27  	})
    28  
    29  	AfterEach(func() {
    30  		podmanTest.Cleanup()
    31  		f := CurrentGinkgoTestDescription()
    32  		processTestResult(f)
    33  
    34  	})
    35  
    36  	It("podman container clone basic test", func() {
    37  		SkipIfRootlessCgroupsV1("starting a container with the memory limits not supported")
    38  		create := podmanTest.Podman([]string{"create", ALPINE})
    39  		create.WaitWithDefaultTimeout()
    40  		Expect(create).To(Exit(0))
    41  		clone := podmanTest.Podman([]string{"container", "clone", create.OutputToString()})
    42  		clone.WaitWithDefaultTimeout()
    43  		Expect(clone).To(Exit(0))
    44  
    45  		clone = podmanTest.Podman([]string{"container", "clone", clone.OutputToString()})
    46  		clone.WaitWithDefaultTimeout()
    47  		Expect(clone).To(Exit(0))
    48  
    49  		ctrInspect := podmanTest.Podman([]string{"inspect", clone.OutputToString()})
    50  		ctrInspect.WaitWithDefaultTimeout()
    51  		Expect(ctrInspect).To(Exit(0))
    52  		Expect(ctrInspect.InspectContainerToJSON()[0].Name).To(ContainSubstring("-clone1"))
    53  
    54  		ctrStart := podmanTest.Podman([]string{"container", "start", clone.OutputToString()})
    55  		ctrStart.WaitWithDefaultTimeout()
    56  		Expect(ctrStart).To(Exit(0))
    57  	})
    58  
    59  	It("podman container clone image test", func() {
    60  		create := podmanTest.Podman([]string{"create", ALPINE})
    61  		create.WaitWithDefaultTimeout()
    62  		Expect(create).To(Exit(0))
    63  		clone := podmanTest.Podman([]string{"container", "clone", create.OutputToString(), "new_name", fedoraMinimal})
    64  		clone.WaitWithDefaultTimeout()
    65  		Expect(clone).To(Exit(0))
    66  
    67  		ctrInspect := podmanTest.Podman([]string{"inspect", clone.OutputToString()})
    68  		ctrInspect.WaitWithDefaultTimeout()
    69  		Expect(ctrInspect).To(Exit(0))
    70  		Expect(ctrInspect.InspectContainerToJSON()[0]).To(HaveField("ImageName", fedoraMinimal))
    71  		Expect(ctrInspect.InspectContainerToJSON()[0]).To(HaveField("Name", "new_name"))
    72  	})
    73  
    74  	It("podman container clone name test", func() {
    75  		create := podmanTest.Podman([]string{"create", ALPINE})
    76  		create.WaitWithDefaultTimeout()
    77  		Expect(create).To(Exit(0))
    78  		clone := podmanTest.Podman([]string{"container", "clone", "--name", "testing123", create.OutputToString()})
    79  		clone.WaitWithDefaultTimeout()
    80  		Expect(clone).To(Exit(0))
    81  
    82  		cloneInspect := podmanTest.Podman([]string{"inspect", clone.OutputToString()})
    83  		cloneInspect.WaitWithDefaultTimeout()
    84  		Expect(cloneInspect).To(Exit(0))
    85  		cloneData := cloneInspect.InspectContainerToJSON()
    86  		Expect(cloneData[0]).To(HaveField("Name", "testing123"))
    87  	})
    88  
    89  	It("podman container clone resource limits override", func() {
    90  		create := podmanTest.Podman([]string{"create", "--cpus=5", ALPINE})
    91  		create.WaitWithDefaultTimeout()
    92  		Expect(create).To(Exit(0))
    93  		clone := podmanTest.Podman([]string{"container", "clone", create.OutputToString()})
    94  		clone.WaitWithDefaultTimeout()
    95  		Expect(clone).To(Exit(0))
    96  
    97  		createInspect := podmanTest.Podman([]string{"inspect", create.OutputToString()})
    98  		createInspect.WaitWithDefaultTimeout()
    99  		Expect(createInspect).To(Exit(0))
   100  		createData := createInspect.InspectContainerToJSON()
   101  
   102  		cloneInspect := podmanTest.Podman([]string{"inspect", clone.OutputToString()})
   103  		cloneInspect.WaitWithDefaultTimeout()
   104  		Expect(cloneInspect).To(Exit(0))
   105  		cloneData := cloneInspect.InspectContainerToJSON()
   106  		Expect(createData[0].HostConfig).To(HaveField("NanoCpus", cloneData[0].HostConfig.NanoCpus))
   107  
   108  		create = podmanTest.Podman([]string{"create", "--memory=5", ALPINE})
   109  		create.WaitWithDefaultTimeout()
   110  		Expect(create).To(Exit(0))
   111  		clone = podmanTest.Podman([]string{"container", "clone", "--cpus=6", create.OutputToString()})
   112  		clone.WaitWithDefaultTimeout()
   113  		Expect(clone).To(Exit(0))
   114  
   115  		createInspect = podmanTest.Podman([]string{"inspect", create.OutputToString()})
   116  		createInspect.WaitWithDefaultTimeout()
   117  		Expect(createInspect).To(Exit(0))
   118  		createData = createInspect.InspectContainerToJSON()
   119  
   120  		cloneInspect = podmanTest.Podman([]string{"inspect", clone.OutputToString()})
   121  		cloneInspect.WaitWithDefaultTimeout()
   122  		Expect(cloneInspect).To(Exit(0))
   123  		cloneData = cloneInspect.InspectContainerToJSON()
   124  		Expect(createData[0].HostConfig).To(HaveField("MemorySwap", cloneData[0].HostConfig.MemorySwap))
   125  
   126  		create = podmanTest.Podman([]string{"create", "--cpus=5", ALPINE})
   127  		create.WaitWithDefaultTimeout()
   128  		Expect(create).To(Exit(0))
   129  		clone = podmanTest.Podman([]string{"container", "clone", "--cpus=4", create.OutputToString()})
   130  		clone.WaitWithDefaultTimeout()
   131  		Expect(clone).To(Exit(0))
   132  
   133  		var nanoCPUs int64
   134  		numCpus := 4
   135  		nanoCPUs = int64(numCpus * 1000000000)
   136  
   137  		createInspect = podmanTest.Podman([]string{"inspect", create.OutputToString()})
   138  		createInspect.WaitWithDefaultTimeout()
   139  		Expect(createInspect).To(Exit(0))
   140  		createData = createInspect.InspectContainerToJSON()
   141  
   142  		cloneInspect = podmanTest.Podman([]string{"inspect", clone.OutputToString()})
   143  		cloneInspect.WaitWithDefaultTimeout()
   144  		Expect(cloneInspect).To(Exit(0))
   145  		cloneData = cloneInspect.InspectContainerToJSON()
   146  		Expect(createData[0].HostConfig.NanoCpus).ToNot(Equal(cloneData[0].HostConfig.NanoCpus))
   147  		Expect(cloneData[0].HostConfig).To(HaveField("NanoCpus", nanoCPUs))
   148  
   149  		create = podmanTest.Podman([]string{"create", ALPINE})
   150  		create.WaitWithDefaultTimeout()
   151  		Expect(create).To(Exit(0))
   152  		clone = podmanTest.Podman([]string{"container", "clone", "--cpus=4", create.OutputToString()})
   153  		clone.WaitWithDefaultTimeout()
   154  		Expect(clone).To(Exit(0))
   155  
   156  		cloneInspect = podmanTest.Podman([]string{"inspect", clone.OutputToString()})
   157  		cloneInspect.WaitWithDefaultTimeout()
   158  		Expect(cloneInspect).To(Exit(0))
   159  		cloneData = cloneInspect.InspectContainerToJSON()
   160  		Expect(cloneData[0].HostConfig).To(HaveField("MemorySwappiness", int64(0)))
   161  
   162  	})
   163  
   164  	It("podman container clone in a pod", func() {
   165  		SkipIfRootlessCgroupsV1("starting a container with the memory limits not supported")
   166  		run := podmanTest.Podman([]string{"run", "-dt", "--pod", "new:1234", ALPINE, "sleep", "20"})
   167  		run.WaitWithDefaultTimeout()
   168  		Expect(run).To(Exit(0))
   169  		clone := podmanTest.Podman([]string{"container", "clone", run.OutputToString()})
   170  		clone.WaitWithDefaultTimeout()
   171  		Expect(clone).To(Exit(0))
   172  		ctrStart := podmanTest.Podman([]string{"container", "start", clone.OutputToString()})
   173  		ctrStart.WaitWithDefaultTimeout()
   174  		Expect(ctrStart).To(Exit(0))
   175  
   176  		checkClone := podmanTest.Podman([]string{"ps", "-f", "id=" + clone.OutputToString(), "--ns", "--format", "{{.Namespaces.IPC}} {{.Namespaces.UTS}} {{.Namespaces.NET}}"})
   177  		checkClone.WaitWithDefaultTimeout()
   178  		Expect(checkClone).Should(Exit(0))
   179  		cloneArray := checkClone.OutputToStringArray()
   180  
   181  		checkCreate := podmanTest.Podman([]string{"ps", "-f", "id=" + run.OutputToString(), "--ns", "--format", "{{.Namespaces.IPC}} {{.Namespaces.UTS}} {{.Namespaces.NET}}"})
   182  		checkCreate.WaitWithDefaultTimeout()
   183  		Expect(checkCreate).Should(Exit(0))
   184  		createArray := checkCreate.OutputToStringArray()
   185  
   186  		Expect(cloneArray).To(ContainElements(createArray))
   187  
   188  		ctrInspect := podmanTest.Podman([]string{"inspect", clone.OutputToString()})
   189  		ctrInspect.WaitWithDefaultTimeout()
   190  		Expect(ctrInspect).Should(Exit(0))
   191  
   192  		runInspect := podmanTest.Podman([]string{"inspect", run.OutputToString()})
   193  		runInspect.WaitWithDefaultTimeout()
   194  		Expect(runInspect).Should(Exit(0))
   195  
   196  		Expect(ctrInspect.InspectContainerToJSON()[0].Pod).Should(Equal(runInspect.InspectContainerToJSON()[0].Pod))
   197  		Expect(ctrInspect.InspectContainerToJSON()[0].HostConfig.NetworkMode).Should(Equal(runInspect.InspectContainerToJSON()[0].HostConfig.NetworkMode))
   198  	})
   199  
   200  	It("podman container clone to a pod", func() {
   201  		createPod := podmanTest.Podman([]string{"pod", "create", "--share", "uts", "--name", "foo-pod"})
   202  		createPod.WaitWithDefaultTimeout()
   203  		Expect(createPod).To(Exit(0))
   204  
   205  		ctr := podmanTest.RunTopContainer("ctr")
   206  		ctr.WaitWithDefaultTimeout()
   207  		Expect(ctr).Should(Exit(0))
   208  
   209  		clone := podmanTest.Podman([]string{"container", "clone", "--name", "cloned", "--pod", "foo-pod", "ctr"})
   210  		clone.WaitWithDefaultTimeout()
   211  		Expect(clone).To(Exit(0))
   212  
   213  		ctrInspect := podmanTest.Podman([]string{"inspect", "cloned"})
   214  		ctrInspect.WaitWithDefaultTimeout()
   215  		Expect(ctrInspect).Should(Exit(0))
   216  
   217  		Expect(ctrInspect.InspectContainerToJSON()[0].Pod).Should(Equal(createPod.OutputToString()))
   218  
   219  		Expect(ctrInspect.InspectContainerToJSON()[0].HostConfig.NetworkMode).Should(Not(ContainSubstring("container:")))
   220  
   221  		createPod = podmanTest.Podman([]string{"pod", "create", "--share", "uts,net", "--name", "bar-pod"})
   222  		createPod.WaitWithDefaultTimeout()
   223  		Expect(createPod).To(Exit(0))
   224  
   225  		clone = podmanTest.Podman([]string{"container", "clone", "--name", "cloned2", "--pod", "bar-pod", "ctr"})
   226  		clone.WaitWithDefaultTimeout()
   227  		Expect(clone).To(Exit(0))
   228  
   229  		ctrInspect = podmanTest.Podman([]string{"inspect", "cloned2"})
   230  		ctrInspect.WaitWithDefaultTimeout()
   231  		Expect(ctrInspect).Should(Exit(0))
   232  
   233  		Expect(ctrInspect.InspectContainerToJSON()[0].Pod).Should(Equal(createPod.OutputToString()))
   234  
   235  		Expect(ctrInspect.InspectContainerToJSON()[0].HostConfig.NetworkMode).Should(ContainSubstring("container:"))
   236  	})
   237  
   238  	It("podman container clone --destroy --force test", func() {
   239  		create := podmanTest.Podman([]string{"create", ALPINE})
   240  		create.WaitWithDefaultTimeout()
   241  		Expect(create).To(Exit(0))
   242  		clone := podmanTest.Podman([]string{"container", "clone", "--destroy", create.OutputToString()})
   243  		clone.WaitWithDefaultTimeout()
   244  		Expect(clone).To(Exit(0))
   245  
   246  		inspect := podmanTest.Podman([]string{"inspect", create.OutputToString()})
   247  		inspect.WaitWithDefaultTimeout()
   248  		Expect(inspect).ToNot(Exit(0))
   249  
   250  		run := podmanTest.Podman([]string{"run", "-dt", ALPINE})
   251  		run.WaitWithDefaultTimeout()
   252  		Expect(run).To(Exit(0))
   253  		clone = podmanTest.Podman([]string{"container", "clone", "--destroy", "-f", run.OutputToString()})
   254  		clone.WaitWithDefaultTimeout()
   255  		Expect(clone).To(Exit(0))
   256  
   257  		inspect = podmanTest.Podman([]string{"inspect", run.OutputToString()})
   258  		inspect.WaitWithDefaultTimeout()
   259  		Expect(inspect).ToNot(Exit(0))
   260  
   261  		run = podmanTest.Podman([]string{"run", "-dt", ALPINE})
   262  		run.WaitWithDefaultTimeout()
   263  		Expect(run).To(Exit(0))
   264  		clone = podmanTest.Podman([]string{"container", "clone", "-f", run.OutputToString()})
   265  		clone.WaitWithDefaultTimeout()
   266  		Expect(clone).ToNot(Exit(0))
   267  
   268  	})
   269  
   270  	It("podman container clone network passing", func() {
   271  		networkCreate := podmanTest.Podman([]string{"network", "create", "testing123"})
   272  		networkCreate.WaitWithDefaultTimeout()
   273  		defer podmanTest.removeNetwork("testing123")
   274  		Expect(networkCreate).To(Exit(0))
   275  		run := podmanTest.Podman([]string{"run", "--network", "bridge", "-dt", ALPINE})
   276  		run.WaitWithDefaultTimeout()
   277  		Expect(run).To(Exit(0))
   278  
   279  		connect := podmanTest.Podman([]string{"network", "connect", "testing123", run.OutputToString()})
   280  		connect.WaitWithDefaultTimeout()
   281  		Expect(connect).To(Exit(0))
   282  
   283  		clone := podmanTest.Podman([]string{"container", "clone", run.OutputToString()})
   284  		clone.WaitWithDefaultTimeout()
   285  		Expect(clone).To(Exit(0))
   286  
   287  		inspect := podmanTest.Podman([]string{"inspect", clone.OutputToString()})
   288  		inspect.WaitWithDefaultTimeout()
   289  		Expect(inspect).To(Exit(0))
   290  		Expect(inspect.InspectContainerToJSON()[0].NetworkSettings.Networks).To(HaveLen(2))
   291  		_, ok := inspect.InspectContainerToJSON()[0].NetworkSettings.Networks["testing123"]
   292  		Expect(ok).To(BeTrue())
   293  
   294  	})
   295  })