diff --git a/libnetwork/drivers/overlay/joinleave.go b/libnetwork/drivers/overlay/joinleave.go index db24c74f34..207e65a90d 100644 --- a/libnetwork/drivers/overlay/joinleave.go +++ b/libnetwork/drivers/overlay/joinleave.go @@ -4,7 +4,9 @@ import ( "fmt" "net" + log "github.com/Sirupsen/logrus" "github.com/docker/libnetwork/driverapi" + "github.com/docker/libnetwork/types" "github.com/vishvananda/netlink" ) @@ -78,6 +80,15 @@ func (d *driver) Join(nid, eid string, sboxKey string, jinfo driverapi.JoinInfo, return fmt.Errorf("could not set mac address (%v) to the container interface: %v", ep.mac, err) } + for _, sub := range n.subnets { + if sub == s { + continue + } + if err := jinfo.AddStaticRoute(sub.subnetIP, types.NEXTHOP, s.gwIP.IP); err != nil { + log.Errorf("Adding subnet %s static route in network %q failed\n", s.subnetIP, n.id) + } + } + if iNames := jinfo.InterfaceName(); iNames != nil { err = iNames.SetNames(name2, "eth") if err != nil { diff --git a/libnetwork/drivers/overlay/ov_network.go b/libnetwork/drivers/overlay/ov_network.go index fa5acd297a..756d9e7b9c 100644 --- a/libnetwork/drivers/overlay/ov_network.go +++ b/libnetwork/drivers/overlay/ov_network.go @@ -29,6 +29,12 @@ type subnet struct { gwIP *net.IPNet } +type subnetJSON struct { + SubnetIP string + GwIP string + Vni uint32 +} + type network struct { id string dbIndex uint64 @@ -366,23 +372,22 @@ func (n *network) KeyPrefix() []string { } func (n *network) Value() []byte { - overlayNetmap := make(map[string]interface{}) + netJSON := []*subnetJSON{} - s := n.subnets[0] - if s == nil { - logrus.Errorf("Network %s has no subnets", n.id) - return []byte{} + for _, s := range n.subnets { + sj := &subnetJSON{ + SubnetIP: s.subnetIP.String(), + GwIP: s.gwIP.String(), + Vni: s.vni, + } + netJSON = append(netJSON, sj) } - overlayNetmap["subnetIP"] = s.subnetIP.String() - overlayNetmap["gwIP"] = s.gwIP.String() - overlayNetmap["vni"] = s.vni + b, err := json.Marshal(netJSON) - b, err := json.Marshal(overlayNetmap) if err != nil { return []byte{} } - return b } @@ -404,36 +409,41 @@ func (n *network) Skip() bool { } func (n *network) SetValue(value []byte) error { - var ( - overlayNetmap map[string]interface{} - err error - ) + var newNet bool + netJSON := []*subnetJSON{} - err = json.Unmarshal(value, &overlayNetmap) + err := json.Unmarshal(value, &netJSON) if err != nil { return err } - subnetIPstr := overlayNetmap["subnetIP"].(string) - gwIPstr := overlayNetmap["gwIP"].(string) - vni := uint32(overlayNetmap["vni"].(float64)) - - subnetIP, _ := types.ParseCIDR(subnetIPstr) - gwIP, _ := types.ParseCIDR(gwIPstr) - - s := &subnet{ - subnetIP: subnetIP, - gwIP: gwIP, - vni: vni, - once: &sync.Once{}, - } - n.subnets = append(n.subnets, s) - - sNet := n.getMatchingSubnet(subnetIP) - if sNet != nil { - sNet.vni = vni + if len(n.subnets) == 0 { + newNet = true } + for _, sj := range netJSON { + subnetIPstr := sj.SubnetIP + gwIPstr := sj.GwIP + vni := sj.Vni + + subnetIP, _ := types.ParseCIDR(subnetIPstr) + gwIP, _ := types.ParseCIDR(gwIPstr) + + if newNet { + s := &subnet{ + subnetIP: subnetIP, + gwIP: gwIP, + vni: vni, + once: &sync.Once{}, + } + n.subnets = append(n.subnets, s) + } else { + sNet := n.getMatchingSubnet(subnetIP) + if sNet != nil { + sNet.vni = vni + } + } + } return nil }