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  }