@@ -6,13 +6,15 @@ import (
66 "net"
77 "os"
88 "path/filepath"
9+ "strconv"
910 "strings"
1011 "sync"
1112 "syscall"
1213
1314 "github.com/Sirupsen/logrus"
1415 "github.com/docker/libnetwork/datastore"
1516 "github.com/docker/libnetwork/driverapi"
17+ "github.com/docker/libnetwork/netlabel"
1618 "github.com/docker/libnetwork/netutils"
1719 "github.com/docker/libnetwork/osl"
1820 "github.com/docker/libnetwork/resolvconf"
@@ -67,9 +69,6 @@ func (d *driver) NetworkFree(id string) error {
6769 return types .NotImplementedErrorf ("not implemented" )
6870}
6971
70- func (d * driver ) EventNotify (etype driverapi.EventType , nid , tableName , key string , value []byte ) {
71- }
72-
7372func (d * driver ) CreateNetwork (id string , option map [string ]interface {}, nInfo driverapi.NetworkInfo , ipV4Data , ipV6Data []driverapi.IPAMData ) error {
7473 if id == "" {
7574 return fmt .Errorf ("invalid network id" )
@@ -92,21 +91,54 @@ func (d *driver) CreateNetwork(id string, option map[string]interface{}, nInfo d
9291 subnets : []* subnet {},
9392 }
9493
95- for _ , ipd := range ipV4Data {
94+ vnis := make ([]uint32 , 0 , len (ipV4Data ))
95+ if gval , ok := option [netlabel .GenericData ]; ok {
96+ optMap := gval .(map [string ]string )
97+ if val , ok := optMap [netlabel .OverlayVxlanIDList ]; ok {
98+ logrus .Debugf ("overlay: Received vxlan IDs: %s" , val )
99+ vniStrings := strings .Split (val , "," )
100+ for _ , vniStr := range vniStrings {
101+ vni , err := strconv .Atoi (vniStr )
102+ if err != nil {
103+ return fmt .Errorf ("invalid vxlan id value %q passed" , vniStr )
104+ }
105+
106+ vnis = append (vnis , uint32 (vni ))
107+ }
108+ }
109+ }
110+
111+ // If we are getting vnis from libnetwork, either we get for
112+ // all subnets or none.
113+ if len (vnis ) != 0 && len (vnis ) < len (ipV4Data ) {
114+ return fmt .Errorf ("insufficient vnis(%d) passed to overlay" , len (vnis ))
115+ }
116+
117+ for i , ipd := range ipV4Data {
96118 s := & subnet {
97119 subnetIP : ipd .Pool ,
98120 gwIP : ipd .Gateway ,
99121 once : & sync.Once {},
100122 }
123+
124+ if len (vnis ) != 0 {
125+ s .vni = vnis [i ]
126+ }
127+
101128 n .subnets = append (n .subnets , s )
102129 }
103130
104131 if err := n .writeToStore (); err != nil {
105132 return fmt .Errorf ("failed to update data store for network %v: %v" , n .id , err )
106133 }
107134
108- d .addNetwork (n )
135+ if nInfo != nil {
136+ if err := nInfo .TableEventRegister (ovPeerTable ); err != nil {
137+ return err
138+ }
139+ }
109140
141+ d .addNetwork (n )
110142 return nil
111143}
112144
@@ -255,11 +287,21 @@ func setHostMode() {
255287}
256288
257289func (n * network ) generateVxlanName (s * subnet ) string {
258- return "vx-" + fmt .Sprintf ("%06x" , n .vxlanID (s )) + "-" + n .id [:5 ]
290+ id := n .id
291+ if len (n .id ) > 5 {
292+ id = n .id [:5 ]
293+ }
294+
295+ return "vx-" + fmt .Sprintf ("%06x" , n .vxlanID (s )) + "-" + id
259296}
260297
261298func (n * network ) generateBridgeName (s * subnet ) string {
262- return "ov-" + fmt .Sprintf ("%06x" , n .vxlanID (s )) + "-" + n .id [:5 ]
299+ id := n .id
300+ if len (n .id ) > 5 {
301+ id = n .id [:5 ]
302+ }
303+
304+ return "ov-" + fmt .Sprintf ("%06x" , n .vxlanID (s )) + "-" + id
263305}
264306
265307func isOverlap (nw * net.IPNet ) bool {
@@ -587,32 +629,38 @@ func (n *network) DataScope() string {
587629}
588630
589631func (n * network ) writeToStore () error {
632+ if n .driver .store == nil {
633+ return nil
634+ }
635+
590636 return n .driver .store .PutObjectAtomic (n )
591637}
592638
593639func (n * network ) releaseVxlanID () error {
594- if n .driver .store == nil {
595- return fmt .Errorf ("no datastore configured. cannot release vxlan id" )
596- }
597-
598640 if len (n .subnets ) == 0 {
599641 return nil
600642 }
601643
602- if err := n .driver .store .DeleteObjectAtomic (n ); err != nil {
603- if err == datastore .ErrKeyModified || err == datastore .ErrKeyNotFound {
604- // In both the above cases we can safely assume that the key has been removed by some other
605- // instance and so simply get out of here
606- return nil
607- }
644+ if n .driver .store != nil {
645+ if err := n .driver .store .DeleteObjectAtomic (n ); err != nil {
646+ if err == datastore .ErrKeyModified || err == datastore .ErrKeyNotFound {
647+ // In both the above cases we can safely assume that the key has been removed by some other
648+ // instance and so simply get out of here
649+ return nil
650+ }
608651
609- return fmt .Errorf ("failed to delete network to vxlan id map: %v" , err )
652+ return fmt .Errorf ("failed to delete network to vxlan id map: %v" , err )
653+ }
610654 }
611655
612656 for _ , s := range n .subnets {
613- n .driver .vxlanIdm .Release (uint64 (n .vxlanID (s )))
657+ if n .driver .vxlanIdm != nil {
658+ n .driver .vxlanIdm .Release (uint64 (n .vxlanID (s )))
659+ }
660+
614661 n .setVxlanID (s , 0 )
615662 }
663+
616664 return nil
617665}
618666
@@ -623,7 +671,7 @@ func (n *network) obtainVxlanID(s *subnet) error {
623671 }
624672
625673 if n .driver .store == nil {
626- return fmt .Errorf ("no datastore configured. cannot obtain vxlan id" )
674+ return fmt .Errorf ("no valid vxlan id and no datastore configured, cannot obtain vxlan id" )
627675 }
628676
629677 for {
0 commit comments