github.com/containers/podman/v2@v2.2.2-0.20210501105131-c1e07d070c4c/test/e2e/network_test.go (about) 1 package integration 2 3 import ( 4 "fmt" 5 "os" 6 "strings" 7 "time" 8 9 "github.com/containers/podman/v2/pkg/rootless" 10 . "github.com/containers/podman/v2/test/utils" 11 "github.com/containers/storage/pkg/stringid" 12 . "github.com/onsi/ginkgo" 13 . "github.com/onsi/gomega" 14 ) 15 16 var _ = Describe("Podman network", func() { 17 var ( 18 tempdir string 19 err error 20 podmanTest *PodmanTestIntegration 21 ) 22 23 BeforeEach(func() { 24 SkipIfRootless("rootless CNI is tech preview in RHEL 8.3.1") 25 26 tempdir, err = CreateTempDirInTempDir() 27 if err != nil { 28 os.Exit(1) 29 } 30 podmanTest = PodmanTestCreate(tempdir) 31 podmanTest.Setup() 32 }) 33 34 AfterEach(func() { 35 podmanTest.Cleanup() 36 f := CurrentGinkgoTestDescription() 37 processTestResult(f) 38 39 }) 40 41 It("podman network list", func() { 42 name, path := generateNetworkConfig(podmanTest) 43 defer removeConf(path) 44 45 session := podmanTest.Podman([]string{"network", "ls"}) 46 session.WaitWithDefaultTimeout() 47 Expect(session.ExitCode()).To(Equal(0)) 48 Expect(session.LineInOutputContains(name)).To(BeTrue()) 49 }) 50 51 It("podman network list -q", func() { 52 name, path := generateNetworkConfig(podmanTest) 53 defer removeConf(path) 54 55 session := podmanTest.Podman([]string{"network", "ls", "--quiet"}) 56 session.WaitWithDefaultTimeout() 57 Expect(session.ExitCode()).To(Equal(0)) 58 Expect(session.LineInOutputContains(name)).To(BeTrue()) 59 }) 60 61 It("podman network list --filter success", func() { 62 name, path := generateNetworkConfig(podmanTest) 63 defer removeConf(path) 64 65 session := podmanTest.Podman([]string{"network", "ls", "--filter", "plugin=bridge"}) 66 session.WaitWithDefaultTimeout() 67 Expect(session.ExitCode()).To(Equal(0)) 68 Expect(session.LineInOutputContains(name)).To(BeTrue()) 69 }) 70 71 It("podman network list --filter failure", func() { 72 name, path := generateNetworkConfig(podmanTest) 73 defer removeConf(path) 74 75 session := podmanTest.Podman([]string{"network", "ls", "--filter", "plugin=test"}) 76 session.WaitWithDefaultTimeout() 77 Expect(session.ExitCode()).To(Equal(0)) 78 Expect(session.LineInOutputContains(name)).To(BeFalse()) 79 }) 80 81 rm_func := func(rm string) { 82 It(fmt.Sprintf("podman network %s no args", rm), func() { 83 session := podmanTest.Podman([]string{"network", rm}) 84 session.WaitWithDefaultTimeout() 85 Expect(session.ExitCode()).ToNot(BeZero()) 86 87 }) 88 89 It(fmt.Sprintf("podman network %s", rm), func() { 90 name, path := generateNetworkConfig(podmanTest) 91 defer removeConf(path) 92 93 session := podmanTest.Podman([]string{"network", "ls", "--quiet"}) 94 session.WaitWithDefaultTimeout() 95 Expect(session.ExitCode()).To(Equal(0)) 96 Expect(session.LineInOutputContains(name)).To(BeTrue()) 97 98 rm := podmanTest.Podman([]string{"network", rm, name}) 99 rm.WaitWithDefaultTimeout() 100 Expect(rm.ExitCode()).To(BeZero()) 101 102 results := podmanTest.Podman([]string{"network", "ls", "--quiet"}) 103 results.WaitWithDefaultTimeout() 104 Expect(results.ExitCode()).To(Equal(0)) 105 Expect(results.LineInOutputContains(name)).To(BeFalse()) 106 }) 107 } 108 109 rm_func("rm") 110 rm_func("remove") 111 112 It("podman network inspect no args", func() { 113 session := podmanTest.Podman([]string{"network", "inspect"}) 114 session.WaitWithDefaultTimeout() 115 Expect(session.ExitCode()).ToNot(BeZero()) 116 }) 117 118 It("podman network inspect", func() { 119 name, path := generateNetworkConfig(podmanTest) 120 defer removeConf(path) 121 122 expectedNetworks := []string{name} 123 if !rootless.IsRootless() { 124 // rootful image contains "podman/cni/87-podman-bridge.conflist" for "podman" network 125 expectedNetworks = append(expectedNetworks, "podman") 126 } 127 session := podmanTest.Podman(append([]string{"network", "inspect"}, expectedNetworks...)) 128 session.WaitWithDefaultTimeout() 129 Expect(session.ExitCode()).To(Equal(0)) 130 Expect(session.IsJSONOutputValid()).To(BeTrue()) 131 }) 132 133 It("podman network inspect", func() { 134 name, path := generateNetworkConfig(podmanTest) 135 defer removeConf(path) 136 137 session := podmanTest.Podman([]string{"network", "inspect", name, "--format", "{{.cniVersion}}"}) 138 session.WaitWithDefaultTimeout() 139 Expect(session.ExitCode()).To(Equal(0)) 140 Expect(session.LineInOutputContains("0.3.0")).To(BeTrue()) 141 }) 142 143 It("podman inspect container single CNI network", func() { 144 netName := "testNetSingleCNI" 145 network := podmanTest.Podman([]string{"network", "create", "--subnet", "10.50.50.0/24", netName}) 146 network.WaitWithDefaultTimeout() 147 Expect(network.ExitCode()).To(BeZero()) 148 defer podmanTest.removeCNINetwork(netName) 149 150 ctrName := "testCtr" 151 container := podmanTest.Podman([]string{"run", "-dt", "--network", netName, "--name", ctrName, ALPINE, "top"}) 152 container.WaitWithDefaultTimeout() 153 Expect(container.ExitCode()).To(BeZero()) 154 155 inspect := podmanTest.Podman([]string{"inspect", ctrName}) 156 inspect.WaitWithDefaultTimeout() 157 Expect(inspect.ExitCode()).To(BeZero()) 158 conData := inspect.InspectContainerToJSON() 159 Expect(len(conData)).To(Equal(1)) 160 Expect(len(conData[0].NetworkSettings.Networks)).To(Equal(1)) 161 net, ok := conData[0].NetworkSettings.Networks[netName] 162 Expect(ok).To(BeTrue()) 163 Expect(net.NetworkID).To(Equal(netName)) 164 Expect(net.IPPrefixLen).To(Equal(24)) 165 Expect(strings.HasPrefix(net.IPAddress, "10.50.50.")).To(BeTrue()) 166 167 // Necessary to ensure the CNI network is removed cleanly 168 rmAll := podmanTest.Podman([]string{"rm", "-f", ctrName}) 169 rmAll.WaitWithDefaultTimeout() 170 Expect(rmAll.ExitCode()).To(BeZero()) 171 }) 172 173 It("podman inspect container two CNI networks (container not running)", func() { 174 netName1 := "testNetThreeCNI1" 175 network1 := podmanTest.Podman([]string{"network", "create", netName1}) 176 network1.WaitWithDefaultTimeout() 177 Expect(network1.ExitCode()).To(BeZero()) 178 defer podmanTest.removeCNINetwork(netName1) 179 180 netName2 := "testNetThreeCNI2" 181 network2 := podmanTest.Podman([]string{"network", "create", netName2}) 182 network2.WaitWithDefaultTimeout() 183 Expect(network2.ExitCode()).To(BeZero()) 184 defer podmanTest.removeCNINetwork(netName2) 185 186 ctrName := "testCtr" 187 container := podmanTest.Podman([]string{"create", "--network", fmt.Sprintf("%s,%s", netName1, netName2), "--name", ctrName, ALPINE, "top"}) 188 container.WaitWithDefaultTimeout() 189 Expect(container.ExitCode()).To(BeZero()) 190 191 inspect := podmanTest.Podman([]string{"inspect", ctrName}) 192 inspect.WaitWithDefaultTimeout() 193 Expect(inspect.ExitCode()).To(BeZero()) 194 conData := inspect.InspectContainerToJSON() 195 Expect(len(conData)).To(Equal(1)) 196 Expect(len(conData[0].NetworkSettings.Networks)).To(Equal(2)) 197 net1, ok := conData[0].NetworkSettings.Networks[netName1] 198 Expect(ok).To(BeTrue()) 199 Expect(net1.NetworkID).To(Equal(netName1)) 200 net2, ok := conData[0].NetworkSettings.Networks[netName2] 201 Expect(ok).To(BeTrue()) 202 Expect(net2.NetworkID).To(Equal(netName2)) 203 204 // Necessary to ensure the CNI network is removed cleanly 205 rmAll := podmanTest.Podman([]string{"rm", "-f", ctrName}) 206 rmAll.WaitWithDefaultTimeout() 207 Expect(rmAll.ExitCode()).To(BeZero()) 208 }) 209 210 It("podman inspect container two CNI networks", func() { 211 netName1 := "testNetTwoCNI1" 212 network1 := podmanTest.Podman([]string{"network", "create", "--subnet", "10.50.51.0/25", netName1}) 213 network1.WaitWithDefaultTimeout() 214 Expect(network1.ExitCode()).To(BeZero()) 215 defer podmanTest.removeCNINetwork(netName1) 216 217 netName2 := "testNetTwoCNI2" 218 network2 := podmanTest.Podman([]string{"network", "create", "--subnet", "10.50.51.128/26", netName2}) 219 network2.WaitWithDefaultTimeout() 220 Expect(network2.ExitCode()).To(BeZero()) 221 defer podmanTest.removeCNINetwork(netName2) 222 223 ctrName := "testCtr" 224 container := podmanTest.Podman([]string{"run", "-dt", "--network", fmt.Sprintf("%s,%s", netName1, netName2), "--name", ctrName, ALPINE, "top"}) 225 container.WaitWithDefaultTimeout() 226 Expect(container.ExitCode()).To(BeZero()) 227 228 inspect := podmanTest.Podman([]string{"inspect", ctrName}) 229 inspect.WaitWithDefaultTimeout() 230 Expect(inspect.ExitCode()).To(BeZero()) 231 conData := inspect.InspectContainerToJSON() 232 Expect(len(conData)).To(Equal(1)) 233 Expect(len(conData[0].NetworkSettings.Networks)).To(Equal(2)) 234 net1, ok := conData[0].NetworkSettings.Networks[netName1] 235 Expect(ok).To(BeTrue()) 236 Expect(net1.NetworkID).To(Equal(netName1)) 237 Expect(net1.IPPrefixLen).To(Equal(25)) 238 Expect(strings.HasPrefix(net1.IPAddress, "10.50.51.")).To(BeTrue()) 239 net2, ok := conData[0].NetworkSettings.Networks[netName2] 240 Expect(ok).To(BeTrue()) 241 Expect(net2.NetworkID).To(Equal(netName2)) 242 Expect(net2.IPPrefixLen).To(Equal(26)) 243 Expect(strings.HasPrefix(net2.IPAddress, "10.50.51.")).To(BeTrue()) 244 245 // Necessary to ensure the CNI network is removed cleanly 246 rmAll := podmanTest.Podman([]string{"rm", "-f", ctrName}) 247 rmAll.WaitWithDefaultTimeout() 248 Expect(rmAll.ExitCode()).To(BeZero()) 249 }) 250 251 It("podman network remove bogus", func() { 252 session := podmanTest.Podman([]string{"network", "rm", "bogus"}) 253 session.WaitWithDefaultTimeout() 254 Expect(session.ExitCode()).To(Equal(1)) 255 }) 256 257 It("podman network remove --force with pod", func() { 258 netName := "testnet" 259 session := podmanTest.Podman([]string{"network", "create", netName}) 260 session.WaitWithDefaultTimeout() 261 Expect(session.ExitCode()).To(BeZero()) 262 defer podmanTest.removeCNINetwork(netName) 263 264 session = podmanTest.Podman([]string{"pod", "create", "--network", netName}) 265 session.WaitWithDefaultTimeout() 266 Expect(session.ExitCode()).To(BeZero()) 267 podID := session.OutputToString() 268 269 session = podmanTest.Podman([]string{"create", "--pod", podID, ALPINE}) 270 session.WaitWithDefaultTimeout() 271 Expect(session.ExitCode()).To(BeZero()) 272 273 session = podmanTest.Podman([]string{"network", "rm", netName}) 274 session.WaitWithDefaultTimeout() 275 Expect(session.ExitCode()).To(Equal(2)) 276 277 session = podmanTest.Podman([]string{"network", "rm", "--force", netName}) 278 session.WaitWithDefaultTimeout() 279 Expect(session.ExitCode()).To(BeZero()) 280 281 // check if pod is deleted 282 session = podmanTest.Podman([]string{"pod", "exists", podID}) 283 session.WaitWithDefaultTimeout() 284 Expect(session.ExitCode()).To(Equal(1)) 285 286 // check if net is deleted 287 session = podmanTest.Podman([]string{"network", "ls"}) 288 session.WaitWithDefaultTimeout() 289 Expect(session.ExitCode()).To(BeZero()) 290 Expect(session.OutputToString()).To(Not(ContainSubstring(netName))) 291 }) 292 293 It("podman network remove with two networks", func() { 294 netName1 := "net1" 295 session := podmanTest.Podman([]string{"network", "create", netName1}) 296 session.WaitWithDefaultTimeout() 297 Expect(session.ExitCode()).To(BeZero()) 298 defer podmanTest.removeCNINetwork(netName1) 299 300 netName2 := "net2" 301 session = podmanTest.Podman([]string{"network", "create", netName2}) 302 session.WaitWithDefaultTimeout() 303 Expect(session.ExitCode()).To(BeZero()) 304 defer podmanTest.removeCNINetwork(netName2) 305 306 session = podmanTest.Podman([]string{"network", "rm", netName1, netName2}) 307 session.WaitWithDefaultTimeout() 308 Expect(session.ExitCode()).To(BeZero()) 309 lines := session.OutputToStringArray() 310 Expect(lines[0]).To(Equal(netName1)) 311 Expect(lines[1]).To(Equal(netName2)) 312 }) 313 It("podman network with multiple aliases", func() { 314 Skip("Until DNSName is updated on our CI images") 315 var worked bool 316 netName := "aliasTest" + stringid.GenerateNonCryptoID() 317 session := podmanTest.Podman([]string{"network", "create", netName}) 318 session.WaitWithDefaultTimeout() 319 Expect(session.ExitCode()).To(BeZero()) 320 defer podmanTest.removeCNINetwork(netName) 321 322 top := podmanTest.Podman([]string{"run", "-dt", "--name=web", "--network=" + netName, "--network-alias=web1", "--network-alias=web2", nginx}) 323 top.WaitWithDefaultTimeout() 324 Expect(top.ExitCode()).To(BeZero()) 325 interval := time.Duration(250 * time.Millisecond) 326 // Wait for the nginx service to be running 327 for i := 0; i < 6; i++ { 328 // Test curl against the container's name 329 c1 := podmanTest.Podman([]string{"run", "--network=" + netName, nginx, "curl", "web"}) 330 c1.WaitWithDefaultTimeout() 331 worked = Expect(c1.ExitCode()).To(BeZero()) 332 if worked { 333 break 334 } 335 time.Sleep(interval) 336 interval *= 2 337 } 338 Expect(worked).To(BeTrue()) 339 340 // Nginx is now running so no need to do a loop 341 // Test against the first alias 342 c2 := podmanTest.Podman([]string{"run", "--network=" + netName, nginx, "curl", "web1"}) 343 c2.WaitWithDefaultTimeout() 344 Expect(c2.ExitCode()).To(BeZero()) 345 346 // Test against the second alias 347 c3 := podmanTest.Podman([]string{"run", "--network=" + netName, nginx, "curl", "web2"}) 348 c3.WaitWithDefaultTimeout() 349 Expect(c3.ExitCode()).To(BeZero()) 350 }) 351 352 It("bad network name in disconnect should result in error", func() { 353 SkipIfRootless("network connect and disconnect are only rootfull") 354 dis := podmanTest.Podman([]string{"network", "disconnect", "foobar", "test"}) 355 dis.WaitWithDefaultTimeout() 356 Expect(dis.ExitCode()).ToNot(BeZero()) 357 358 }) 359 360 It("bad container name in network disconnect should result in error", func() { 361 SkipIfRootless("network connect and disconnect are only rootfull") 362 netName := "aliasTest" + stringid.GenerateNonCryptoID() 363 session := podmanTest.Podman([]string{"network", "create", netName}) 364 session.WaitWithDefaultTimeout() 365 Expect(session.ExitCode()).To(BeZero()) 366 defer podmanTest.removeCNINetwork(netName) 367 368 dis := podmanTest.Podman([]string{"network", "disconnect", netName, "foobar"}) 369 dis.WaitWithDefaultTimeout() 370 Expect(dis.ExitCode()).ToNot(BeZero()) 371 372 }) 373 374 It("podman network disconnect with invalid container state should result in error", func() { 375 SkipIfRootless("network connect and disconnect are only rootfull") 376 netName := "aliasTest" + stringid.GenerateNonCryptoID() 377 session := podmanTest.Podman([]string{"network", "create", netName}) 378 session.WaitWithDefaultTimeout() 379 Expect(session.ExitCode()).To(BeZero()) 380 defer podmanTest.removeCNINetwork(netName) 381 382 ctr := podmanTest.Podman([]string{"create", "--name", "test", "--network", netName, ALPINE, "top"}) 383 ctr.WaitWithDefaultTimeout() 384 Expect(ctr.ExitCode()).To(BeZero()) 385 386 dis := podmanTest.Podman([]string{"network", "disconnect", netName, "test"}) 387 dis.WaitWithDefaultTimeout() 388 Expect(dis.ExitCode()).ToNot(BeZero()) 389 }) 390 391 It("podman network disconnect", func() { 392 SkipIfRootless("network connect and disconnect are only rootfull") 393 netName := "aliasTest" + stringid.GenerateNonCryptoID() 394 session := podmanTest.Podman([]string{"network", "create", netName}) 395 session.WaitWithDefaultTimeout() 396 Expect(session.ExitCode()).To(BeZero()) 397 defer podmanTest.removeCNINetwork(netName) 398 399 ctr := podmanTest.Podman([]string{"run", "-dt", "--name", "test", "--network", netName, ALPINE, "top"}) 400 ctr.WaitWithDefaultTimeout() 401 Expect(ctr.ExitCode()).To(BeZero()) 402 403 exec := podmanTest.Podman([]string{"exec", "-it", "test", "ip", "addr", "show", "eth0"}) 404 exec.WaitWithDefaultTimeout() 405 Expect(exec.ExitCode()).To(BeZero()) 406 407 dis := podmanTest.Podman([]string{"network", "disconnect", netName, "test"}) 408 dis.WaitWithDefaultTimeout() 409 Expect(dis.ExitCode()).To(BeZero()) 410 411 exec = podmanTest.Podman([]string{"exec", "-it", "test", "ip", "addr", "show", "eth0"}) 412 exec.WaitWithDefaultTimeout() 413 Expect(exec.ExitCode()).ToNot(BeZero()) 414 }) 415 416 It("bad network name in connect should result in error", func() { 417 SkipIfRootless("network connect and disconnect are only rootfull") 418 dis := podmanTest.Podman([]string{"network", "connect", "foobar", "test"}) 419 dis.WaitWithDefaultTimeout() 420 Expect(dis.ExitCode()).ToNot(BeZero()) 421 422 }) 423 424 It("bad container name in network connect should result in error", func() { 425 SkipIfRootless("network connect and disconnect are only rootfull") 426 netName := "aliasTest" + stringid.GenerateNonCryptoID() 427 session := podmanTest.Podman([]string{"network", "create", netName}) 428 session.WaitWithDefaultTimeout() 429 Expect(session.ExitCode()).To(BeZero()) 430 defer podmanTest.removeCNINetwork(netName) 431 432 dis := podmanTest.Podman([]string{"network", "connect", netName, "foobar"}) 433 dis.WaitWithDefaultTimeout() 434 Expect(dis.ExitCode()).ToNot(BeZero()) 435 436 }) 437 438 It("podman connect on a container that already is connected to the network should error", func() { 439 SkipIfRootless("network connect and disconnect are only rootfull") 440 netName := "aliasTest" + stringid.GenerateNonCryptoID() 441 session := podmanTest.Podman([]string{"network", "create", netName}) 442 session.WaitWithDefaultTimeout() 443 Expect(session.ExitCode()).To(BeZero()) 444 defer podmanTest.removeCNINetwork(netName) 445 446 ctr := podmanTest.Podman([]string{"create", "--name", "test", "--network", netName, ALPINE, "top"}) 447 ctr.WaitWithDefaultTimeout() 448 Expect(ctr.ExitCode()).To(BeZero()) 449 450 con := podmanTest.Podman([]string{"network", "connect", netName, "test"}) 451 con.WaitWithDefaultTimeout() 452 Expect(con.ExitCode()).ToNot(BeZero()) 453 }) 454 455 It("podman network connect with invalid container state should result in error", func() { 456 SkipIfRootless("network connect and disconnect are only rootfull") 457 netName := "aliasTest" + stringid.GenerateNonCryptoID() 458 session := podmanTest.Podman([]string{"network", "create", netName}) 459 session.WaitWithDefaultTimeout() 460 Expect(session.ExitCode()).To(BeZero()) 461 defer podmanTest.removeCNINetwork(netName) 462 463 ctr := podmanTest.Podman([]string{"create", "--name", "test", "--network", netName, ALPINE, "top"}) 464 ctr.WaitWithDefaultTimeout() 465 Expect(ctr.ExitCode()).To(BeZero()) 466 467 dis := podmanTest.Podman([]string{"network", "connect", netName, "test"}) 468 dis.WaitWithDefaultTimeout() 469 Expect(dis.ExitCode()).ToNot(BeZero()) 470 }) 471 472 It("podman network connect", func() { 473 SkipIfRemote("This requires a pending PR to be merged before it will work") 474 SkipIfRootless("network connect and disconnect are only rootfull") 475 netName := "aliasTest" + stringid.GenerateNonCryptoID() 476 session := podmanTest.Podman([]string{"network", "create", netName}) 477 session.WaitWithDefaultTimeout() 478 Expect(session.ExitCode()).To(BeZero()) 479 defer podmanTest.removeCNINetwork(netName) 480 481 ctr := podmanTest.Podman([]string{"run", "-dt", "--name", "test", "--network", netName, ALPINE, "top"}) 482 ctr.WaitWithDefaultTimeout() 483 Expect(ctr.ExitCode()).To(BeZero()) 484 485 exec := podmanTest.Podman([]string{"exec", "-it", "test", "ip", "addr", "show", "eth0"}) 486 exec.WaitWithDefaultTimeout() 487 Expect(exec.ExitCode()).To(BeZero()) 488 489 // Create a second network 490 newNetName := "aliasTest" + stringid.GenerateNonCryptoID() 491 session = podmanTest.Podman([]string{"network", "create", newNetName}) 492 session.WaitWithDefaultTimeout() 493 Expect(session.ExitCode()).To(BeZero()) 494 defer podmanTest.removeCNINetwork(newNetName) 495 496 connect := podmanTest.Podman([]string{"network", "connect", newNetName, "test"}) 497 connect.WaitWithDefaultTimeout() 498 Expect(connect.ExitCode()).To(BeZero()) 499 500 exec = podmanTest.Podman([]string{"exec", "-it", "test", "ip", "addr", "show", "eth1"}) 501 exec.WaitWithDefaultTimeout() 502 Expect(exec.ExitCode()).To(BeZero()) 503 }) 504 505 It("podman network create/remove macvlan", func() { 506 net := "macvlan" + stringid.GenerateNonCryptoID() 507 nc := podmanTest.Podman([]string{"network", "create", "--macvlan", "lo", net}) 508 nc.WaitWithDefaultTimeout() 509 Expect(nc.ExitCode()).To(Equal(0)) 510 511 nc = podmanTest.Podman([]string{"network", "rm", net}) 512 nc.WaitWithDefaultTimeout() 513 Expect(nc.ExitCode()).To(Equal(0)) 514 }) 515 })