github.com/AbhinandanKurakure/podman/v3@v3.4.10/libpod/network/cni/config_test.go (about) 1 // +build linux 2 3 package cni_test 4 5 import ( 6 "bytes" 7 "io/ioutil" 8 "net" 9 "os" 10 "path/filepath" 11 "time" 12 13 . "github.com/onsi/ginkgo" 14 . "github.com/onsi/gomega" 15 gomegaTypes "github.com/onsi/gomega/types" 16 "github.com/sirupsen/logrus" 17 18 "github.com/containers/podman/v3/libpod/network/types" 19 "github.com/containers/podman/v3/libpod/network/util" 20 ) 21 22 var _ = Describe("Config", func() { 23 var ( 24 libpodNet types.ContainerNetwork 25 cniConfDir string 26 logBuffer bytes.Buffer 27 ) 28 29 BeforeEach(func() { 30 var err error 31 cniConfDir, err = ioutil.TempDir("", "podman_cni_test") 32 if err != nil { 33 Fail("Failed to create tmpdir") 34 35 } 36 logBuffer = bytes.Buffer{} 37 logrus.SetOutput(&logBuffer) 38 }) 39 40 JustBeforeEach(func() { 41 var err error 42 libpodNet, err = getNetworkInterface(cniConfDir, false) 43 if err != nil { 44 Fail("Failed to create NewCNINetworkInterface") 45 } 46 }) 47 48 AfterEach(func() { 49 os.RemoveAll(cniConfDir) 50 }) 51 52 Context("basic network config tests", func() { 53 54 It("check default network config exists", func() { 55 networks, err := libpodNet.NetworkList() 56 Expect(err).To(BeNil()) 57 Expect(networks).To(HaveLen(1)) 58 Expect(networks[0].Name).To(Equal("podman")) 59 Expect(networks[0].Driver).To(Equal("bridge")) 60 Expect(networks[0].NetworkInterface).To(Equal("cni-podman0")) 61 Expect(networks[0].Created.Before(time.Now())).To(BeTrue()) 62 Expect(networks[0].Subnets).To(HaveLen(1)) 63 Expect(networks[0].Subnets[0].Subnet.String()).To(Equal("10.88.0.0/16")) 64 Expect(networks[0].Subnets[0].Gateway.String()).To(Equal("10.88.0.1")) 65 Expect(networks[0].Subnets[0].LeaseRange).To(BeNil()) 66 Expect(networks[0].IPAMOptions).To(HaveKeyWithValue("driver", "host-local")) 67 Expect(networks[0].Options).To(BeEmpty()) 68 Expect(networks[0].Labels).To(BeEmpty()) 69 Expect(networks[0].DNSEnabled).To(BeFalse()) 70 Expect(networks[0].Internal).To(BeFalse()) 71 }) 72 73 It("basic network create, inspect and remove", func() { 74 // Because we get the time from the file create timestamp there is small precision 75 // loss so lets remove 500 milliseconds to make sure this test does not flake. 76 now := time.Now().Add(-500 * time.Millisecond) 77 network := types.Network{} 78 network1, err := libpodNet.NetworkCreate(network) 79 Expect(err).To(BeNil()) 80 Expect(network1.Name).ToNot(BeEmpty()) 81 path := filepath.Join(cniConfDir, network1.Name+".conflist") 82 Expect(path).To(BeARegularFile()) 83 Expect(network1.ID).ToNot(BeEmpty()) 84 Expect(network1.NetworkInterface).ToNot(BeEmpty()) 85 Expect(network1.Driver).To(Equal("bridge")) 86 Expect(network1.Labels).To(BeEmpty()) 87 Expect(network1.Options).To(BeEmpty()) 88 Expect(network1.IPAMOptions).ToNot(BeEmpty()) 89 Expect(network1.IPAMOptions).To(HaveKeyWithValue("driver", "host-local")) 90 Expect(network1.Created.After(now)).To(BeTrue()) 91 Expect(network1.Subnets).To(HaveLen(1)) 92 Expect(network1.Subnets[0].Subnet.String()).To(Equal("10.89.0.0/24")) 93 Expect(network1.Subnets[0].Gateway.String()).To(Equal("10.89.0.1")) 94 Expect(network1.Subnets[0].LeaseRange).To(BeNil()) 95 Expect(network1.DNSEnabled).To(BeFalse()) 96 Expect(network1.Internal).To(BeFalse()) 97 98 // inspect by name 99 network2, err := libpodNet.NetworkInspect(network1.Name) 100 Expect(err).To(BeNil()) 101 Expect(network2).To(Equal(network1)) 102 103 // inspect by ID 104 network2, err = libpodNet.NetworkInspect(network1.ID) 105 Expect(err).To(BeNil()) 106 Expect(network2).To(Equal(network1)) 107 108 // inspect by partial ID 109 network2, err = libpodNet.NetworkInspect(network1.ID[:10]) 110 Expect(err).To(BeNil()) 111 Expect(network2).To(Equal(network1)) 112 113 // create a new interface to force a config load from disk 114 libpodNet, err = getNetworkInterface(cniConfDir, false) 115 Expect(err).To(BeNil()) 116 117 network2, err = libpodNet.NetworkInspect(network1.Name) 118 Expect(err).To(BeNil()) 119 Expect(network2).To(Equal(network1)) 120 121 err = libpodNet.NetworkRemove(network1.Name) 122 Expect(err).To(BeNil()) 123 Expect(path).ToNot(BeARegularFile()) 124 125 _, err = libpodNet.NetworkInspect(network1.Name) 126 Expect(err).To(HaveOccurred()) 127 Expect(err.Error()).To(ContainSubstring("network not found")) 128 }) 129 130 It("create two networks", func() { 131 network := types.Network{} 132 network1, err := libpodNet.NetworkCreate(network) 133 Expect(err).To(BeNil()) 134 Expect(network1.Name).ToNot(BeEmpty()) 135 Expect(network1.Subnets).To(HaveLen(1)) 136 137 network = types.Network{} 138 network2, err := libpodNet.NetworkCreate(network) 139 Expect(err).To(BeNil()) 140 Expect(network2.Name).ToNot(Equal(network1.Name)) 141 Expect(network2.ID).ToNot(Equal(network1.ID)) 142 Expect(network2.NetworkInterface).ToNot(Equal(network1.NetworkInterface)) 143 Expect(network2.Subnets).To(HaveLen(1)) 144 Expect(network2.Subnets[0].Subnet.Contains(network1.Subnets[0].Subnet.IP)).To(BeFalse()) 145 }) 146 147 It("create bridge config", func() { 148 network := types.Network{Driver: "bridge"} 149 network1, err := libpodNet.NetworkCreate(network) 150 Expect(err).To(BeNil()) 151 Expect(network1.Name).ToNot(BeEmpty()) 152 Expect(filepath.Join(cniConfDir, network1.Name+".conflist")).To(BeARegularFile()) 153 Expect(network1.ID).ToNot(BeEmpty()) 154 Expect(network1.NetworkInterface).ToNot(BeEmpty()) 155 Expect(network1.Driver).To(Equal("bridge")) 156 Expect(network1.Labels).To(BeEmpty()) 157 Expect(network1.Options).To(BeEmpty()) 158 Expect(network1.IPAMOptions).ToNot(BeEmpty()) 159 Expect(network1.IPAMOptions).To(HaveKeyWithValue("driver", "host-local")) 160 Expect(network1.Subnets).To(HaveLen(1)) 161 Expect(network1.Subnets[0].Subnet.String()).To(Equal("10.89.0.0/24")) 162 Expect(network1.Subnets[0].Gateway.String()).To(Equal("10.89.0.1")) 163 Expect(network1.Subnets[0].LeaseRange).To(BeNil()) 164 Expect(network1.DNSEnabled).To(BeFalse()) 165 Expect(network1.Internal).To(BeFalse()) 166 }) 167 168 It("create bridge with same name should fail", func() { 169 network := types.Network{ 170 Driver: "bridge", 171 NetworkInterface: "cni-podman2", 172 } 173 network1, err := libpodNet.NetworkCreate(network) 174 Expect(err).To(BeNil()) 175 Expect(network1.Name).ToNot(BeEmpty()) 176 Expect(network1.ID).ToNot(BeEmpty()) 177 Expect(network1.NetworkInterface).To(Equal("cni-podman2")) 178 Expect(network1.Driver).To(Equal("bridge")) 179 180 _, err = libpodNet.NetworkCreate(network) 181 Expect(err).To(HaveOccurred()) 182 Expect(err.Error()).To(ContainSubstring("bridge name cni-podman2 already in use")) 183 }) 184 185 It("create macvlan config", func() { 186 network := types.Network{Driver: "macvlan"} 187 network1, err := libpodNet.NetworkCreate(network) 188 Expect(err).To(BeNil()) 189 Expect(network1.Name).ToNot(BeEmpty()) 190 Expect(filepath.Join(cniConfDir, network1.Name+".conflist")).To(BeARegularFile()) 191 Expect(network1.ID).ToNot(BeEmpty()) 192 Expect(network1.Driver).To(Equal("macvlan")) 193 Expect(network1.Labels).To(BeEmpty()) 194 Expect(network1.Options).To(BeEmpty()) 195 Expect(network1.IPAMOptions).ToNot(BeEmpty()) 196 Expect(network1.IPAMOptions).To(HaveKeyWithValue("driver", "dhcp")) 197 Expect(network1.Subnets).To(HaveLen(0)) 198 Expect(network1.DNSEnabled).To(BeFalse()) 199 Expect(network1.Internal).To(BeFalse()) 200 }) 201 202 It("create macvlan config with device", func() { 203 network := types.Network{ 204 Driver: "macvlan", 205 NetworkInterface: "lo", 206 } 207 network1, err := libpodNet.NetworkCreate(network) 208 Expect(err).To(BeNil()) 209 Expect(network1.Name).ToNot(BeEmpty()) 210 path := filepath.Join(cniConfDir, network1.Name+".conflist") 211 Expect(path).To(BeARegularFile()) 212 Expect(network1.ID).ToNot(BeEmpty()) 213 Expect(network1.Driver).To(Equal("macvlan")) 214 Expect(network1.Labels).To(BeEmpty()) 215 Expect(network1.Options).To(BeEmpty()) 216 Expect(network1.Subnets).To(HaveLen(0)) 217 Expect(network1.DNSEnabled).To(BeFalse()) 218 Expect(network1.Internal).To(BeFalse()) 219 Expect(network1.IPAMOptions).To(HaveKeyWithValue("driver", "dhcp")) 220 grepInFile(path, `"type": "macvlan"`) 221 grepInFile(path, `"master": "lo"`) 222 grepInFile(path, `"type": "dhcp"`) 223 }) 224 225 It("create macvlan config with subnet", func() { 226 subnet := "10.1.0.0/24" 227 n, _ := types.ParseCIDR(subnet) 228 network := types.Network{ 229 Driver: "macvlan", 230 Subnets: []types.Subnet{ 231 {Subnet: n}, 232 }, 233 } 234 network1, err := libpodNet.NetworkCreate(network) 235 Expect(err).To(BeNil()) 236 Expect(network1.Name).ToNot(BeEmpty()) 237 path := filepath.Join(cniConfDir, network1.Name+".conflist") 238 Expect(path).To(BeARegularFile()) 239 Expect(network1.ID).ToNot(BeEmpty()) 240 Expect(network1.Driver).To(Equal("macvlan")) 241 Expect(network1.Labels).To(BeEmpty()) 242 Expect(network1.Options).To(BeEmpty()) 243 Expect(network1.Subnets).To(HaveLen(1)) 244 Expect(network1.Subnets[0].Subnet.String()).To(Equal(subnet)) 245 Expect(network1.Subnets[0].Gateway.String()).To(Equal("10.1.0.1")) 246 Expect(network1.Subnets[0].LeaseRange).To(BeNil()) 247 Expect(network1.DNSEnabled).To(BeFalse()) 248 Expect(network1.Internal).To(BeFalse()) 249 Expect(network1.IPAMOptions).To(HaveKeyWithValue("driver", "host-local")) 250 grepInFile(path, `"type": "host-local"`) 251 }) 252 253 It("create macvlan config with invalid device", func() { 254 network := types.Network{ 255 Driver: "macvlan", 256 NetworkInterface: "idonotexists", 257 } 258 _, err := libpodNet.NetworkCreate(network) 259 Expect(err).To(HaveOccurred()) 260 Expect(err.Error()).To(ContainSubstring("parent interface idonotexists does not exists")) 261 }) 262 263 It("create macvlan config with internal should fail", func() { 264 network := types.Network{ 265 Driver: "macvlan", 266 Internal: true, 267 } 268 _, err := libpodNet.NetworkCreate(network) 269 Expect(err).To(HaveOccurred()) 270 Expect(err.Error()).To(ContainSubstring("internal is not supported with macvlan")) 271 }) 272 273 It("create bridge with subnet", func() { 274 subnet := "10.0.0.0/24" 275 n, _ := types.ParseCIDR(subnet) 276 277 network := types.Network{ 278 Driver: "bridge", 279 Subnets: []types.Subnet{ 280 {Subnet: n}, 281 }, 282 } 283 network1, err := libpodNet.NetworkCreate(network) 284 Expect(err).To(BeNil()) 285 Expect(network1.Name).ToNot(BeEmpty()) 286 Expect(network1.ID).ToNot(BeEmpty()) 287 Expect(network1.NetworkInterface).ToNot(BeEmpty()) 288 Expect(network1.Driver).To(Equal("bridge")) 289 Expect(network1.Subnets).To(HaveLen(1)) 290 Expect(network1.Subnets[0].Subnet.String()).To(Equal(subnet)) 291 Expect(network1.Subnets[0].Gateway.String()).To(Equal("10.0.0.1")) 292 Expect(network1.Subnets[0].LeaseRange).To(BeNil()) 293 }) 294 295 It("create bridge with ipv6 subnet", func() { 296 subnet := "fdcc::/64" 297 n, _ := types.ParseCIDR(subnet) 298 299 network := types.Network{ 300 Driver: "bridge", 301 Subnets: []types.Subnet{ 302 {Subnet: n}, 303 }, 304 } 305 network1, err := libpodNet.NetworkCreate(network) 306 Expect(err).To(BeNil()) 307 Expect(network1.Name).ToNot(BeEmpty()) 308 Expect(network1.ID).ToNot(BeEmpty()) 309 Expect(network1.NetworkInterface).ToNot(BeEmpty()) 310 Expect(network1.Driver).To(Equal("bridge")) 311 Expect(network1.IPv6Enabled).To(BeTrue()) 312 Expect(network1.Subnets).To(HaveLen(1)) 313 Expect(network1.Subnets[0].Subnet.String()).To(Equal(subnet)) 314 Expect(network1.Subnets[0].Gateway.String()).To(Equal("fdcc::1")) 315 Expect(network1.Subnets[0].LeaseRange).To(BeNil()) 316 }) 317 318 It("create bridge with ipv6 enabled", func() { 319 network := types.Network{ 320 Driver: "bridge", 321 IPv6Enabled: true, 322 } 323 network1, err := libpodNet.NetworkCreate(network) 324 Expect(err).To(BeNil()) 325 Expect(network1.Name).ToNot(BeEmpty()) 326 Expect(network1.ID).ToNot(BeEmpty()) 327 Expect(network1.NetworkInterface).ToNot(BeEmpty()) 328 Expect(network1.Driver).To(Equal("bridge")) 329 Expect(network1.Subnets).To(HaveLen(2)) 330 Expect(network1.Subnets[0].Subnet.String()).To(ContainSubstring(".0/24")) 331 Expect(network1.Subnets[0].Gateway).ToNot(BeNil()) 332 Expect(network1.Subnets[0].LeaseRange).To(BeNil()) 333 Expect(network1.Subnets[1].Subnet.String()).To(ContainSubstring("::/64")) 334 Expect(network1.Subnets[1].Gateway).ToNot(BeNil()) 335 Expect(network1.Subnets[1].LeaseRange).To(BeNil()) 336 }) 337 338 It("create bridge with ipv6 enabled and ipv4 subnet", func() { 339 subnet := "10.100.0.0/24" 340 n, _ := types.ParseCIDR(subnet) 341 342 network := types.Network{ 343 Driver: "bridge", 344 Subnets: []types.Subnet{ 345 {Subnet: n}, 346 }, 347 IPv6Enabled: true, 348 } 349 network1, err := libpodNet.NetworkCreate(network) 350 Expect(err).To(BeNil()) 351 Expect(network1.Name).ToNot(BeEmpty()) 352 Expect(network1.ID).ToNot(BeEmpty()) 353 Expect(network1.NetworkInterface).ToNot(BeEmpty()) 354 Expect(network1.Driver).To(Equal("bridge")) 355 Expect(network1.Subnets).To(HaveLen(2)) 356 Expect(network1.Subnets[0].Subnet.String()).To(Equal(subnet)) 357 Expect(network1.Subnets[0].Gateway).ToNot(BeNil()) 358 Expect(network1.Subnets[0].LeaseRange).To(BeNil()) 359 Expect(network1.Subnets[1].Subnet.String()).To(ContainSubstring("::/64")) 360 Expect(network1.Subnets[1].Gateway).ToNot(BeNil()) 361 Expect(network1.Subnets[1].LeaseRange).To(BeNil()) 362 }) 363 364 It("create bridge with ipv6 enabled and ipv6 subnet", func() { 365 subnet := "fd66::/64" 366 n, _ := types.ParseCIDR(subnet) 367 368 network := types.Network{ 369 Driver: "bridge", 370 Subnets: []types.Subnet{ 371 {Subnet: n}, 372 }, 373 IPv6Enabled: true, 374 } 375 network1, err := libpodNet.NetworkCreate(network) 376 Expect(err).To(BeNil()) 377 Expect(network1.Name).ToNot(BeEmpty()) 378 Expect(network1.ID).ToNot(BeEmpty()) 379 Expect(network1.NetworkInterface).ToNot(BeEmpty()) 380 Expect(network1.Driver).To(Equal("bridge")) 381 Expect(network1.Subnets).To(HaveLen(2)) 382 Expect(network1.Subnets[0].Subnet.String()).To(Equal(subnet)) 383 Expect(network1.Subnets[0].Gateway).ToNot(BeNil()) 384 Expect(network1.Subnets[0].LeaseRange).To(BeNil()) 385 Expect(network1.Subnets[1].Subnet.String()).To(ContainSubstring(".0/24")) 386 Expect(network1.Subnets[1].Gateway).ToNot(BeNil()) 387 Expect(network1.Subnets[1].LeaseRange).To(BeNil()) 388 }) 389 390 It("create bridge with ipv6 enabled and ipv4+ipv6 subnet", func() { 391 subnet1 := "10.100.0.0/24" 392 n1, _ := types.ParseCIDR(subnet1) 393 subnet2 := "fd66::/64" 394 n2, _ := types.ParseCIDR(subnet2) 395 396 network := types.Network{ 397 Driver: "bridge", 398 Subnets: []types.Subnet{ 399 {Subnet: n1}, {Subnet: n2}, 400 }, 401 IPv6Enabled: true, 402 } 403 network1, err := libpodNet.NetworkCreate(network) 404 Expect(err).To(BeNil()) 405 Expect(network1.Name).ToNot(BeEmpty()) 406 Expect(network1.ID).ToNot(BeEmpty()) 407 Expect(network1.NetworkInterface).ToNot(BeEmpty()) 408 Expect(network1.Driver).To(Equal("bridge")) 409 Expect(network1.Subnets).To(HaveLen(2)) 410 Expect(network1.Subnets[0].Subnet.String()).To(Equal(subnet1)) 411 Expect(network1.Subnets[0].Gateway).ToNot(BeNil()) 412 Expect(network1.Subnets[0].LeaseRange).To(BeNil()) 413 Expect(network1.Subnets[1].Subnet.String()).To(Equal(subnet2)) 414 Expect(network1.Subnets[1].Gateway).ToNot(BeNil()) 415 Expect(network1.Subnets[1].LeaseRange).To(BeNil()) 416 }) 417 418 It("create bridge with ipv6 enabled and two ipv4 subnets", func() { 419 subnet1 := "10.100.0.0/24" 420 n1, _ := types.ParseCIDR(subnet1) 421 subnet2 := "10.200.0.0/24" 422 n2, _ := types.ParseCIDR(subnet2) 423 424 network := types.Network{ 425 Driver: "bridge", 426 Subnets: []types.Subnet{ 427 {Subnet: n1}, {Subnet: n2}, 428 }, 429 IPv6Enabled: true, 430 } 431 network1, err := libpodNet.NetworkCreate(network) 432 Expect(err).To(BeNil()) 433 Expect(network1.Name).ToNot(BeEmpty()) 434 Expect(network1.ID).ToNot(BeEmpty()) 435 Expect(network1.NetworkInterface).ToNot(BeEmpty()) 436 Expect(network1.Driver).To(Equal("bridge")) 437 Expect(network1.Subnets).To(HaveLen(3)) 438 Expect(network1.Subnets[0].Subnet.String()).To(Equal(subnet1)) 439 Expect(network1.Subnets[0].Gateway).ToNot(BeNil()) 440 Expect(network1.Subnets[0].LeaseRange).To(BeNil()) 441 Expect(network1.Subnets[1].Subnet.String()).To(Equal(subnet2)) 442 Expect(network1.Subnets[1].Gateway).ToNot(BeNil()) 443 Expect(network1.Subnets[1].LeaseRange).To(BeNil()) 444 Expect(network1.Subnets[2].Subnet.String()).To(ContainSubstring("::/64")) 445 Expect(network1.Subnets[2].Gateway).ToNot(BeNil()) 446 Expect(network1.Subnets[2].LeaseRange).To(BeNil()) 447 }) 448 449 It("create bridge with subnet and gateway", func() { 450 subnet := "10.0.0.5/24" 451 n, _ := types.ParseCIDR(subnet) 452 gateway := "10.0.0.50" 453 g := net.ParseIP(gateway) 454 network := types.Network{ 455 Driver: "bridge", 456 Subnets: []types.Subnet{ 457 {Subnet: n, Gateway: g}, 458 }, 459 } 460 network1, err := libpodNet.NetworkCreate(network) 461 Expect(err).To(BeNil()) 462 Expect(network1.Name).ToNot(BeEmpty()) 463 Expect(network1.ID).ToNot(BeEmpty()) 464 Expect(network1.NetworkInterface).ToNot(BeEmpty()) 465 Expect(network1.Driver).To(Equal("bridge")) 466 Expect(network1.Subnets).To(HaveLen(1)) 467 Expect(network1.Subnets[0].Subnet.String()).To(Equal("10.0.0.0/24")) 468 Expect(network1.Subnets[0].Gateway.String()).To(Equal(gateway)) 469 Expect(network1.Subnets[0].LeaseRange).To(BeNil()) 470 }) 471 472 It("create bridge with subnet and gateway not in the same subnet", func() { 473 subnet := "10.0.0.0/24" 474 n, _ := types.ParseCIDR(subnet) 475 gateway := "10.10.0.50" 476 g := net.ParseIP(gateway) 477 network := types.Network{ 478 Driver: "bridge", 479 Subnets: []types.Subnet{ 480 {Subnet: n, Gateway: g}, 481 }, 482 } 483 _, err := libpodNet.NetworkCreate(network) 484 Expect(err).To(HaveOccurred()) 485 Expect(err.Error()).To(ContainSubstring("not in subnet")) 486 }) 487 488 It("create bridge with subnet and lease range", func() { 489 subnet := "10.0.0.0/24" 490 n, _ := types.ParseCIDR(subnet) 491 startIP := "10.0.0.10" 492 network := types.Network{ 493 Driver: "bridge", 494 Subnets: []types.Subnet{ 495 {Subnet: n, LeaseRange: &types.LeaseRange{ 496 StartIP: net.ParseIP(startIP), 497 }}, 498 }, 499 } 500 network1, err := libpodNet.NetworkCreate(network) 501 Expect(err).To(BeNil()) 502 Expect(network1.Name).ToNot(BeEmpty()) 503 Expect(network1.ID).ToNot(BeEmpty()) 504 Expect(network1.NetworkInterface).ToNot(BeEmpty()) 505 Expect(network1.Driver).To(Equal("bridge")) 506 Expect(network1.Subnets).To(HaveLen(1)) 507 Expect(network1.Subnets[0].Subnet.String()).To(Equal(subnet)) 508 Expect(network1.Subnets[0].Gateway.String()).To(Equal("10.0.0.1")) 509 Expect(network1.Subnets[0].LeaseRange.StartIP.String()).To(Equal(startIP)) 510 511 endIP := "10.0.0.10" 512 network = types.Network{ 513 Driver: "bridge", 514 Subnets: []types.Subnet{ 515 {Subnet: n, LeaseRange: &types.LeaseRange{ 516 EndIP: net.ParseIP(endIP), 517 }}, 518 }, 519 } 520 network1, err = libpodNet.NetworkCreate(network) 521 Expect(err).To(BeNil()) 522 Expect(network1.Name).ToNot(BeEmpty()) 523 Expect(filepath.Join(cniConfDir, network1.Name+".conflist")).To(BeARegularFile()) 524 Expect(network1.ID).ToNot(BeEmpty()) 525 Expect(network1.NetworkInterface).ToNot(BeEmpty()) 526 Expect(network1.Driver).To(Equal("bridge")) 527 Expect(network1.Subnets).To(HaveLen(1)) 528 Expect(network1.Subnets[0].Subnet.String()).To(Equal(subnet)) 529 Expect(network1.Subnets[0].Gateway.String()).To(Equal("10.0.0.1")) 530 Expect(network1.Subnets[0].LeaseRange.EndIP.String()).To(Equal(endIP)) 531 532 network = types.Network{ 533 Driver: "bridge", 534 Subnets: []types.Subnet{ 535 {Subnet: n, LeaseRange: &types.LeaseRange{ 536 StartIP: net.ParseIP(startIP), 537 EndIP: net.ParseIP(endIP), 538 }}, 539 }, 540 } 541 network1, err = libpodNet.NetworkCreate(network) 542 Expect(err).To(BeNil()) 543 Expect(network1.Name).ToNot(BeEmpty()) 544 Expect(network1.ID).ToNot(BeEmpty()) 545 Expect(network1.NetworkInterface).ToNot(BeEmpty()) 546 Expect(network1.Driver).To(Equal("bridge")) 547 Expect(network1.Subnets).To(HaveLen(1)) 548 Expect(network1.Subnets[0].Subnet.String()).To(Equal(subnet)) 549 Expect(network1.Subnets[0].Gateway.String()).To(Equal("10.0.0.1")) 550 Expect(network1.Subnets[0].LeaseRange.StartIP.String()).To(Equal(startIP)) 551 Expect(network1.Subnets[0].LeaseRange.EndIP.String()).To(Equal(endIP)) 552 }) 553 554 It("create bridge with subnet and invalid lease range", func() { 555 subnet := "10.0.0.0/24" 556 n, _ := types.ParseCIDR(subnet) 557 startIP := "10.0.1.2" 558 network := types.Network{ 559 Driver: "bridge", 560 Subnets: []types.Subnet{ 561 {Subnet: n, LeaseRange: &types.LeaseRange{ 562 StartIP: net.ParseIP(startIP), 563 }}, 564 }, 565 } 566 _, err := libpodNet.NetworkCreate(network) 567 Expect(err).To(HaveOccurred()) 568 Expect(err.Error()).To(ContainSubstring("not in subnet")) 569 570 endIP := "10.1.1.1" 571 network = types.Network{ 572 Driver: "bridge", 573 Subnets: []types.Subnet{ 574 {Subnet: n, LeaseRange: &types.LeaseRange{ 575 EndIP: net.ParseIP(endIP), 576 }}, 577 }, 578 } 579 _, err = libpodNet.NetworkCreate(network) 580 Expect(err).To(HaveOccurred()) 581 Expect(err.Error()).To(ContainSubstring("not in subnet")) 582 }) 583 584 It("create bridge with broken subnet", func() { 585 network := types.Network{ 586 Driver: "bridge", 587 Subnets: []types.Subnet{ 588 {Subnet: types.IPNet{}}, 589 }, 590 } 591 _, err := libpodNet.NetworkCreate(network) 592 Expect(err).To(HaveOccurred()) 593 Expect(err.Error()).To(ContainSubstring("subnet invalid")) 594 }) 595 596 It("create network with name", func() { 597 name := "myname" 598 network := types.Network{ 599 Name: name, 600 } 601 network1, err := libpodNet.NetworkCreate(network) 602 Expect(err).To(BeNil()) 603 Expect(network1.Name).To(Equal(name)) 604 Expect(network1.NetworkInterface).ToNot(Equal(name)) 605 Expect(network1.Driver).To(Equal("bridge")) 606 }) 607 608 It("create network with invalid name", func() { 609 name := "myname@some" 610 network := types.Network{ 611 Name: name, 612 } 613 _, err := libpodNet.NetworkCreate(network) 614 Expect(err).To(HaveOccurred()) 615 }) 616 617 It("create network with name", func() { 618 name := "myname" 619 network := types.Network{ 620 Name: name, 621 } 622 network1, err := libpodNet.NetworkCreate(network) 623 Expect(err).To(BeNil()) 624 Expect(network1.Name).To(Equal(name)) 625 Expect(network1.NetworkInterface).ToNot(Equal(name)) 626 Expect(network1.Driver).To(Equal("bridge")) 627 }) 628 629 It("create network with invalid name", func() { 630 name := "myname@some" 631 network := types.Network{ 632 Name: name, 633 } 634 _, err := libpodNet.NetworkCreate(network) 635 Expect(err).To(HaveOccurred()) 636 }) 637 638 It("create network with interface name", func() { 639 name := "myname" 640 network := types.Network{ 641 NetworkInterface: name, 642 } 643 network1, err := libpodNet.NetworkCreate(network) 644 Expect(err).To(BeNil()) 645 Expect(network1.Name).ToNot(Equal(name)) 646 Expect(network1.NetworkInterface).To(Equal(name)) 647 Expect(network1.Driver).To(Equal("bridge")) 648 }) 649 650 It("create network with invalid interface name", func() { 651 name := "myname@some" 652 network := types.Network{ 653 NetworkInterface: name, 654 } 655 _, err := libpodNet.NetworkCreate(network) 656 Expect(err).To(HaveOccurred()) 657 }) 658 659 It("create network with ID should fail", func() { 660 id := "17f29b073143d8cd97b5bbe492bdeffec1c5fee55cc1fe2112c8b9335f8b6121" 661 network := types.Network{ 662 ID: id, 663 } 664 _, err := libpodNet.NetworkCreate(network) 665 Expect(err).To(HaveOccurred()) 666 Expect(err.Error()).To(ContainSubstring("ID can not be set for network create")) 667 }) 668 669 It("create bridge with dns", func() { 670 network := types.Network{ 671 Driver: "bridge", 672 DNSEnabled: true, 673 } 674 network1, err := libpodNet.NetworkCreate(network) 675 Expect(err).To(BeNil()) 676 Expect(network1.Driver).To(Equal("bridge")) 677 Expect(network1.DNSEnabled).To(BeTrue()) 678 path := filepath.Join(cniConfDir, network1.Name+".conflist") 679 Expect(path).To(BeARegularFile()) 680 grepInFile(path, `"type": "dnsname"`) 681 }) 682 683 It("create bridge with internal", func() { 684 network := types.Network{ 685 Driver: "bridge", 686 Internal: true, 687 } 688 network1, err := libpodNet.NetworkCreate(network) 689 Expect(err).To(BeNil()) 690 Expect(network1.Driver).To(Equal("bridge")) 691 Expect(network1.Subnets).To(HaveLen(1)) 692 Expect(network1.Subnets[0].Subnet.String()).ToNot(BeEmpty()) 693 Expect(network1.Subnets[0].Gateway).To(BeNil()) 694 Expect(network1.Internal).To(BeTrue()) 695 }) 696 697 It("create network with labels", func() { 698 network := types.Network{ 699 Labels: map[string]string{ 700 "key": "value", 701 }, 702 } 703 network1, err := libpodNet.NetworkCreate(network) 704 Expect(err).To(BeNil()) 705 Expect(network1.Driver).To(Equal("bridge")) 706 Expect(network1.Labels).ToNot(BeNil()) 707 Expect(network1.Labels).To(ContainElement("value")) 708 }) 709 710 It("create network with mtu option", func() { 711 network := types.Network{ 712 Options: map[string]string{ 713 "mtu": "1500", 714 }, 715 } 716 network1, err := libpodNet.NetworkCreate(network) 717 Expect(err).To(BeNil()) 718 Expect(network1.Driver).To(Equal("bridge")) 719 Expect(network1.Options).ToNot(BeNil()) 720 path := filepath.Join(cniConfDir, network1.Name+".conflist") 721 Expect(path).To(BeARegularFile()) 722 grepInFile(path, `"mtu": 1500,`) 723 Expect(network1.Options).To(HaveKeyWithValue("mtu", "1500")) 724 }) 725 726 It("create network with invalid mtu option", func() { 727 network := types.Network{ 728 Options: map[string]string{ 729 "mtu": "abc", 730 }, 731 } 732 _, err := libpodNet.NetworkCreate(network) 733 Expect(err).To(HaveOccurred()) 734 Expect(err.Error()).To(ContainSubstring(`parsing "abc": invalid syntax`)) 735 736 network = types.Network{ 737 Options: map[string]string{ 738 "mtu": "-1", 739 }, 740 } 741 _, err = libpodNet.NetworkCreate(network) 742 Expect(err).To(HaveOccurred()) 743 Expect(err.Error()).To(ContainSubstring(`mtu -1 is less than zero`)) 744 }) 745 746 It("create macvlan network with mtu option", func() { 747 network := types.Network{ 748 Driver: "macvlan", 749 Options: map[string]string{ 750 "mtu": "1500", 751 }, 752 } 753 network1, err := libpodNet.NetworkCreate(network) 754 Expect(err).To(BeNil()) 755 Expect(network1.Driver).To(Equal("macvlan")) 756 Expect(network1.Options).ToNot(BeNil()) 757 path := filepath.Join(cniConfDir, network1.Name+".conflist") 758 Expect(path).To(BeARegularFile()) 759 grepInFile(path, `"mtu": 1500`) 760 Expect(network1.Options).To(HaveKeyWithValue("mtu", "1500")) 761 }) 762 763 It("create network with vlan option", func() { 764 network := types.Network{ 765 Options: map[string]string{ 766 "vlan": "5", 767 }, 768 } 769 network1, err := libpodNet.NetworkCreate(network) 770 Expect(err).To(BeNil()) 771 Expect(network1.Driver).To(Equal("bridge")) 772 Expect(network1.Options).ToNot(BeNil()) 773 path := filepath.Join(cniConfDir, network1.Name+".conflist") 774 Expect(path).To(BeARegularFile()) 775 grepInFile(path, `"vlan": 5,`) 776 Expect(network1.Options).To(HaveKeyWithValue("vlan", "5")) 777 }) 778 779 It("create network with invalid vlan option", func() { 780 network := types.Network{ 781 Options: map[string]string{ 782 "vlan": "abc", 783 }, 784 } 785 _, err := libpodNet.NetworkCreate(network) 786 Expect(err).To(HaveOccurred()) 787 Expect(err.Error()).To(ContainSubstring(`parsing "abc": invalid syntax`)) 788 789 network = types.Network{ 790 Options: map[string]string{ 791 "vlan": "-1", 792 }, 793 } 794 _, err = libpodNet.NetworkCreate(network) 795 Expect(err).To(HaveOccurred()) 796 Expect(err.Error()).To(ContainSubstring(`vlan ID -1 must be between 0 and 4094`)) 797 }) 798 799 It("network create unsupported option", func() { 800 network := types.Network{Options: map[string]string{ 801 "someopt": "", 802 }} 803 _, err := libpodNet.NetworkCreate(network) 804 Expect(err).To(HaveOccurred()) 805 Expect(err.Error()).To(ContainSubstring("unsupported network option someopt")) 806 }) 807 808 It("network create unsupported driver", func() { 809 network := types.Network{ 810 Driver: "someDriver", 811 } 812 _, err := libpodNet.NetworkCreate(network) 813 Expect(err).To(HaveOccurred()) 814 Expect(err.Error()).To(ContainSubstring("unsupported driver someDriver")) 815 }) 816 817 It("network create internal and dns", func() { 818 network := types.Network{ 819 Driver: "bridge", 820 Internal: true, 821 DNSEnabled: true, 822 } 823 network1, err := libpodNet.NetworkCreate(network) 824 Expect(err).To(BeNil()) 825 Expect(network1.Driver).To(Equal("bridge")) 826 Expect(network1.Subnets).To(HaveLen(1)) 827 Expect(network1.Subnets[0].Subnet.String()).ToNot(BeEmpty()) 828 Expect(network1.Subnets[0].Gateway).To(BeNil()) 829 Expect(network1.Internal).To(BeTrue()) 830 // internal and dns does not work, dns should be disabled 831 Expect(network1.DNSEnabled).To(BeFalse()) 832 logString := logBuffer.String() 833 Expect(logString).To(ContainSubstring("dnsname and internal networks are incompatible")) 834 }) 835 836 It("create config with podman machine plugin", func() { 837 libpodNet, err := getNetworkInterface(cniConfDir, true) 838 Expect(err).To(BeNil()) 839 840 network := types.Network{} 841 network1, err := libpodNet.NetworkCreate(network) 842 Expect(err).To(BeNil()) 843 Expect(network1.Driver).To(Equal("bridge")) 844 path := filepath.Join(cniConfDir, network1.Name+".conflist") 845 Expect(path).To(BeARegularFile()) 846 grepInFile(path, `"type": "podman-machine",`) 847 }) 848 849 It("network inspect partial ID", func() { 850 network := types.Network{Name: "net4"} 851 network1, err := libpodNet.NetworkCreate(network) 852 Expect(err).To(BeNil()) 853 Expect(network1.ID).To(Equal("b44b7426c006839e7fe6f15d1faf64db58079d5233cba09b43be2257c1652cf5")) 854 network = types.Network{Name: "net5"} 855 network1, err = libpodNet.NetworkCreate(network) 856 Expect(err).To(BeNil()) 857 Expect(network1.ID).To(Equal("b67e86fb039828ad686aa13667975b9e51f192eb617044faf06cded9d31602af")) 858 859 // Note ID is the sha256 from the name 860 // both net4 and net5 have an ID starting with b... 861 _, err = libpodNet.NetworkInspect("b") 862 Expect(err).To(HaveOccurred()) 863 Expect(err.Error()).To(ContainSubstring("more than one result for network ID")) 864 }) 865 866 It("network create two with same name", func() { 867 network := types.Network{Name: "net"} 868 network1, err := libpodNet.NetworkCreate(network) 869 Expect(err).To(BeNil()) 870 Expect(network1.Name).To(Equal("net")) 871 network = types.Network{Name: "net"} 872 _, err = libpodNet.NetworkCreate(network) 873 Expect(err).To(HaveOccurred()) 874 Expect(err.Error()).To(ContainSubstring("network name net already used")) 875 }) 876 877 It("remove default network config should fail", func() { 878 err := libpodNet.NetworkRemove("podman") 879 Expect(err).To(HaveOccurred()) 880 Expect(err.Error()).To(Equal("default network podman cannot be removed")) 881 882 network, err := libpodNet.NetworkInspect("podman") 883 Expect(err).To(BeNil()) 884 err = libpodNet.NetworkRemove(network.ID) 885 Expect(err).To(HaveOccurred()) 886 Expect(err.Error()).To(Equal("default network podman cannot be removed")) 887 }) 888 889 }) 890 891 Context("network load valid existing ones", func() { 892 893 BeforeEach(func() { 894 dir := "testfiles/valid" 895 files, err := ioutil.ReadDir(dir) 896 if err != nil { 897 Fail("Failed to read test directory") 898 } 899 for _, file := range files { 900 filename := file.Name() 901 data, err := ioutil.ReadFile(filepath.Join(dir, filename)) 902 if err != nil { 903 Fail("Failed to copy test files") 904 } 905 err = ioutil.WriteFile(filepath.Join(cniConfDir, filename), data, 0700) 906 if err != nil { 907 Fail("Failed to copy test files") 908 } 909 } 910 }) 911 912 It("load networks from disk", func() { 913 nets, err := libpodNet.NetworkList() 914 Expect(err).To(BeNil()) 915 Expect(nets).To(HaveLen(9)) 916 // test the we do not show logrus warnings/errors 917 logString := logBuffer.String() 918 Expect(logString).To(BeEmpty()) 919 }) 920 921 It("change network struct fields should not affect network struct in the backend", func() { 922 nets, err := libpodNet.NetworkList() 923 Expect(err).To(BeNil()) 924 Expect(nets).To(HaveLen(9)) 925 926 nets[0].Name = "myname" 927 nets, err = libpodNet.NetworkList() 928 Expect(err).To(BeNil()) 929 Expect(nets).To(HaveLen(9)) 930 Expect(nets).ToNot(ContainElement(HaveNetworkName("myname"))) 931 932 network, err := libpodNet.NetworkInspect("bridge") 933 Expect(err).To(BeNil()) 934 network.NetworkInterface = "abc" 935 936 network, err = libpodNet.NetworkInspect("bridge") 937 Expect(err).To(BeNil()) 938 Expect(network.NetworkInterface).ToNot(Equal("abc")) 939 }) 940 941 It("bridge network", func() { 942 network, err := libpodNet.NetworkInspect("bridge") 943 Expect(err).To(BeNil()) 944 Expect(network.Name).To(Equal("bridge")) 945 Expect(network.ID).To(HaveLen(64)) 946 Expect(network.NetworkInterface).To(Equal("cni-podman9")) 947 Expect(network.Driver).To(Equal("bridge")) 948 Expect(network.Subnets).To(HaveLen(1)) 949 Expect(network.Subnets[0].Subnet.String()).To(Equal("10.89.8.0/24")) 950 Expect(network.Subnets[0].Gateway.String()).To(Equal("10.89.8.1")) 951 Expect(network.Subnets[0].LeaseRange).ToNot(BeNil()) 952 Expect(network.Subnets[0].LeaseRange.StartIP.String()).To(Equal("10.89.8.20")) 953 Expect(network.Subnets[0].LeaseRange.EndIP.String()).To(Equal("10.89.8.50")) 954 Expect(network.Internal).To(BeFalse()) 955 }) 956 957 It("macvlan network", func() { 958 network, err := libpodNet.NetworkInspect("macvlan") 959 Expect(err).To(BeNil()) 960 Expect(network.Name).To(Equal("macvlan")) 961 Expect(network.ID).To(HaveLen(64)) 962 Expect(network.NetworkInterface).To(Equal("lo")) 963 Expect(network.Driver).To(Equal("macvlan")) 964 Expect(network.Subnets).To(HaveLen(0)) 965 // DHCP 966 }) 967 968 It("internal network", func() { 969 network, err := libpodNet.NetworkInspect("internal") 970 Expect(err).To(BeNil()) 971 Expect(network.Name).To(Equal("internal")) 972 Expect(network.ID).To(HaveLen(64)) 973 Expect(network.NetworkInterface).To(Equal("cni-podman8")) 974 Expect(network.Driver).To(Equal("bridge")) 975 Expect(network.Subnets).To(HaveLen(1)) 976 Expect(network.Subnets[0].Subnet.String()).To(Equal("10.89.7.0/24")) 977 Expect(network.Subnets[0].Gateway).To(BeNil()) 978 Expect(network.Internal).To(BeTrue()) 979 }) 980 981 It("bridge network with mtu", func() { 982 network, err := libpodNet.NetworkInspect("mtu") 983 Expect(err).To(BeNil()) 984 Expect(network.Name).To(Equal("mtu")) 985 Expect(network.ID).To(HaveLen(64)) 986 Expect(network.NetworkInterface).To(Equal("cni-podman13")) 987 Expect(network.Driver).To(Equal("bridge")) 988 Expect(network.Subnets).To(HaveLen(1)) 989 Expect(network.Subnets[0].Subnet.String()).To(Equal("10.89.11.0/24")) 990 Expect(network.Subnets[0].Gateway.String()).To(Equal("10.89.11.1")) 991 Expect(network.Internal).To(BeFalse()) 992 Expect(network.Options).To(HaveLen(1)) 993 Expect(network.Options).To(HaveKeyWithValue("mtu", "1500")) 994 }) 995 996 It("macvlan network with mtu", func() { 997 network, err := libpodNet.NetworkInspect("macvlan_mtu") 998 Expect(err).To(BeNil()) 999 Expect(network.Name).To(Equal("macvlan_mtu")) 1000 Expect(network.ID).To(HaveLen(64)) 1001 Expect(network.NetworkInterface).To(Equal("lo")) 1002 Expect(network.Driver).To(Equal("macvlan")) 1003 Expect(network.Subnets).To(HaveLen(0)) 1004 Expect(network.Internal).To(BeFalse()) 1005 Expect(network.Options).To(HaveLen(1)) 1006 Expect(network.Options).To(HaveKeyWithValue("mtu", "1300")) 1007 Expect(network.IPAMOptions).To(HaveLen(1)) 1008 Expect(network.IPAMOptions).To(HaveKeyWithValue("driver", "dhcp")) 1009 }) 1010 1011 It("bridge network with vlan", func() { 1012 network, err := libpodNet.NetworkInspect("vlan") 1013 Expect(err).To(BeNil()) 1014 Expect(network.Name).To(Equal("vlan")) 1015 Expect(network.ID).To(HaveLen(64)) 1016 Expect(network.NetworkInterface).To(Equal("cni-podman14")) 1017 Expect(network.Driver).To(Equal("bridge")) 1018 Expect(network.Subnets).To(HaveLen(1)) 1019 Expect(network.Options).To(HaveLen(1)) 1020 Expect(network.Options).To(HaveKeyWithValue("vlan", "5")) 1021 }) 1022 1023 It("bridge network with labels", func() { 1024 network, err := libpodNet.NetworkInspect("label") 1025 Expect(err).To(BeNil()) 1026 Expect(network.Name).To(Equal("label")) 1027 Expect(network.ID).To(HaveLen(64)) 1028 Expect(network.NetworkInterface).To(Equal("cni-podman15")) 1029 Expect(network.Driver).To(Equal("bridge")) 1030 Expect(network.Subnets).To(HaveLen(1)) 1031 Expect(network.Labels).To(HaveLen(1)) 1032 Expect(network.Labels).To(HaveKeyWithValue("mykey", "value")) 1033 }) 1034 1035 It("dual stack network", func() { 1036 network, err := libpodNet.NetworkInspect("dualstack") 1037 Expect(err).To(BeNil()) 1038 Expect(network.Name).To(Equal("dualstack")) 1039 Expect(network.ID).To(HaveLen(64)) 1040 Expect(network.NetworkInterface).To(Equal("cni-podman21")) 1041 Expect(network.Driver).To(Equal("bridge")) 1042 Expect(network.Subnets).To(HaveLen(2)) 1043 1044 sub1, _ := types.ParseCIDR("fd10:88:a::/64") 1045 sub2, _ := types.ParseCIDR("10.89.19.0/24") 1046 Expect(network.Subnets).To(ContainElements( 1047 types.Subnet{Subnet: sub1, Gateway: net.ParseIP("fd10:88:a::1")}, 1048 types.Subnet{Subnet: sub2, Gateway: net.ParseIP("10.89.19.10").To4()}, 1049 )) 1050 }) 1051 1052 It("network list with filters (name)", func() { 1053 filters := map[string][]string{ 1054 "name": {"internal", "bridge"}, 1055 } 1056 filterFuncs, err := util.GenerateNetworkFilters(filters) 1057 Expect(err).To(BeNil()) 1058 1059 networks, err := libpodNet.NetworkList(filterFuncs...) 1060 Expect(err).To(BeNil()) 1061 Expect(networks).To(HaveLen(2)) 1062 Expect(networks).To(ConsistOf(HaveNetworkName("internal"), HaveNetworkName("bridge"))) 1063 }) 1064 1065 It("network list with filters (partial name)", func() { 1066 filters := map[string][]string{ 1067 "name": {"inte", "bri"}, 1068 } 1069 filterFuncs, err := util.GenerateNetworkFilters(filters) 1070 Expect(err).To(BeNil()) 1071 1072 networks, err := libpodNet.NetworkList(filterFuncs...) 1073 Expect(err).To(BeNil()) 1074 Expect(networks).To(HaveLen(2)) 1075 Expect(networks).To(ConsistOf(HaveNetworkName("internal"), HaveNetworkName("bridge"))) 1076 }) 1077 1078 It("network list with filters (id)", func() { 1079 filters := map[string][]string{ 1080 "id": {"3bed2cb3a3acf7b6a8ef408420cc682d5520e26976d354254f528c965612054f", "17f29b073143d8cd97b5bbe492bdeffec1c5fee55cc1fe2112c8b9335f8b6121"}, 1081 } 1082 filterFuncs, err := util.GenerateNetworkFilters(filters) 1083 Expect(err).To(BeNil()) 1084 1085 networks, err := libpodNet.NetworkList(filterFuncs...) 1086 Expect(err).To(BeNil()) 1087 Expect(networks).To(HaveLen(2)) 1088 Expect(networks).To(ConsistOf(HaveNetworkName("internal"), HaveNetworkName("bridge"))) 1089 }) 1090 1091 It("network list with filters (id)", func() { 1092 filters := map[string][]string{ 1093 "id": {"3bed2cb3a3acf7b6a8ef408420cc682d5520e26976d354254f528c965612054f", "17f29b073143d8cd97b5bbe492bdeffec1c5fee55cc1fe2112c8b9335f8b6121"}, 1094 } 1095 filterFuncs, err := util.GenerateNetworkFilters(filters) 1096 Expect(err).To(BeNil()) 1097 1098 networks, err := libpodNet.NetworkList(filterFuncs...) 1099 Expect(err).To(BeNil()) 1100 Expect(networks).To(HaveLen(2)) 1101 Expect(networks).To(ConsistOf(HaveNetworkName("internal"), HaveNetworkName("bridge"))) 1102 }) 1103 1104 It("network list with filters (partial id)", func() { 1105 filters := map[string][]string{ 1106 "id": {"3bed2cb3a3acf7b6a8ef408420", "17f29b073143d8cd97b5bbe492bde"}, 1107 } 1108 filterFuncs, err := util.GenerateNetworkFilters(filters) 1109 Expect(err).To(BeNil()) 1110 1111 networks, err := libpodNet.NetworkList(filterFuncs...) 1112 Expect(err).To(BeNil()) 1113 Expect(networks).To(HaveLen(2)) 1114 Expect(networks).To(ConsistOf(HaveNetworkName("internal"), HaveNetworkName("bridge"))) 1115 }) 1116 1117 It("network list with filters (driver)", func() { 1118 filters := map[string][]string{ 1119 "driver": {"bridge", "macvlan"}, 1120 } 1121 filterFuncs, err := util.GenerateNetworkFilters(filters) 1122 Expect(err).To(BeNil()) 1123 1124 networks, err := libpodNet.NetworkList(filterFuncs...) 1125 Expect(err).To(BeNil()) 1126 Expect(networks).To(HaveLen(9)) 1127 Expect(networks).To(ConsistOf(HaveNetworkName("internal"), HaveNetworkName("bridge"), 1128 HaveNetworkName("mtu"), HaveNetworkName("vlan"), HaveNetworkName("podman"), 1129 HaveNetworkName("label"), HaveNetworkName("macvlan"), HaveNetworkName("macvlan_mtu"), HaveNetworkName("dualstack"))) 1130 }) 1131 1132 It("network list with filters (label)", func() { 1133 filters := map[string][]string{ 1134 "label": {"mykey"}, 1135 } 1136 filterFuncs, err := util.GenerateNetworkFilters(filters) 1137 Expect(err).To(BeNil()) 1138 1139 networks, err := libpodNet.NetworkList(filterFuncs...) 1140 Expect(err).To(BeNil()) 1141 Expect(networks).To(HaveLen(1)) 1142 Expect(networks).To(ConsistOf(HaveNetworkName("label"))) 1143 1144 filters = map[string][]string{ 1145 "label": {"mykey=value"}, 1146 } 1147 filterFuncs, err = util.GenerateNetworkFilters(filters) 1148 Expect(err).To(BeNil()) 1149 1150 networks, err = libpodNet.NetworkList(filterFuncs...) 1151 Expect(err).To(BeNil()) 1152 Expect(networks).To(HaveLen(1)) 1153 Expect(networks).To(ConsistOf(HaveNetworkName("label"))) 1154 }) 1155 1156 It("network list with filters", func() { 1157 filters := map[string][]string{ 1158 "driver": {"bridge"}, 1159 "label": {"mykey"}, 1160 } 1161 filterFuncs, err := util.GenerateNetworkFilters(filters) 1162 Expect(err).To(BeNil()) 1163 Expect(filterFuncs).To(HaveLen(2)) 1164 1165 networks, err := libpodNet.NetworkList(filterFuncs...) 1166 Expect(err).To(BeNil()) 1167 Expect(networks).To(HaveLen(1)) 1168 Expect(networks).To(ConsistOf(HaveNetworkName("label"))) 1169 1170 filters = map[string][]string{ 1171 "driver": {"macvlan"}, 1172 "label": {"mykey"}, 1173 } 1174 filterFuncs, err = util.GenerateNetworkFilters(filters) 1175 Expect(err).To(BeNil()) 1176 1177 networks, err = libpodNet.NetworkList(filterFuncs...) 1178 Expect(err).To(BeNil()) 1179 Expect(networks).To(HaveLen(0)) 1180 }) 1181 1182 It("crate bridge network with used interface name", func() { 1183 network := types.Network{ 1184 NetworkInterface: "cni-podman9", 1185 } 1186 _, err := libpodNet.NetworkCreate(network) 1187 Expect(err).To(HaveOccurred()) 1188 Expect(err.Error()).To(ContainSubstring("bridge name cni-podman9 already in use")) 1189 }) 1190 }) 1191 1192 Context("network load invalid existing ones", func() { 1193 1194 BeforeEach(func() { 1195 dir := "testfiles/invalid" 1196 files, err := ioutil.ReadDir(dir) 1197 if err != nil { 1198 Fail("Failed to read test directory") 1199 } 1200 for _, file := range files { 1201 filename := file.Name() 1202 data, err := ioutil.ReadFile(filepath.Join(dir, filename)) 1203 if err != nil { 1204 Fail("Failed to copy test files") 1205 } 1206 err = ioutil.WriteFile(filepath.Join(cniConfDir, filename), data, 0700) 1207 if err != nil { 1208 Fail("Failed to copy test files") 1209 } 1210 } 1211 }) 1212 1213 It("load invalid networks from disk", func() { 1214 nets, err := libpodNet.NetworkList() 1215 Expect(err).To(BeNil()) 1216 Expect(nets).To(HaveLen(2)) 1217 logString := logBuffer.String() 1218 Expect(logString).To(ContainSubstring("noname.conflist: error parsing configuration list: no name")) 1219 Expect(logString).To(ContainSubstring("noplugin.conflist: error parsing configuration list: no plugins in list")) 1220 Expect(logString).To(ContainSubstring("invalidname.conflist has invalid name, skipping: names must match")) 1221 Expect(logString).To(ContainSubstring("has the same network name as")) 1222 Expect(logString).To(ContainSubstring("broken.conflist: error parsing configuration list")) 1223 Expect(logString).To(ContainSubstring("invalid_gateway.conflist could not be converted to a libpod config, skipping: failed to parse gateway ip 10.89.8")) 1224 }) 1225 1226 }) 1227 1228 }) 1229 1230 func grepInFile(path string, match string) { 1231 data, err := ioutil.ReadFile(path) 1232 ExpectWithOffset(1, err).To(BeNil()) 1233 ExpectWithOffset(1, string(data)).To(ContainSubstring(match)) 1234 } 1235 1236 // HaveNetworkName is a custom GomegaMatcher to match a network name 1237 func HaveNetworkName(name string) gomegaTypes.GomegaMatcher { 1238 return WithTransform(func(e types.Network) string { 1239 return e.Name 1240 }, Equal(name)) 1241 }