// Create a new network func (d *driver) CreateNetwork(id string, option map[string]interface{}, nInfo driverapi.NetworkInfo, ipV4Data, ipV6Data []driverapi.IPAMData) error { if _, err := d.getNetwork(id); err == nil { return types.ForbiddenErrorf("network %s exists", id) } genData, ok := option[netlabel.GenericData].(map[string]string) if !ok { return fmt.Errorf("Unknown generic data option") } // Parse and validate the config. It should not conflict with existing networks' config config, err := d.parseNetworkOptions(id, genData) if err != nil { return err } err = config.processIPAM(id, ipV4Data, ipV6Data) if err != nil { return err } network := &hnsNetwork{ id: config.ID, endpoints: make(map[string]*hnsEndpoint), config: config, driver: d, } d.Lock() d.networks[config.ID] = network d.Unlock() // A non blank hnsid indicates that the network was discovered // from HNS. No need to call HNS if this network was discovered // from HNS if config.HnsID == "" { subnets := []hcsshim.Subnet{} for _, ipData := range ipV4Data { subnet := hcsshim.Subnet{ AddressPrefix: ipData.Pool.String(), } if ipData.Gateway != nil { subnet.GatewayAddress = ipData.Gateway.IP.String() } subnets = append(subnets, subnet) } network := &hcsshim.HNSNetwork{ Name: config.Name, Type: d.name, Subnets: subnets, NetworkAdapterName: config.NetworkAdapterName, } if network.Name == "" { network.Name = id } configurationb, err := json.Marshal(network) if err != nil { return err } configuration := string(configurationb) log.Debugf("HNSNetwork Request =%v Address Space=%v", configuration, subnets) hnsresponse, err := hcsshim.HNSNetworkRequest("POST", "", configuration) if err != nil { return err } config.HnsID = hnsresponse.Id genData[HNSID] = config.HnsID } return nil }
func (d *driver) findHnsNetwork(n *network) error { ln, err := d.getLocalNetworkFromStore(n.id) if err != nil { return err } if ln == nil { subnets := []hcsshim.Subnet{} for _, s := range n.subnets { subnet := hcsshim.Subnet{ AddressPrefix: s.subnetIP.String(), } if s.gwIP != nil { subnet.GatewayAddress = s.gwIP.IP.String() } vsidPolicy, err := json.Marshal(hcsshim.VsidPolicy{ Type: "VSID", VSID: uint(s.vni), }) if err != nil { return err } subnet.Policies = append(subnet.Policies, vsidPolicy) subnets = append(subnets, subnet) } network := &hcsshim.HNSNetwork{ Name: n.name, Type: d.Type(), Subnets: subnets, NetworkAdapterName: n.interfaceName, } configurationb, err := json.Marshal(network) if err != nil { return err } configuration := string(configurationb) logrus.Infof("HNSNetwork Request =%v", configuration) hnsresponse, err := hcsshim.HNSNetworkRequest("POST", "", configuration) if err != nil { return err } n.hnsId = hnsresponse.Id n.providerAddress = hnsresponse.ManagementIP // Save local host specific info if err := d.writeLocalNetworkToStore(n); err != nil { return fmt.Errorf("failed to update data store for network %v: %v", n.id, err) } } else { n.hnsId = ln.hnsID n.providerAddress = ln.providerAddress } return nil }