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