func (d *driver) CreateNetwork(id string, option map[string]interface{}, nInfo driverapi.NetworkInfo, ipV4Data, ipV6Data []driverapi.IPAMData) error { if id == "" { return fmt.Errorf("invalid network id") } if len(ipV4Data) == 0 || ipV4Data[0].Pool.String() == "0.0.0.0/0" { return types.BadRequestErrorf("ipv4 pool is empty") } // Since we perform lazy configuration make sure we try // configuring the driver when we enter CreateNetwork if err := d.configure(); err != nil { return err } n := &network{ id: id, driver: d, endpoints: endpointTable{}, once: &sync.Once{}, subnets: []*subnet{}, } vnis := make([]uint32, 0, len(ipV4Data)) if gval, ok := option[netlabel.GenericData]; ok { optMap := gval.(map[string]string) if val, ok := optMap[netlabel.OverlayVxlanIDList]; ok { logrus.Debugf("overlay: Received vxlan IDs: %s", val) vniStrings := strings.Split(val, ",") for _, vniStr := range vniStrings { vni, err := strconv.Atoi(vniStr) if err != nil { return fmt.Errorf("invalid vxlan id value %q passed", vniStr) } vnis = append(vnis, uint32(vni)) } } if _, ok := optMap[secureOption]; ok { n.secure = true } if val, ok := optMap[netlabel.DriverMTU]; ok { var err error if n.mtu, err = strconv.Atoi(val); err != nil { return fmt.Errorf("failed to parse %v: %v", val, err) } if n.mtu < 0 { return fmt.Errorf("invalid MTU value: %v", n.mtu) } } } // If we are getting vnis from libnetwork, either we get for // all subnets or none. if len(vnis) != 0 && len(vnis) < len(ipV4Data) { return fmt.Errorf("insufficient vnis(%d) passed to overlay", len(vnis)) } for i, ipd := range ipV4Data { s := &subnet{ subnetIP: ipd.Pool, gwIP: ipd.Gateway, once: &sync.Once{}, } if len(vnis) != 0 { s.vni = vnis[i] } n.subnets = append(n.subnets, s) } if err := n.writeToStore(); err != nil { return fmt.Errorf("failed to update data store for network %v: %v", n.id, err) } // Make sure no rule is on the way from any stale secure network if !n.secure { for _, vni := range vnis { programMangle(vni, false) } } if nInfo != nil { if err := nInfo.TableEventRegister(ovPeerTable); err != nil { return err } } d.addNetwork(n) return nil }
func (d *driver) CreateNetwork(id string, option map[string]interface{}, nInfo driverapi.NetworkInfo, ipV4Data, ipV6Data []driverapi.IPAMData) error { var ( networkName string interfaceName string ) if id == "" { return fmt.Errorf("invalid network id") } if len(ipV4Data) == 0 || ipV4Data[0].Pool.String() == "0.0.0.0/0" { return types.BadRequestErrorf("ipv4 pool is empty") } vnis := make([]uint32, 0, len(ipV4Data)) // Since we perform lazy configuration make sure we try // configuring the driver when we enter CreateNetwork if err := d.configure(); err != nil { return err } n := &network{ id: id, driver: d, endpoints: endpointTable{}, subnets: []*subnet{}, } genData, ok := option[netlabel.GenericData].(map[string]string) if !ok { return fmt.Errorf("Unknown generic data option") } for label, value := range genData { switch label { case "com.docker.network.windowsshim.networkname": networkName = value case "com.docker.network.windowsshim.interface": interfaceName = value case "com.docker.network.windowsshim.hnsid": n.hnsId = value case netlabel.OverlayVxlanIDList: vniStrings := strings.Split(value, ",") for _, vniStr := range vniStrings { vni, err := strconv.Atoi(vniStr) if err != nil { return fmt.Errorf("invalid vxlan id value %q passed", vniStr) } vnis = append(vnis, uint32(vni)) } } } // If we are getting vnis from libnetwork, either we get for // all subnets or none. if len(vnis) != 0 && len(vnis) < len(ipV4Data) { return fmt.Errorf("insufficient vnis(%d) passed to overlay", len(vnis)) } for i, ipd := range ipV4Data { s := &subnet{ subnetIP: ipd.Pool, gwIP: ipd.Gateway, } if len(vnis) != 0 { s.vni = vnis[i] } n.subnets = append(n.subnets, s) } n.name = networkName if n.name == "" { n.name = id } n.interfaceName = interfaceName if err := n.writeToStore(); err != nil { return fmt.Errorf("failed to update data store for network %v: %v", n.id, err) } if nInfo != nil { if err := nInfo.TableEventRegister(ovPeerTable); err != nil { return err } } d.addNetwork(n) err := d.findHnsNetwork(n) genData["com.docker.network.windowsshim.hnsid"] = n.hnsId return err }