github.com/pwn-term/docker@v0.0.0-20210616085119-6e977cce2565/libnetwork/libnetwork_test.go (about) 1 package libnetwork_test 2 3 import ( 4 "fmt" 5 "io/ioutil" 6 "net" 7 "net/http" 8 "net/http/httptest" 9 "os" 10 "sync" 11 "testing" 12 13 "github.com/docker/docker/pkg/plugins" 14 "github.com/docker/docker/pkg/reexec" 15 "github.com/docker/libnetwork" 16 "github.com/docker/libnetwork/config" 17 "github.com/docker/libnetwork/datastore" 18 "github.com/docker/libnetwork/driverapi" 19 "github.com/docker/libnetwork/ipamapi" 20 "github.com/docker/libnetwork/netlabel" 21 "github.com/docker/libnetwork/options" 22 "github.com/docker/libnetwork/testutils" 23 "github.com/docker/libnetwork/types" 24 "github.com/sirupsen/logrus" 25 "github.com/vishvananda/netns" 26 ) 27 28 const ( 29 bridgeNetType = "bridge" 30 ) 31 32 var controller libnetwork.NetworkController 33 34 func TestMain(m *testing.M) { 35 if reexec.Init() { 36 return 37 } 38 39 if err := createController(); err != nil { 40 logrus.Errorf("Error creating controller: %v", err) 41 os.Exit(1) 42 } 43 44 x := m.Run() 45 controller.Stop() 46 os.Exit(x) 47 } 48 49 func createController() error { 50 var err error 51 52 // Cleanup local datastore file 53 os.Remove(datastore.DefaultScopes("")[datastore.LocalScope].Client.Address) 54 55 option := options.Generic{ 56 "EnableIPForwarding": true, 57 } 58 59 genericOption := make(map[string]interface{}) 60 genericOption[netlabel.GenericData] = option 61 62 cfgOptions, err := libnetwork.OptionBoltdbWithRandomDBFile() 63 if err != nil { 64 return err 65 } 66 controller, err = libnetwork.New(append(cfgOptions, config.OptionDriverConfig(bridgeNetType, genericOption))...) 67 return err 68 } 69 70 func createTestNetwork(networkType, networkName string, netOption options.Generic, ipamV4Configs, ipamV6Configs []*libnetwork.IpamConf) (libnetwork.Network, error) { 71 return controller.NewNetwork(networkType, networkName, "", 72 libnetwork.NetworkOptionGeneric(netOption), 73 libnetwork.NetworkOptionIpam(ipamapi.DefaultIPAM, "", ipamV4Configs, ipamV6Configs, nil)) 74 } 75 76 func getEmptyGenericOption() map[string]interface{} { 77 genericOption := make(map[string]interface{}) 78 genericOption[netlabel.GenericData] = options.Generic{} 79 return genericOption 80 } 81 82 func getPortMapping() []types.PortBinding { 83 return []types.PortBinding{ 84 {Proto: types.TCP, Port: uint16(230), HostPort: uint16(23000)}, 85 {Proto: types.UDP, Port: uint16(200), HostPort: uint16(22000)}, 86 {Proto: types.TCP, Port: uint16(120), HostPort: uint16(12000)}, 87 {Proto: types.TCP, Port: uint16(320), HostPort: uint16(32000), HostPortEnd: uint16(32999)}, 88 {Proto: types.UDP, Port: uint16(420), HostPort: uint16(42000), HostPortEnd: uint16(42001)}, 89 } 90 } 91 92 func isNotFound(err error) bool { 93 _, ok := (err).(types.NotFoundError) 94 return ok 95 } 96 97 func TestNull(t *testing.T) { 98 cnt, err := controller.NewSandbox("null_container", 99 libnetwork.OptionHostname("test"), 100 libnetwork.OptionDomainname("docker.io"), 101 libnetwork.OptionExtraHost("web", "192.168.0.1")) 102 if err != nil { 103 t.Fatal(err) 104 } 105 106 network, err := createTestNetwork("null", "testnull", options.Generic{}, nil, nil) 107 if err != nil { 108 t.Fatal(err) 109 } 110 111 ep, err := network.CreateEndpoint("testep") 112 if err != nil { 113 t.Fatal(err) 114 } 115 116 err = ep.Join(cnt) 117 if err != nil { 118 t.Fatal(err) 119 } 120 121 err = ep.Leave(cnt) 122 if err != nil { 123 t.Fatal(err) 124 } 125 126 if err := ep.Delete(false); err != nil { 127 t.Fatal(err) 128 } 129 130 if err := cnt.Delete(); err != nil { 131 t.Fatal(err) 132 } 133 134 // host type is special network. Cannot be removed. 135 err = network.Delete() 136 if err == nil { 137 t.Fatal(err) 138 } 139 if _, ok := err.(types.ForbiddenError); !ok { 140 t.Fatalf("Unexpected error type") 141 } 142 } 143 144 func TestBridge(t *testing.T) { 145 if !testutils.IsRunningInContainer() { 146 defer testutils.SetupTestOSContext(t)() 147 } 148 149 netOption := options.Generic{ 150 netlabel.EnableIPv6: true, 151 netlabel.GenericData: options.Generic{ 152 "BridgeName": "testnetwork", 153 "EnableICC": true, 154 "EnableIPMasquerade": true, 155 }, 156 } 157 ipamV4ConfList := []*libnetwork.IpamConf{{PreferredPool: "192.168.100.0/24", Gateway: "192.168.100.1"}} 158 ipamV6ConfList := []*libnetwork.IpamConf{{PreferredPool: "fe90::/64", Gateway: "fe90::22"}} 159 160 network, err := createTestNetwork(bridgeNetType, "testnetwork", netOption, ipamV4ConfList, ipamV6ConfList) 161 if err != nil { 162 t.Fatal(err) 163 } 164 defer func() { 165 if err := network.Delete(); err != nil { 166 t.Fatal(err) 167 } 168 }() 169 170 ep, err := network.CreateEndpoint("testep") 171 if err != nil { 172 t.Fatal(err) 173 } 174 175 sb, err := controller.NewSandbox(containerID, libnetwork.OptionPortMapping(getPortMapping())) 176 if err != nil { 177 t.Fatal(err) 178 } 179 defer func() { 180 if err := sb.Delete(); err != nil { 181 t.Fatal(err) 182 } 183 }() 184 185 err = ep.Join(sb) 186 if err != nil { 187 t.Fatal(err) 188 } 189 190 epInfo, err := ep.DriverInfo() 191 if err != nil { 192 t.Fatal(err) 193 } 194 pmd, ok := epInfo[netlabel.PortMap] 195 if !ok { 196 t.Fatalf("Could not find expected info in endpoint data") 197 } 198 pm, ok := pmd.([]types.PortBinding) 199 if !ok { 200 t.Fatalf("Unexpected format for port mapping in endpoint operational data") 201 } 202 if len(pm) != 10 { 203 t.Fatalf("Incomplete data for port mapping in endpoint operational data: %d", len(pm)) 204 } 205 } 206 207 func TestUnknownDriver(t *testing.T) { 208 if !testutils.IsRunningInContainer() { 209 defer testutils.SetupTestOSContext(t)() 210 } 211 212 _, err := createTestNetwork("unknowndriver", "testnetwork", options.Generic{}, nil, nil) 213 if err == nil { 214 t.Fatal("Expected to fail. But instead succeeded") 215 } 216 217 if !isNotFound(err) { 218 t.Fatalf("Did not fail with expected error. Actual error: %v", err) 219 } 220 } 221 222 func TestNilRemoteDriver(t *testing.T) { 223 _, err := controller.NewNetwork("framerelay", "dummy", "", 224 libnetwork.NetworkOptionGeneric(getEmptyGenericOption())) 225 if err == nil { 226 t.Fatal("Expected to fail. But instead succeeded") 227 } 228 229 if !isNotFound(err) { 230 t.Fatalf("Did not fail with expected error. Actual error: %v", err) 231 } 232 } 233 234 func TestNetworkName(t *testing.T) { 235 if !testutils.IsRunningInContainer() { 236 defer testutils.SetupTestOSContext(t)() 237 } 238 239 netOption := options.Generic{ 240 netlabel.GenericData: options.Generic{ 241 "BridgeName": "testnetwork", 242 }, 243 } 244 245 _, err := createTestNetwork(bridgeNetType, "", netOption, nil, nil) 246 if err == nil { 247 t.Fatal("Expected to fail. But instead succeeded") 248 } 249 250 if _, ok := err.(libnetwork.ErrInvalidName); !ok { 251 t.Fatalf("Expected to fail with ErrInvalidName error. Got %v", err) 252 } 253 254 networkName := "testnetwork" 255 n, err := createTestNetwork(bridgeNetType, networkName, netOption, nil, nil) 256 if err != nil { 257 t.Fatal(err) 258 } 259 defer func() { 260 if err := n.Delete(); err != nil { 261 t.Fatal(err) 262 } 263 }() 264 265 if n.Name() != networkName { 266 t.Fatalf("Expected network name %s, got %s", networkName, n.Name()) 267 } 268 } 269 270 func TestNetworkType(t *testing.T) { 271 if !testutils.IsRunningInContainer() { 272 defer testutils.SetupTestOSContext(t)() 273 } 274 275 netOption := options.Generic{ 276 netlabel.GenericData: options.Generic{ 277 "BridgeName": "testnetwork", 278 }, 279 } 280 281 n, err := createTestNetwork(bridgeNetType, "testnetwork", netOption, nil, nil) 282 if err != nil { 283 t.Fatal(err) 284 } 285 defer func() { 286 if err := n.Delete(); err != nil { 287 t.Fatal(err) 288 } 289 }() 290 291 if n.Type() != bridgeNetType { 292 t.Fatalf("Expected network type %s, got %s", bridgeNetType, n.Type()) 293 } 294 } 295 296 func TestNetworkID(t *testing.T) { 297 if !testutils.IsRunningInContainer() { 298 defer testutils.SetupTestOSContext(t)() 299 } 300 301 netOption := options.Generic{ 302 netlabel.GenericData: options.Generic{ 303 "BridgeName": "testnetwork", 304 }, 305 } 306 307 n, err := createTestNetwork(bridgeNetType, "testnetwork", netOption, nil, nil) 308 if err != nil { 309 t.Fatal(err) 310 } 311 defer func() { 312 if err := n.Delete(); err != nil { 313 t.Fatal(err) 314 } 315 }() 316 317 if n.ID() == "" { 318 t.Fatal("Expected non-empty network id") 319 } 320 } 321 322 func TestDeleteNetworkWithActiveEndpoints(t *testing.T) { 323 if !testutils.IsRunningInContainer() { 324 defer testutils.SetupTestOSContext(t)() 325 } 326 327 netOption := options.Generic{ 328 "BridgeName": "testnetwork", 329 } 330 option := options.Generic{ 331 netlabel.GenericData: netOption, 332 } 333 334 network, err := createTestNetwork(bridgeNetType, "testnetwork", option, nil, nil) 335 if err != nil { 336 t.Fatal(err) 337 } 338 339 ep, err := network.CreateEndpoint("testep") 340 if err != nil { 341 t.Fatal(err) 342 } 343 344 err = network.Delete() 345 if err == nil { 346 t.Fatal("Expected to fail. But instead succeeded") 347 } 348 349 if _, ok := err.(*libnetwork.ActiveEndpointsError); !ok { 350 t.Fatalf("Did not fail with expected error. Actual error: %v", err) 351 } 352 353 // Done testing. Now cleanup. 354 if err := ep.Delete(false); err != nil { 355 t.Fatal(err) 356 } 357 358 if err := network.Delete(); err != nil { 359 t.Fatal(err) 360 } 361 } 362 363 func TestNetworkConfig(t *testing.T) { 364 if !testutils.IsRunningInContainer() { 365 defer testutils.SetupTestOSContext(t)() 366 } 367 368 // Verify config network cannot inherit another config network 369 configNetwork, err := controller.NewNetwork("bridge", "config_network0", "", 370 libnetwork.NetworkOptionConfigOnly(), 371 libnetwork.NetworkOptionConfigFrom("anotherConfigNw")) 372 373 if err == nil { 374 t.Fatal("Expected to fail. But instead succeeded") 375 } 376 if _, ok := err.(types.ForbiddenError); !ok { 377 t.Fatalf("Did not fail with expected error. Actual error: %v", err) 378 } 379 380 // Create supported config network 381 netOption := options.Generic{ 382 "EnableICC": false, 383 } 384 option := options.Generic{ 385 netlabel.GenericData: netOption, 386 } 387 ipamV4ConfList := []*libnetwork.IpamConf{{PreferredPool: "192.168.100.0/24", SubPool: "192.168.100.128/25", Gateway: "192.168.100.1"}} 388 ipamV6ConfList := []*libnetwork.IpamConf{{PreferredPool: "2001:db8:abcd::/64", SubPool: "2001:db8:abcd::ef99/80", Gateway: "2001:db8:abcd::22"}} 389 390 netOptions := []libnetwork.NetworkOption{ 391 libnetwork.NetworkOptionConfigOnly(), 392 libnetwork.NetworkOptionEnableIPv6(true), 393 libnetwork.NetworkOptionGeneric(option), 394 libnetwork.NetworkOptionIpam("default", "", ipamV4ConfList, ipamV6ConfList, nil), 395 } 396 397 configNetwork, err = controller.NewNetwork(bridgeNetType, "config_network0", "", netOptions...) 398 if err != nil { 399 t.Fatal(err) 400 } 401 402 // Verify a config-only network cannot be created with network operator configurations 403 for i, opt := range []libnetwork.NetworkOption{ 404 libnetwork.NetworkOptionInternalNetwork(), 405 libnetwork.NetworkOptionAttachable(true), 406 libnetwork.NetworkOptionIngress(true), 407 } { 408 _, err = controller.NewNetwork(bridgeNetType, "testBR", "", 409 libnetwork.NetworkOptionConfigOnly(), opt) 410 if err == nil { 411 t.Fatalf("Expected to fail. But instead succeeded for option: %d", i) 412 } 413 if _, ok := err.(types.ForbiddenError); !ok { 414 t.Fatalf("Did not fail with expected error. Actual error: %v", err) 415 } 416 } 417 418 // Verify a network cannot be created with both config-from and network specific configurations 419 for i, opt := range []libnetwork.NetworkOption{ 420 libnetwork.NetworkOptionEnableIPv6(true), 421 libnetwork.NetworkOptionIpam("my-ipam", "", nil, nil, nil), 422 libnetwork.NetworkOptionIpam("", "", ipamV4ConfList, nil, nil), 423 libnetwork.NetworkOptionIpam("", "", nil, ipamV6ConfList, nil), 424 libnetwork.NetworkOptionLabels(map[string]string{"number": "two"}), 425 libnetwork.NetworkOptionDriverOpts(map[string]string{"com.docker.network.driver.mtu": "1600"}), 426 } { 427 _, err = controller.NewNetwork(bridgeNetType, "testBR", "", 428 libnetwork.NetworkOptionConfigFrom("config_network0"), opt) 429 if err == nil { 430 t.Fatalf("Expected to fail. But instead succeeded for option: %d", i) 431 } 432 if _, ok := err.(types.ForbiddenError); !ok { 433 t.Fatalf("Did not fail with expected error. Actual error: %v", err) 434 } 435 } 436 437 // Create a valid network 438 network, err := controller.NewNetwork(bridgeNetType, "testBR", "", 439 libnetwork.NetworkOptionConfigFrom("config_network0")) 440 if err != nil { 441 t.Fatal(err) 442 } 443 444 // Verify the config network cannot be removed 445 err = configNetwork.Delete() 446 if err == nil { 447 t.Fatal("Expected to fail. But instead succeeded") 448 } 449 450 if _, ok := err.(types.ForbiddenError); !ok { 451 t.Fatalf("Did not fail with expected error. Actual error: %v", err) 452 } 453 454 // Delete network 455 if err := network.Delete(); err != nil { 456 t.Fatal(err) 457 } 458 459 // Verify the config network can now be removed 460 if err := configNetwork.Delete(); err != nil { 461 t.Fatal(err) 462 } 463 464 } 465 466 func TestUnknownNetwork(t *testing.T) { 467 if !testutils.IsRunningInContainer() { 468 defer testutils.SetupTestOSContext(t)() 469 } 470 471 netOption := options.Generic{ 472 "BridgeName": "testnetwork", 473 } 474 option := options.Generic{ 475 netlabel.GenericData: netOption, 476 } 477 478 network, err := createTestNetwork(bridgeNetType, "testnetwork", option, nil, nil) 479 if err != nil { 480 t.Fatal(err) 481 } 482 483 err = network.Delete() 484 if err != nil { 485 t.Fatal(err) 486 } 487 488 err = network.Delete() 489 if err == nil { 490 t.Fatal("Expected to fail. But instead succeeded") 491 } 492 493 if _, ok := err.(*libnetwork.UnknownNetworkError); !ok { 494 t.Fatalf("Did not fail with expected error. Actual error: %v", err) 495 } 496 } 497 498 func TestUnknownEndpoint(t *testing.T) { 499 if !testutils.IsRunningInContainer() { 500 defer testutils.SetupTestOSContext(t)() 501 } 502 503 netOption := options.Generic{ 504 "BridgeName": "testnetwork", 505 } 506 option := options.Generic{ 507 netlabel.GenericData: netOption, 508 } 509 ipamV4ConfList := []*libnetwork.IpamConf{{PreferredPool: "192.168.100.0/24"}} 510 511 network, err := createTestNetwork(bridgeNetType, "testnetwork", option, ipamV4ConfList, nil) 512 if err != nil { 513 t.Fatal(err) 514 } 515 516 _, err = network.CreateEndpoint("") 517 if err == nil { 518 t.Fatal("Expected to fail. But instead succeeded") 519 } 520 if _, ok := err.(libnetwork.ErrInvalidName); !ok { 521 t.Fatalf("Expected to fail with ErrInvalidName error. Actual error: %v", err) 522 } 523 524 ep, err := network.CreateEndpoint("testep") 525 if err != nil { 526 t.Fatal(err) 527 } 528 529 err = ep.Delete(false) 530 if err != nil { 531 t.Fatal(err) 532 } 533 534 // Done testing. Now cleanup 535 if err := network.Delete(); err != nil { 536 t.Fatal(err) 537 } 538 } 539 540 func TestNetworkEndpointsWalkers(t *testing.T) { 541 if !testutils.IsRunningInContainer() { 542 defer testutils.SetupTestOSContext(t)() 543 } 544 545 // Create network 1 and add 2 endpoint: ep11, ep12 546 netOption := options.Generic{ 547 netlabel.GenericData: options.Generic{ 548 "BridgeName": "network1", 549 }, 550 } 551 552 net1, err := createTestNetwork(bridgeNetType, "network1", netOption, nil, nil) 553 if err != nil { 554 t.Fatal(err) 555 } 556 defer func() { 557 if err := net1.Delete(); err != nil { 558 t.Fatal(err) 559 } 560 }() 561 562 ep11, err := net1.CreateEndpoint("ep11") 563 if err != nil { 564 t.Fatal(err) 565 } 566 defer func() { 567 if err := ep11.Delete(false); err != nil { 568 t.Fatal(err) 569 } 570 }() 571 572 ep12, err := net1.CreateEndpoint("ep12") 573 if err != nil { 574 t.Fatal(err) 575 } 576 defer func() { 577 if err := ep12.Delete(false); err != nil { 578 t.Fatal(err) 579 } 580 }() 581 582 // Test list methods on net1 583 epList1 := net1.Endpoints() 584 if len(epList1) != 2 { 585 t.Fatalf("Endpoints() returned wrong number of elements: %d instead of 2", len(epList1)) 586 } 587 // endpoint order is not guaranteed 588 for _, e := range epList1 { 589 if e != ep11 && e != ep12 { 590 t.Fatal("Endpoints() did not return all the expected elements") 591 } 592 } 593 594 // Test Endpoint Walk method 595 var epName string 596 var epWanted libnetwork.Endpoint 597 wlk := func(ep libnetwork.Endpoint) bool { 598 if ep.Name() == epName { 599 epWanted = ep 600 return true 601 } 602 return false 603 } 604 605 // Look for ep1 on network1 606 epName = "ep11" 607 net1.WalkEndpoints(wlk) 608 if epWanted == nil { 609 t.Fatal(err) 610 } 611 if ep11 != epWanted { 612 t.Fatal(err) 613 } 614 615 current := len(controller.Networks()) 616 617 // Create network 2 618 netOption = options.Generic{ 619 netlabel.GenericData: options.Generic{ 620 "BridgeName": "network2", 621 }, 622 } 623 624 net2, err := createTestNetwork(bridgeNetType, "network2", netOption, nil, nil) 625 if err != nil { 626 t.Fatal(err) 627 } 628 defer func() { 629 if err := net2.Delete(); err != nil { 630 t.Fatal(err) 631 } 632 }() 633 634 // Test Networks method 635 if len(controller.Networks()) != current+1 { 636 t.Fatalf("Did not find the expected number of networks") 637 } 638 639 // Test Network Walk method 640 var netName string 641 var netWanted libnetwork.Network 642 nwWlk := func(nw libnetwork.Network) bool { 643 if nw.Name() == netName { 644 netWanted = nw 645 return true 646 } 647 return false 648 } 649 650 // Look for network named "network1" and "network2" 651 netName = "network1" 652 controller.WalkNetworks(nwWlk) 653 if netWanted == nil { 654 t.Fatal(err) 655 } 656 if net1.ID() != netWanted.ID() { 657 t.Fatal(err) 658 } 659 660 netName = "network2" 661 controller.WalkNetworks(nwWlk) 662 if netWanted == nil { 663 t.Fatal(err) 664 } 665 if net2.ID() != netWanted.ID() { 666 t.Fatal(err) 667 } 668 } 669 670 func TestDuplicateEndpoint(t *testing.T) { 671 if !testutils.IsRunningInContainer() { 672 defer testutils.SetupTestOSContext(t)() 673 } 674 675 netOption := options.Generic{ 676 netlabel.GenericData: options.Generic{ 677 "BridgeName": "testnetwork", 678 }, 679 } 680 n, err := createTestNetwork(bridgeNetType, "testnetwork", netOption, nil, nil) 681 if err != nil { 682 t.Fatal(err) 683 } 684 defer func() { 685 if err := n.Delete(); err != nil { 686 t.Fatal(err) 687 } 688 }() 689 690 ep, err := n.CreateEndpoint("ep1") 691 if err != nil { 692 t.Fatal(err) 693 } 694 defer func() { 695 if err := ep.Delete(false); err != nil { 696 t.Fatal(err) 697 } 698 }() 699 700 ep2, err := n.CreateEndpoint("ep1") 701 defer func() { 702 // Cleanup ep2 as well, else network cleanup might fail for failure cases 703 if ep2 != nil { 704 if err := ep2.Delete(false); err != nil { 705 t.Fatal(err) 706 } 707 } 708 }() 709 710 if err == nil { 711 t.Fatal("Expected to fail. But instead succeeded") 712 } 713 714 if _, ok := err.(types.ForbiddenError); !ok { 715 t.Fatalf("Did not fail with expected error. Actual error: %v", err) 716 } 717 } 718 719 func TestControllerQuery(t *testing.T) { 720 if !testutils.IsRunningInContainer() { 721 defer testutils.SetupTestOSContext(t)() 722 } 723 724 // Create network 1 725 netOption := options.Generic{ 726 netlabel.GenericData: options.Generic{ 727 "BridgeName": "network1", 728 }, 729 } 730 net1, err := createTestNetwork(bridgeNetType, "network1", netOption, nil, nil) 731 if err != nil { 732 t.Fatal(err) 733 } 734 defer func() { 735 if err := net1.Delete(); err != nil { 736 t.Fatal(err) 737 } 738 }() 739 740 // Create network 2 741 netOption = options.Generic{ 742 netlabel.GenericData: options.Generic{ 743 "BridgeName": "network2", 744 }, 745 } 746 net2, err := createTestNetwork(bridgeNetType, "network2", netOption, nil, nil) 747 if err != nil { 748 t.Fatal(err) 749 } 750 defer func() { 751 if err := net2.Delete(); err != nil { 752 t.Fatal(err) 753 } 754 }() 755 756 _, err = controller.NetworkByName("") 757 if err == nil { 758 t.Fatalf("NetworkByName() succeeded with invalid target name") 759 } 760 if _, ok := err.(libnetwork.ErrInvalidName); !ok { 761 t.Fatalf("Expected NetworkByName() to fail with ErrInvalidName error. Got: %v", err) 762 } 763 764 _, err = controller.NetworkByID("") 765 if err == nil { 766 t.Fatalf("NetworkByID() succeeded with invalid target id") 767 } 768 if _, ok := err.(libnetwork.ErrInvalidID); !ok { 769 t.Fatalf("NetworkByID() failed with unexpected error: %v", err) 770 } 771 772 g, err := controller.NetworkByID("network1") 773 if err == nil { 774 t.Fatalf("Unexpected success for NetworkByID(): %v", g) 775 } 776 if _, ok := err.(libnetwork.ErrNoSuchNetwork); !ok { 777 t.Fatalf("NetworkByID() failed with unexpected error: %v", err) 778 } 779 780 g, err = controller.NetworkByName("network1") 781 if err != nil { 782 t.Fatalf("Unexpected failure for NetworkByName(): %v", err) 783 } 784 if g == nil { 785 t.Fatalf("NetworkByName() did not find the network") 786 } 787 788 if g != net1 { 789 t.Fatalf("NetworkByName() returned the wrong network") 790 } 791 792 g, err = controller.NetworkByID(net1.ID()) 793 if err != nil { 794 t.Fatalf("Unexpected failure for NetworkByID(): %v", err) 795 } 796 if net1.ID() != g.ID() { 797 t.Fatalf("NetworkByID() returned unexpected element: %v", g) 798 } 799 800 g, err = controller.NetworkByName("network2") 801 if err != nil { 802 t.Fatalf("Unexpected failure for NetworkByName(): %v", err) 803 } 804 if g == nil { 805 t.Fatalf("NetworkByName() did not find the network") 806 } 807 808 if g != net2 { 809 t.Fatalf("NetworkByName() returned the wrong network") 810 } 811 812 g, err = controller.NetworkByID(net2.ID()) 813 if err != nil { 814 t.Fatalf("Unexpected failure for NetworkByID(): %v", err) 815 } 816 if net2.ID() != g.ID() { 817 t.Fatalf("NetworkByID() returned unexpected element: %v", g) 818 } 819 } 820 821 func TestNetworkQuery(t *testing.T) { 822 if !testutils.IsRunningInContainer() { 823 defer testutils.SetupTestOSContext(t)() 824 } 825 826 // Create network 1 and add 2 endpoint: ep11, ep12 827 netOption := options.Generic{ 828 netlabel.GenericData: options.Generic{ 829 "BridgeName": "network1", 830 }, 831 } 832 net1, err := createTestNetwork(bridgeNetType, "network1", netOption, nil, nil) 833 if err != nil { 834 t.Fatal(err) 835 } 836 defer func() { 837 if err := net1.Delete(); err != nil { 838 t.Fatal(err) 839 } 840 }() 841 842 ep11, err := net1.CreateEndpoint("ep11") 843 if err != nil { 844 t.Fatal(err) 845 } 846 defer func() { 847 if err := ep11.Delete(false); err != nil { 848 t.Fatal(err) 849 } 850 }() 851 852 ep12, err := net1.CreateEndpoint("ep12") 853 if err != nil { 854 t.Fatal(err) 855 } 856 defer func() { 857 if err := ep12.Delete(false); err != nil { 858 t.Fatal(err) 859 } 860 }() 861 862 e, err := net1.EndpointByName("ep11") 863 if err != nil { 864 t.Fatal(err) 865 } 866 if ep11 != e { 867 t.Fatalf("EndpointByName() returned %v instead of %v", e, ep11) 868 } 869 870 e, err = net1.EndpointByName("") 871 if err == nil { 872 t.Fatalf("EndpointByName() succeeded with invalid target name") 873 } 874 if _, ok := err.(libnetwork.ErrInvalidName); !ok { 875 t.Fatalf("Expected EndpointByName() to fail with ErrInvalidName error. Got: %v", err) 876 } 877 878 e, err = net1.EndpointByName("IamNotAnEndpoint") 879 if err == nil { 880 t.Fatalf("EndpointByName() succeeded with unknown target name") 881 } 882 if _, ok := err.(libnetwork.ErrNoSuchEndpoint); !ok { 883 t.Fatal(err) 884 } 885 if e != nil { 886 t.Fatalf("EndpointByName(): expected nil, got %v", e) 887 } 888 889 e, err = net1.EndpointByID(ep12.ID()) 890 if err != nil { 891 t.Fatal(err) 892 } 893 if ep12.ID() != e.ID() { 894 t.Fatalf("EndpointByID() returned %v instead of %v", e, ep12) 895 } 896 897 e, err = net1.EndpointByID("") 898 if err == nil { 899 t.Fatalf("EndpointByID() succeeded with invalid target id") 900 } 901 if _, ok := err.(libnetwork.ErrInvalidID); !ok { 902 t.Fatalf("EndpointByID() failed with unexpected error: %v", err) 903 } 904 } 905 906 const containerID = "valid_c" 907 908 type fakeSandbox struct{} 909 910 func (f *fakeSandbox) ID() string { 911 return "fake sandbox" 912 } 913 914 func (f *fakeSandbox) ContainerID() string { 915 return "" 916 } 917 918 func (f *fakeSandbox) Key() string { 919 return "fake key" 920 } 921 922 func (f *fakeSandbox) Labels() map[string]interface{} { 923 return nil 924 } 925 926 func (f *fakeSandbox) Statistics() (map[string]*types.InterfaceStatistics, error) { 927 return nil, nil 928 } 929 930 func (f *fakeSandbox) Refresh(opts ...libnetwork.SandboxOption) error { 931 return nil 932 } 933 934 func (f *fakeSandbox) Delete() error { 935 return nil 936 } 937 938 func (f *fakeSandbox) Rename(name string) error { 939 return nil 940 } 941 942 func (f *fakeSandbox) SetKey(key string) error { 943 return nil 944 } 945 946 func (f *fakeSandbox) ResolveName(name string, ipType int) ([]net.IP, bool) { 947 return nil, false 948 } 949 950 func (f *fakeSandbox) ResolveIP(ip string) string { 951 return "" 952 } 953 954 func (f *fakeSandbox) ResolveService(name string) ([]*net.SRV, []net.IP) { 955 return nil, nil 956 } 957 958 func (f *fakeSandbox) Endpoints() []libnetwork.Endpoint { 959 return nil 960 } 961 962 func (f *fakeSandbox) EnableService() error { 963 return nil 964 } 965 966 func (f *fakeSandbox) DisableService() error { 967 return nil 968 } 969 970 func TestEndpointDeleteWithActiveContainer(t *testing.T) { 971 if !testutils.IsRunningInContainer() { 972 defer testutils.SetupTestOSContext(t)() 973 } 974 975 n, err := createTestNetwork(bridgeNetType, "testnetwork", options.Generic{ 976 netlabel.GenericData: options.Generic{ 977 "BridgeName": "testnetwork", 978 }, 979 }, nil, nil) 980 if err != nil { 981 t.Fatal(err) 982 } 983 defer func() { 984 if err := n.Delete(); err != nil { 985 t.Fatal(err) 986 } 987 }() 988 989 n2, err := createTestNetwork(bridgeNetType, "testnetwork2", options.Generic{ 990 netlabel.GenericData: options.Generic{ 991 "BridgeName": "testnetwork2", 992 }, 993 }, nil, nil) 994 if err != nil { 995 t.Fatal(err) 996 } 997 defer func() { 998 if err := n2.Delete(); err != nil { 999 t.Fatal(err) 1000 } 1001 }() 1002 1003 ep, err := n.CreateEndpoint("ep1") 1004 if err != nil { 1005 t.Fatal(err) 1006 } 1007 defer func() { 1008 err = ep.Delete(false) 1009 if err != nil { 1010 t.Fatal(err) 1011 } 1012 }() 1013 1014 cnt, err := controller.NewSandbox(containerID, 1015 libnetwork.OptionHostname("test"), 1016 libnetwork.OptionDomainname("docker.io"), 1017 libnetwork.OptionExtraHost("web", "192.168.0.1")) 1018 defer func() { 1019 if err := cnt.Delete(); err != nil { 1020 t.Fatal(err) 1021 } 1022 }() 1023 1024 err = ep.Join(cnt) 1025 if err != nil { 1026 t.Fatal(err) 1027 } 1028 defer func() { 1029 err = ep.Leave(cnt) 1030 if err != nil { 1031 t.Fatal(err) 1032 } 1033 }() 1034 1035 err = ep.Delete(false) 1036 if err == nil { 1037 t.Fatal("Expected to fail. But instead succeeded") 1038 } 1039 1040 if _, ok := err.(*libnetwork.ActiveContainerError); !ok { 1041 t.Fatalf("Did not fail with expected error. Actual error: %v", err) 1042 } 1043 } 1044 1045 func TestEndpointMultipleJoins(t *testing.T) { 1046 if !testutils.IsRunningInContainer() { 1047 defer testutils.SetupTestOSContext(t)() 1048 } 1049 1050 n, err := createTestNetwork(bridgeNetType, "testmultiple", options.Generic{ 1051 netlabel.GenericData: options.Generic{ 1052 "BridgeName": "testmultiple", 1053 }, 1054 }, nil, nil) 1055 if err != nil { 1056 t.Fatal(err) 1057 } 1058 defer func() { 1059 if err := n.Delete(); err != nil { 1060 t.Fatal(err) 1061 } 1062 }() 1063 1064 ep, err := n.CreateEndpoint("ep1") 1065 if err != nil { 1066 t.Fatal(err) 1067 } 1068 defer func() { 1069 if err := ep.Delete(false); err != nil { 1070 t.Fatal(err) 1071 } 1072 }() 1073 1074 sbx1, err := controller.NewSandbox(containerID, 1075 libnetwork.OptionHostname("test"), 1076 libnetwork.OptionDomainname("docker.io"), 1077 libnetwork.OptionExtraHost("web", "192.168.0.1")) 1078 defer func() { 1079 if err := sbx1.Delete(); err != nil { 1080 t.Fatal(err) 1081 } 1082 }() 1083 1084 sbx2, err := controller.NewSandbox("c2") 1085 defer func() { 1086 if err := sbx2.Delete(); err != nil { 1087 t.Fatal(err) 1088 } 1089 }() 1090 1091 err = ep.Join(sbx1) 1092 if err != nil { 1093 t.Fatal(err) 1094 } 1095 defer func() { 1096 err = ep.Leave(sbx1) 1097 if err != nil { 1098 t.Fatal(err) 1099 } 1100 }() 1101 1102 err = ep.Join(sbx2) 1103 if err == nil { 1104 t.Fatal("Expected to fail multiple joins for the same endpoint") 1105 } 1106 1107 if _, ok := err.(types.ForbiddenError); !ok { 1108 t.Fatalf("Failed with unexpected error type: %T. Desc: %s", err, err.Error()) 1109 } 1110 1111 } 1112 1113 func TestLeaveAll(t *testing.T) { 1114 if !testutils.IsRunningInContainer() { 1115 defer testutils.SetupTestOSContext(t)() 1116 } 1117 1118 n, err := createTestNetwork(bridgeNetType, "testnetwork", options.Generic{ 1119 netlabel.GenericData: options.Generic{ 1120 "BridgeName": "testnetwork", 1121 }, 1122 }, nil, nil) 1123 if err != nil { 1124 t.Fatal(err) 1125 } 1126 defer func() { 1127 // If this goes through, it means cnt.Delete() effectively detached from all the endpoints 1128 if err := n.Delete(); err != nil { 1129 t.Fatal(err) 1130 } 1131 }() 1132 1133 n2, err := createTestNetwork(bridgeNetType, "testnetwork2", options.Generic{ 1134 netlabel.GenericData: options.Generic{ 1135 "BridgeName": "testnetwork2", 1136 }, 1137 }, nil, nil) 1138 if err != nil { 1139 t.Fatal(err) 1140 } 1141 defer func() { 1142 if err := n2.Delete(); err != nil { 1143 t.Fatal(err) 1144 } 1145 }() 1146 1147 ep1, err := n.CreateEndpoint("ep1") 1148 if err != nil { 1149 t.Fatal(err) 1150 } 1151 1152 ep2, err := n2.CreateEndpoint("ep2") 1153 if err != nil { 1154 t.Fatal(err) 1155 } 1156 1157 cnt, err := controller.NewSandbox("leaveall") 1158 if err != nil { 1159 t.Fatal(err) 1160 } 1161 1162 err = ep1.Join(cnt) 1163 if err != nil { 1164 t.Fatalf("Failed to join ep1: %v", err) 1165 } 1166 1167 err = ep2.Join(cnt) 1168 if err != nil { 1169 t.Fatalf("Failed to join ep2: %v", err) 1170 } 1171 1172 err = cnt.Delete() 1173 if err != nil { 1174 t.Fatal(err) 1175 } 1176 } 1177 1178 func TestContainerInvalidLeave(t *testing.T) { 1179 if !testutils.IsRunningInContainer() { 1180 defer testutils.SetupTestOSContext(t)() 1181 } 1182 1183 n, err := createTestNetwork(bridgeNetType, "testnetwork", options.Generic{ 1184 netlabel.GenericData: options.Generic{ 1185 "BridgeName": "testnetwork", 1186 }, 1187 }, nil, nil) 1188 if err != nil { 1189 t.Fatal(err) 1190 } 1191 defer func() { 1192 if err := n.Delete(); err != nil { 1193 t.Fatal(err) 1194 } 1195 }() 1196 1197 ep, err := n.CreateEndpoint("ep1") 1198 if err != nil { 1199 t.Fatal(err) 1200 } 1201 defer func() { 1202 if err := ep.Delete(false); err != nil { 1203 t.Fatal(err) 1204 } 1205 }() 1206 1207 cnt, err := controller.NewSandbox(containerID, 1208 libnetwork.OptionHostname("test"), 1209 libnetwork.OptionDomainname("docker.io"), 1210 libnetwork.OptionExtraHost("web", "192.168.0.1")) 1211 if err != nil { 1212 t.Fatal(err) 1213 } 1214 defer func() { 1215 if err := cnt.Delete(); err != nil { 1216 t.Fatal(err) 1217 } 1218 }() 1219 1220 err = ep.Leave(cnt) 1221 if err == nil { 1222 t.Fatal("Expected to fail leave from an endpoint which has no active join") 1223 } 1224 if _, ok := err.(types.ForbiddenError); !ok { 1225 t.Fatalf("Failed with unexpected error type: %T. Desc: %s", err, err.Error()) 1226 } 1227 1228 if err = ep.Leave(nil); err == nil { 1229 t.Fatalf("Expected to fail leave nil Sandbox") 1230 } 1231 if _, ok := err.(types.BadRequestError); !ok { 1232 t.Fatalf("Unexpected error type returned: %T. Desc: %s", err, err.Error()) 1233 } 1234 1235 fsbx := &fakeSandbox{} 1236 if err = ep.Leave(fsbx); err == nil { 1237 t.Fatalf("Expected to fail leave with invalid Sandbox") 1238 } 1239 if _, ok := err.(types.BadRequestError); !ok { 1240 t.Fatalf("Unexpected error type returned: %T. Desc: %s", err, err.Error()) 1241 } 1242 } 1243 1244 func TestEndpointUpdateParent(t *testing.T) { 1245 if !testutils.IsRunningInContainer() { 1246 defer testutils.SetupTestOSContext(t)() 1247 } 1248 1249 n, err := createTestNetwork("bridge", "testnetwork", options.Generic{ 1250 netlabel.GenericData: options.Generic{ 1251 "BridgeName": "testnetwork", 1252 }, 1253 }, nil, nil) 1254 if err != nil { 1255 t.Fatal(err) 1256 } 1257 defer func() { 1258 if err := n.Delete(); err != nil { 1259 t.Fatal(err) 1260 } 1261 }() 1262 1263 ep1, err := n.CreateEndpoint("ep1") 1264 if err != nil { 1265 t.Fatal(err) 1266 } 1267 1268 ep2, err := n.CreateEndpoint("ep2") 1269 if err != nil { 1270 t.Fatal(err) 1271 } 1272 1273 sbx1, err := controller.NewSandbox(containerID, 1274 libnetwork.OptionHostname("test"), 1275 libnetwork.OptionDomainname("docker.io"), 1276 libnetwork.OptionExtraHost("web", "192.168.0.1")) 1277 if err != nil { 1278 t.Fatal(err) 1279 } 1280 defer func() { 1281 if err := sbx1.Delete(); err != nil { 1282 t.Fatal(err) 1283 } 1284 }() 1285 1286 sbx2, err := controller.NewSandbox("c2", 1287 libnetwork.OptionHostname("test2"), 1288 libnetwork.OptionDomainname("docker.io"), 1289 libnetwork.OptionHostsPath("/var/lib/docker/test_network/container2/hosts"), 1290 libnetwork.OptionExtraHost("web", "192.168.0.2")) 1291 if err != nil { 1292 t.Fatal(err) 1293 } 1294 defer func() { 1295 if err := sbx2.Delete(); err != nil { 1296 t.Fatal(err) 1297 } 1298 }() 1299 1300 err = ep1.Join(sbx1) 1301 if err != nil { 1302 t.Fatal(err) 1303 } 1304 1305 err = ep2.Join(sbx2) 1306 if err != nil { 1307 t.Fatal(err) 1308 } 1309 } 1310 1311 func TestInvalidRemoteDriver(t *testing.T) { 1312 if !testutils.IsRunningInContainer() { 1313 t.Skip("Skipping test when not running inside a Container") 1314 } 1315 1316 mux := http.NewServeMux() 1317 server := httptest.NewServer(mux) 1318 if server == nil { 1319 t.Fatal("Failed to start an HTTP Server") 1320 } 1321 defer server.Close() 1322 1323 type pluginRequest struct { 1324 name string 1325 } 1326 1327 mux.HandleFunc("/Plugin.Activate", func(w http.ResponseWriter, r *http.Request) { 1328 w.Header().Set("Content-Type", "application/vnd.docker.plugins.v1+json") 1329 fmt.Fprintln(w, `{"Implements": ["InvalidDriver"]}`) 1330 }) 1331 1332 if err := os.MkdirAll("/etc/docker/plugins", 0755); err != nil { 1333 t.Fatal(err) 1334 } 1335 defer func() { 1336 if err := os.RemoveAll("/etc/docker/plugins"); err != nil { 1337 t.Fatal(err) 1338 } 1339 }() 1340 1341 if err := ioutil.WriteFile("/etc/docker/plugins/invalid-network-driver.spec", []byte(server.URL), 0644); err != nil { 1342 t.Fatal(err) 1343 } 1344 1345 ctrlr, err := libnetwork.New() 1346 if err != nil { 1347 t.Fatal(err) 1348 } 1349 defer ctrlr.Stop() 1350 1351 _, err = ctrlr.NewNetwork("invalid-network-driver", "dummy", "", 1352 libnetwork.NetworkOptionGeneric(getEmptyGenericOption())) 1353 if err == nil { 1354 t.Fatal("Expected to fail. But instead succeeded") 1355 } 1356 1357 if err != plugins.ErrNotImplements { 1358 t.Fatalf("Did not fail with expected error. Actual error: %v", err) 1359 } 1360 } 1361 1362 func TestValidRemoteDriver(t *testing.T) { 1363 if !testutils.IsRunningInContainer() { 1364 t.Skip("Skipping test when not running inside a Container") 1365 } 1366 1367 mux := http.NewServeMux() 1368 server := httptest.NewServer(mux) 1369 if server == nil { 1370 t.Fatal("Failed to start an HTTP Server") 1371 } 1372 defer server.Close() 1373 1374 type pluginRequest struct { 1375 name string 1376 } 1377 1378 mux.HandleFunc("/Plugin.Activate", func(w http.ResponseWriter, r *http.Request) { 1379 w.Header().Set("Content-Type", "application/vnd.docker.plugins.v1+json") 1380 fmt.Fprintf(w, `{"Implements": ["%s"]}`, driverapi.NetworkPluginEndpointType) 1381 }) 1382 mux.HandleFunc(fmt.Sprintf("/%s.GetCapabilities", driverapi.NetworkPluginEndpointType), func(w http.ResponseWriter, r *http.Request) { 1383 w.Header().Set("Content-Type", "application/vnd.docker.plugins.v1+json") 1384 fmt.Fprintf(w, `{"Scope":"local"}`) 1385 }) 1386 mux.HandleFunc(fmt.Sprintf("/%s.CreateNetwork", driverapi.NetworkPluginEndpointType), func(w http.ResponseWriter, r *http.Request) { 1387 w.Header().Set("Content-Type", "application/vnd.docker.plugins.v1+json") 1388 fmt.Fprintf(w, "null") 1389 }) 1390 mux.HandleFunc(fmt.Sprintf("/%s.DeleteNetwork", driverapi.NetworkPluginEndpointType), func(w http.ResponseWriter, r *http.Request) { 1391 w.Header().Set("Content-Type", "application/vnd.docker.plugins.v1+json") 1392 fmt.Fprintf(w, "null") 1393 }) 1394 1395 if err := os.MkdirAll("/etc/docker/plugins", 0755); err != nil { 1396 t.Fatal(err) 1397 } 1398 defer func() { 1399 if err := os.RemoveAll("/etc/docker/plugins"); err != nil { 1400 t.Fatal(err) 1401 } 1402 }() 1403 1404 if err := ioutil.WriteFile("/etc/docker/plugins/valid-network-driver.spec", []byte(server.URL), 0644); err != nil { 1405 t.Fatal(err) 1406 } 1407 1408 n, err := controller.NewNetwork("valid-network-driver", "dummy", "", 1409 libnetwork.NetworkOptionGeneric(getEmptyGenericOption())) 1410 if err != nil { 1411 // Only fail if we could not find the plugin driver 1412 if isNotFound(err) { 1413 t.Fatal(err) 1414 } 1415 return 1416 } 1417 defer func() { 1418 if err := n.Delete(); err != nil { 1419 t.Fatal(err) 1420 } 1421 }() 1422 } 1423 1424 var ( 1425 once sync.Once 1426 start = make(chan struct{}) 1427 done = make(chan chan struct{}, numThreads-1) 1428 origins = netns.None() 1429 testns = netns.None() 1430 sboxes = make([]libnetwork.Sandbox, numThreads) 1431 ) 1432 1433 const ( 1434 iterCnt = 25 1435 numThreads = 3 1436 first = 1 1437 last = numThreads 1438 debug = false 1439 ) 1440 1441 func createGlobalInstance(t *testing.T) { 1442 var err error 1443 defer close(start) 1444 1445 origins, err = netns.Get() 1446 if err != nil { 1447 t.Fatal(err) 1448 } 1449 1450 if testutils.IsRunningInContainer() { 1451 testns = origins 1452 } else { 1453 testns, err = netns.New() 1454 if err != nil { 1455 t.Fatal(err) 1456 } 1457 } 1458 1459 netOption := options.Generic{ 1460 netlabel.GenericData: options.Generic{ 1461 "BridgeName": "network", 1462 }, 1463 } 1464 1465 net1, err := controller.NetworkByName("testhost") 1466 if err != nil { 1467 t.Fatal(err) 1468 } 1469 1470 net2, err := createTestNetwork("bridge", "network2", netOption, nil, nil) 1471 if err != nil { 1472 t.Fatal(err) 1473 } 1474 1475 _, err = net1.CreateEndpoint("pep1") 1476 if err != nil { 1477 t.Fatal(err) 1478 } 1479 1480 _, err = net2.CreateEndpoint("pep2") 1481 if err != nil { 1482 t.Fatal(err) 1483 } 1484 1485 _, err = net2.CreateEndpoint("pep3") 1486 if err != nil { 1487 t.Fatal(err) 1488 } 1489 1490 if sboxes[first-1], err = controller.NewSandbox(fmt.Sprintf("%drace", first), libnetwork.OptionUseDefaultSandbox()); err != nil { 1491 t.Fatal(err) 1492 } 1493 for thd := first + 1; thd <= last; thd++ { 1494 if sboxes[thd-1], err = controller.NewSandbox(fmt.Sprintf("%drace", thd)); err != nil { 1495 t.Fatal(err) 1496 } 1497 } 1498 } 1499 1500 func debugf(format string, a ...interface{}) (int, error) { 1501 if debug { 1502 return fmt.Printf(format, a...) 1503 } 1504 1505 return 0, nil 1506 }