drvregistry_test.go 4.7 KB

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