github.com/jfrazelle/docker@v1.1.2-0.20210712172922-bf78e25fe508/libnetwork/drvregistry/drvregistry_test.go (about)

     1  package drvregistry
     2  
     3  import (
     4  	"runtime"
     5  	"sort"
     6  	"testing"
     7  
     8  	"github.com/docker/docker/libnetwork/datastore"
     9  	"github.com/docker/docker/libnetwork/discoverapi"
    10  	"github.com/docker/docker/libnetwork/driverapi"
    11  	"github.com/docker/docker/libnetwork/ipamapi"
    12  	builtinIpam "github.com/docker/docker/libnetwork/ipams/builtin"
    13  	nullIpam "github.com/docker/docker/libnetwork/ipams/null"
    14  	remoteIpam "github.com/docker/docker/libnetwork/ipams/remote"
    15  	"gotest.tools/v3/assert"
    16  	is "gotest.tools/v3/assert/cmp"
    17  
    18  	// this takes care of the incontainer flag
    19  	_ "github.com/docker/docker/libnetwork/testutils"
    20  )
    21  
    22  const mockDriverName = "mock-driver"
    23  
    24  type mockDriver struct{}
    25  
    26  var md = mockDriver{}
    27  
    28  func mockDriverInit(reg driverapi.DriverCallback, opt map[string]interface{}) error {
    29  	return reg.RegisterDriver(mockDriverName, &md, driverapi.Capability{DataScope: datastore.LocalScope})
    30  }
    31  
    32  func (m *mockDriver) CreateNetwork(nid string, options map[string]interface{}, nInfo driverapi.NetworkInfo, ipV4Data, ipV6Data []driverapi.IPAMData) error {
    33  	return nil
    34  }
    35  
    36  func (m *mockDriver) DeleteNetwork(nid string) error {
    37  	return nil
    38  }
    39  
    40  func (m *mockDriver) CreateEndpoint(nid, eid string, ifInfo driverapi.InterfaceInfo, options map[string]interface{}) error {
    41  	return nil
    42  }
    43  
    44  func (m *mockDriver) DeleteEndpoint(nid, eid string) error {
    45  	return nil
    46  }
    47  
    48  func (m *mockDriver) EndpointOperInfo(nid, eid string) (map[string]interface{}, error) {
    49  	return nil, nil
    50  }
    51  
    52  func (m *mockDriver) Join(nid, eid string, sboxKey string, jinfo driverapi.JoinInfo, options map[string]interface{}) error {
    53  	return nil
    54  }
    55  
    56  func (m *mockDriver) Leave(nid, eid string) error {
    57  	return nil
    58  }
    59  
    60  func (m *mockDriver) DiscoverNew(dType discoverapi.DiscoveryType, data interface{}) error {
    61  	return nil
    62  }
    63  
    64  func (m *mockDriver) DiscoverDelete(dType discoverapi.DiscoveryType, data interface{}) error {
    65  	return nil
    66  }
    67  
    68  func (m *mockDriver) Type() string {
    69  	return mockDriverName
    70  }
    71  
    72  func (m *mockDriver) IsBuiltIn() bool {
    73  	return true
    74  }
    75  
    76  func (m *mockDriver) ProgramExternalConnectivity(nid, eid string, options map[string]interface{}) error {
    77  	return nil
    78  }
    79  
    80  func (m *mockDriver) RevokeExternalConnectivity(nid, eid string) error {
    81  	return nil
    82  }
    83  
    84  func (m *mockDriver) NetworkAllocate(id string, option map[string]string, ipV4Data, ipV6Data []driverapi.IPAMData) (map[string]string, error) {
    85  	return nil, nil
    86  }
    87  
    88  func (m *mockDriver) NetworkFree(id string) error {
    89  	return nil
    90  }
    91  
    92  func (m *mockDriver) EventNotify(etype driverapi.EventType, nid, tableName, key string, value []byte) {
    93  }
    94  
    95  func (m *mockDriver) DecodeTableEntry(tablename string, key string, value []byte) (string, map[string]string) {
    96  	return "", nil
    97  }
    98  
    99  func getNew(t *testing.T) *DrvRegistry {
   100  	reg, err := New(nil, nil, nil, nil, nil)
   101  	if err != nil {
   102  		t.Fatal(err)
   103  	}
   104  
   105  	err = initIPAMDrivers(reg, nil, nil)
   106  	if err != nil {
   107  		t.Fatal(err)
   108  	}
   109  	return reg
   110  }
   111  
   112  func initIPAMDrivers(r *DrvRegistry, lDs, gDs interface{}) error {
   113  	for _, fn := range [](func(ipamapi.Callback, interface{}, interface{}) error){
   114  		builtinIpam.Init,
   115  		remoteIpam.Init,
   116  		nullIpam.Init,
   117  	} {
   118  		if err := fn(r, lDs, gDs); err != nil {
   119  			return err
   120  		}
   121  	}
   122  
   123  	return nil
   124  }
   125  func TestNew(t *testing.T) {
   126  	getNew(t)
   127  }
   128  
   129  func TestAddDriver(t *testing.T) {
   130  	reg := getNew(t)
   131  
   132  	err := reg.AddDriver(mockDriverName, mockDriverInit, nil)
   133  	assert.NilError(t, err)
   134  }
   135  
   136  func TestAddDuplicateDriver(t *testing.T) {
   137  	reg := getNew(t)
   138  
   139  	err := reg.AddDriver(mockDriverName, mockDriverInit, nil)
   140  	assert.NilError(t, err)
   141  
   142  	// Try adding the same driver
   143  	err = reg.AddDriver(mockDriverName, mockDriverInit, nil)
   144  	assert.Check(t, is.ErrorContains(err, ""))
   145  }
   146  
   147  func TestIPAMDefaultAddressSpaces(t *testing.T) {
   148  	reg := getNew(t)
   149  
   150  	as1, as2, err := reg.IPAMDefaultAddressSpaces("default")
   151  	assert.NilError(t, err)
   152  	assert.Check(t, as1 != "")
   153  	assert.Check(t, as2 != "")
   154  }
   155  
   156  func TestDriver(t *testing.T) {
   157  	reg := getNew(t)
   158  
   159  	err := reg.AddDriver(mockDriverName, mockDriverInit, nil)
   160  	assert.NilError(t, err)
   161  
   162  	d, cap := reg.Driver(mockDriverName)
   163  	assert.Check(t, d != nil)
   164  	assert.Check(t, cap != nil)
   165  }
   166  
   167  func TestIPAM(t *testing.T) {
   168  	reg := getNew(t)
   169  
   170  	i, cap := reg.IPAM("default")
   171  	assert.Check(t, i != nil)
   172  	assert.Check(t, cap != nil)
   173  }
   174  
   175  func TestWalkIPAMs(t *testing.T) {
   176  	reg := getNew(t)
   177  
   178  	ipams := make([]string, 0, 2)
   179  	reg.WalkIPAMs(func(name string, driver ipamapi.Ipam, cap *ipamapi.Capability) bool {
   180  		ipams = append(ipams, name)
   181  		return false
   182  	})
   183  
   184  	sort.Strings(ipams)
   185  	expected := []string{"default", "null"}
   186  	if runtime.GOOS == "windows" {
   187  		expected = append(expected, "windows")
   188  	}
   189  	assert.Check(t, is.DeepEqual(ipams, expected))
   190  }
   191  
   192  func TestWalkDrivers(t *testing.T) {
   193  	reg := getNew(t)
   194  
   195  	err := reg.AddDriver(mockDriverName, mockDriverInit, nil)
   196  	assert.NilError(t, err)
   197  
   198  	var driverName string
   199  	reg.WalkDrivers(func(name string, driver driverapi.Driver, capability driverapi.Capability) bool {
   200  		driverName = name
   201  		return false
   202  	})
   203  
   204  	assert.Check(t, is.Equal(driverName, mockDriverName))
   205  }