Skip to content

Commit dbb0722

Browse files
committed
Merge pull request #1126 from mrjana/networkdb
Add driver api enhancements for gossip
2 parents 6f51f5b + ed939ef commit dbb0722

23 files changed

Lines changed: 124 additions & 40 deletions

cmd/ovrouter/ovrouter.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,10 @@ func (ep *endpoint) AddStaticRoute(destination *net.IPNet, routeType int,
9292
return nil
9393
}
9494

95+
func (ep *endpoint) AddTableEntry(tableName string, key string, value []byte) error {
96+
return nil
97+
}
98+
9599
func (ep *endpoint) DisableGatewayService() {}
96100

97101
func main() {
@@ -120,7 +124,7 @@ func main() {
120124
}
121125

122126
if err := r.d.CreateNetwork("testnetwork",
123-
map[string]interface{}{}, nil, nil); err != nil {
127+
map[string]interface{}{}, nil, nil, nil); err != nil {
124128
fmt.Printf("Failed to create network in the driver: %v\n", err)
125129
os.Exit(1)
126130
}

controller.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -506,7 +506,7 @@ func (c *controller) addNetwork(n *network) error {
506506
}
507507

508508
// Create the network
509-
if err := d.CreateNetwork(n.id, n.generic, n.getIPData(4), n.getIPData(6)); err != nil {
509+
if err := d.CreateNetwork(n.id, n.generic, nil, n.getIPData(4), n.getIPData(6)); err != nil {
510510
return err
511511
}
512512

driverapi/driverapi.go

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,15 @@ type Driver interface {
2323
// associated with a given network id.
2424
NetworkFree(nid string) error
2525

26-
// CreateNetwork invokes the driver method to create a network passing
27-
// the network id and network specific config. The config mechanism will
28-
// eventually be replaced with labels which are yet to be introduced.
29-
CreateNetwork(nid string, options map[string]interface{}, ipV4Data, ipV6Data []IPAMData) error
26+
// CreateNetwork invokes the driver method to create a network
27+
// passing the network id and network specific config. The
28+
// config mechanism will eventually be replaced with labels
29+
// which are yet to be introduced. The driver can return a
30+
// list of table names for which it is interested in receiving
31+
// notification when a CRUD operation is performed on any
32+
// entry in that table. This will be ignored for local scope
33+
// drivers.
34+
CreateNetwork(nid string, options map[string]interface{}, nInfo NetworkInfo, ipV4Data, ipV6Data []IPAMData) error
3035

3136
// DeleteNetwork invokes the driver method to delete network passing
3237
// the network id.
@@ -60,10 +65,24 @@ type Driver interface {
6065
// programming that was done so far
6166
RevokeExternalConnectivity(nid, eid string) error
6267

68+
// EventNotify notifies the driver when a CRUD operation has
69+
// happened on a table of its interest as soon as this node
70+
// receives such an event in the gossip layer. This method is
71+
// only invoked for the global scope driver.
72+
EventNotify(event EventType, nid string, tableName string, key string, value []byte)
73+
6374
// Type returns the the type of this driver, the network type this driver manages
6475
Type() string
6576
}
6677

78+
// NetworkInfo provides a go interface for drivers to provide network
79+
// specific information to libnetwork.
80+
type NetworkInfo interface {
81+
// TableEventRegister registers driver interest in a given
82+
// table name.
83+
TableEventRegister(tableName string) error
84+
}
85+
6786
// InterfaceInfo provides a go interface for drivers to retrive
6887
// network information to interface resources.
6988
type InterfaceInfo interface {
@@ -112,6 +131,10 @@ type JoinInfo interface {
112131

113132
// DisableGatewayService tells libnetwork not to provide Default GW for the container
114133
DisableGatewayService()
134+
135+
// AddTableEntry adds a table entry to the gossip layer
136+
// passing the table name, key and an opaque value.
137+
AddTableEntry(tableName string, key string, value []byte) error
115138
}
116139

117140
// DriverCallback provides a Callback interface for Drivers into LibNetwork
@@ -134,3 +157,15 @@ type IPAMData struct {
134157
Gateway *net.IPNet
135158
AuxAddresses map[string]*net.IPNet
136159
}
160+
161+
// EventType defines a type for the CRUD event
162+
type EventType uint8
163+
164+
const (
165+
// Create event is generated when a table entry is created,
166+
Create EventType = 1 + iota
167+
// Update event is generated when a table entry is updated.
168+
Update
169+
// Delete event is generated when a table entry is deleted.
170+
Delete
171+
)

drivers/bridge/bridge.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -543,8 +543,11 @@ func (d *driver) NetworkFree(id string) error {
543543
return types.NotImplementedErrorf("not implemented")
544544
}
545545

546+
func (d *driver) EventNotify(etype driverapi.EventType, nid, tableName, key string, value []byte) {
547+
}
548+
546549
// Create a new network using bridge plugin
547-
func (d *driver) CreateNetwork(id string, option map[string]interface{}, ipV4Data, ipV6Data []driverapi.IPAMData) error {
550+
func (d *driver) CreateNetwork(id string, option map[string]interface{}, nInfo driverapi.NetworkInfo, ipV4Data, ipV6Data []driverapi.IPAMData) error {
548551
if len(ipV4Data) == 0 || ipV4Data[0].Pool.String() == "0.0.0.0/0" {
549552
return types.BadRequestErrorf("ipv4 pool is empty")
550553
}

drivers/bridge/bridge_test.go

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ func TestCreateFullOptions(t *testing.T) {
6969
AuxAddresses: map[string]*net.IPNet{DefaultGatewayV4AuxKey: defgw},
7070
},
7171
}
72-
err := d.CreateNetwork("dummy", netOption, ipdList, nil)
72+
err := d.CreateNetwork("dummy", netOption, nil, ipdList, nil)
7373
if err != nil {
7474
t.Fatalf("Failed to create bridge: %v", err)
7575
}
@@ -95,7 +95,7 @@ func TestCreateNoConfig(t *testing.T) {
9595
genericOption := make(map[string]interface{})
9696
genericOption[netlabel.GenericData] = netconfig
9797

98-
if err := d.CreateNetwork("dummy", genericOption, getIPv4Data(t), nil); err != nil {
98+
if err := d.CreateNetwork("dummy", genericOption, nil, getIPv4Data(t), nil); err != nil {
9999
t.Fatalf("Failed to create bridge: %v", err)
100100
}
101101
}
@@ -142,7 +142,7 @@ func TestCreateFullOptionsLabels(t *testing.T) {
142142
},
143143
}
144144

145-
err := d.CreateNetwork("dummy", netOption, ipdList, ipd6List)
145+
err := d.CreateNetwork("dummy", netOption, nil, ipdList, ipd6List)
146146
if err != nil {
147147
t.Fatalf("Failed to create bridge: %v", err)
148148
}
@@ -211,11 +211,11 @@ func TestCreate(t *testing.T) {
211211
genericOption := make(map[string]interface{})
212212
genericOption[netlabel.GenericData] = netconfig
213213

214-
if err := d.CreateNetwork("dummy", genericOption, getIPv4Data(t), nil); err != nil {
214+
if err := d.CreateNetwork("dummy", genericOption, nil, getIPv4Data(t), nil); err != nil {
215215
t.Fatalf("Failed to create bridge: %v", err)
216216
}
217217

218-
err := d.CreateNetwork("dummy", genericOption, getIPv4Data(t), nil)
218+
err := d.CreateNetwork("dummy", genericOption, nil, getIPv4Data(t), nil)
219219
if err == nil {
220220
t.Fatalf("Expected bridge driver to refuse creation of second network with default name")
221221
}
@@ -236,7 +236,7 @@ func TestCreateFail(t *testing.T) {
236236
genericOption := make(map[string]interface{})
237237
genericOption[netlabel.GenericData] = netconfig
238238

239-
if err := d.CreateNetwork("dummy", genericOption, getIPv4Data(t), nil); err == nil {
239+
if err := d.CreateNetwork("dummy", genericOption, nil, getIPv4Data(t), nil); err == nil {
240240
t.Fatal("Bridge creation was expected to fail")
241241
}
242242
}
@@ -258,13 +258,13 @@ func TestCreateMultipleNetworks(t *testing.T) {
258258
config1 := &networkConfiguration{BridgeName: "net_test_1"}
259259
genericOption = make(map[string]interface{})
260260
genericOption[netlabel.GenericData] = config1
261-
if err := d.CreateNetwork("1", genericOption, getIPv4Data(t), nil); err != nil {
261+
if err := d.CreateNetwork("1", genericOption, nil, getIPv4Data(t), nil); err != nil {
262262
t.Fatalf("Failed to create bridge: %v", err)
263263
}
264264

265265
config2 := &networkConfiguration{BridgeName: "net_test_2"}
266266
genericOption[netlabel.GenericData] = config2
267-
if err := d.CreateNetwork("2", genericOption, getIPv4Data(t), nil); err != nil {
267+
if err := d.CreateNetwork("2", genericOption, nil, getIPv4Data(t), nil); err != nil {
268268
t.Fatalf("Failed to create bridge: %v", err)
269269
}
270270

@@ -273,7 +273,7 @@ func TestCreateMultipleNetworks(t *testing.T) {
273273

274274
config3 := &networkConfiguration{BridgeName: "net_test_3"}
275275
genericOption[netlabel.GenericData] = config3
276-
if err := d.CreateNetwork("3", genericOption, getIPv4Data(t), nil); err != nil {
276+
if err := d.CreateNetwork("3", genericOption, nil, getIPv4Data(t), nil); err != nil {
277277
t.Fatalf("Failed to create bridge: %v", err)
278278
}
279279

@@ -282,7 +282,7 @@ func TestCreateMultipleNetworks(t *testing.T) {
282282

283283
config4 := &networkConfiguration{BridgeName: "net_test_4"}
284284
genericOption[netlabel.GenericData] = config4
285-
if err := d.CreateNetwork("4", genericOption, getIPv4Data(t), nil); err != nil {
285+
if err := d.CreateNetwork("4", genericOption, nil, getIPv4Data(t), nil); err != nil {
286286
t.Fatalf("Failed to create bridge: %v", err)
287287
}
288288

@@ -429,6 +429,10 @@ func (te *testEndpoint) AddStaticRoute(destination *net.IPNet, routeType int, ne
429429
return nil
430430
}
431431

432+
func (te *testEndpoint) AddTableEntry(tableName string, key string, value []byte) error {
433+
return nil
434+
}
435+
432436
func (te *testEndpoint) DisableGatewayService() {}
433437

434438
func TestQueryEndpointInfo(t *testing.T) {
@@ -462,7 +466,7 @@ func testQueryEndpointInfo(t *testing.T, ulPxyEnabled bool) {
462466
genericOption[netlabel.GenericData] = netconfig
463467

464468
ipdList := getIPv4Data(t)
465-
err := d.CreateNetwork("net1", genericOption, ipdList, nil)
469+
err := d.CreateNetwork("net1", genericOption, nil, ipdList, nil)
466470
if err != nil {
467471
t.Fatalf("Failed to create bridge: %v", err)
468472
}
@@ -563,7 +567,7 @@ func TestLinkContainers(t *testing.T) {
563567
genericOption[netlabel.GenericData] = netconfig
564568

565569
ipdList := getIPv4Data(t)
566-
err := d.CreateNetwork("net1", genericOption, ipdList, nil)
570+
err := d.CreateNetwork("net1", genericOption, nil, ipdList, nil)
567571
if err != nil {
568572
t.Fatalf("Failed to create bridge: %v", err)
569573
}
@@ -789,7 +793,7 @@ func TestSetDefaultGw(t *testing.T) {
789793
genericOption[netlabel.EnableIPv6] = true
790794
genericOption[netlabel.GenericData] = config
791795

792-
err := d.CreateNetwork("dummy", genericOption, ipdList, nil)
796+
err := d.CreateNetwork("dummy", genericOption, nil, ipdList, nil)
793797
if err != nil {
794798
t.Fatalf("Failed to create bridge: %v", err)
795799
}

drivers/bridge/network_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ func TestLinkCreate(t *testing.T) {
2727
genericOption[netlabel.GenericData] = config
2828

2929
ipdList := getIPv4Data(t)
30-
err := d.CreateNetwork("dummy", genericOption, ipdList, nil)
30+
err := d.CreateNetwork("dummy", genericOption, nil, ipdList, nil)
3131
if err != nil {
3232
t.Fatalf("Failed to create bridge: %v", err)
3333
}
@@ -119,7 +119,7 @@ func TestLinkCreateTwo(t *testing.T) {
119119
genericOption[netlabel.GenericData] = config
120120

121121
ipdList := getIPv4Data(t)
122-
err := d.CreateNetwork("dummy", genericOption, ipdList, nil)
122+
err := d.CreateNetwork("dummy", genericOption, nil, ipdList, nil)
123123
if err != nil {
124124
t.Fatalf("Failed to create bridge: %v", err)
125125
}
@@ -155,7 +155,7 @@ func TestLinkCreateNoEnableIPv6(t *testing.T) {
155155
genericOption[netlabel.GenericData] = config
156156

157157
ipdList := getIPv4Data(t)
158-
err := d.CreateNetwork("dummy", genericOption, ipdList, nil)
158+
err := d.CreateNetwork("dummy", genericOption, nil, ipdList, nil)
159159
if err != nil {
160160
t.Fatalf("Failed to create bridge: %v", err)
161161
}
@@ -190,7 +190,7 @@ func TestLinkDelete(t *testing.T) {
190190
genericOption[netlabel.GenericData] = config
191191

192192
ipdList := getIPv4Data(t)
193-
err := d.CreateNetwork("dummy", genericOption, ipdList, nil)
193+
err := d.CreateNetwork("dummy", genericOption, nil, ipdList, nil)
194194
if err != nil {
195195
t.Fatalf("Failed to create bridge: %v", err)
196196
}

drivers/bridge/port_mapping_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ func TestPortMappingConfig(t *testing.T) {
4545
netOptions[netlabel.GenericData] = netConfig
4646

4747
ipdList := getIPv4Data(t)
48-
err := d.CreateNetwork("dummy", netOptions, ipdList, nil)
48+
err := d.CreateNetwork("dummy", netOptions, nil, ipdList, nil)
4949
if err != nil {
5050
t.Fatalf("Failed to create bridge: %v", err)
5151
}

drivers/host/host.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,10 @@ func (d *driver) NetworkFree(id string) error {
3232
return types.NotImplementedErrorf("not implemented")
3333
}
3434

35-
func (d *driver) CreateNetwork(id string, option map[string]interface{}, ipV4Data, ipV6Data []driverapi.IPAMData) error {
35+
func (d *driver) EventNotify(etype driverapi.EventType, nid, tableName, key string, value []byte) {
36+
}
37+
38+
func (d *driver) CreateNetwork(id string, option map[string]interface{}, nInfo driverapi.NetworkInfo, ipV4Data, ipV6Data []driverapi.IPAMData) error {
3639
d.Lock()
3740
defer d.Unlock()
3841

drivers/host/host_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ func TestDriver(t *testing.T) {
1414
t.Fatalf("Unexpected network type returned by driver")
1515
}
1616

17-
err := d.CreateNetwork("first", nil, nil, nil)
17+
err := d.CreateNetwork("first", nil, nil, nil, nil)
1818
if err != nil {
1919
t.Fatal(err)
2020
}
@@ -23,7 +23,7 @@ func TestDriver(t *testing.T) {
2323
t.Fatalf("Unexpected network id stored")
2424
}
2525

26-
err = d.CreateNetwork("second", nil, nil, nil)
26+
err = d.CreateNetwork("second", nil, nil, nil, nil)
2727
if err == nil {
2828
t.Fatalf("Second network creation should fail on this driver")
2929
}

drivers/ipvlan/ipvlan.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,3 +98,6 @@ func (d *driver) DiscoverNew(dType discoverapi.DiscoveryType, data interface{})
9898
func (d *driver) DiscoverDelete(dType discoverapi.DiscoveryType, data interface{}) error {
9999
return nil
100100
}
101+
102+
func (d *driver) EventNotify(etype driverapi.EventType, nid, tableName, key string, value []byte) {
103+
}

0 commit comments

Comments
 (0)