// Process Infra Nw Create // Auto allocate an endpoint for this node func processInfraNwCreate(netPlugin *plugin.NetPlugin, nwCfg *mastercfg.CfgNetworkState, opts cliOpts) (err error) { pluginHost := opts.hostLabel // Build endpoint request mreq := master.CreateEndpointRequest{ TenantName: nwCfg.Tenant, NetworkName: nwCfg.NetworkName, EndpointID: pluginHost, ConfigEP: intent.ConfigEP{ Container: pluginHost, Host: pluginHost, }, } var mresp master.CreateEndpointResponse err = cluster.MasterPostReq("/plugin/createEndpoint", &mreq, &mresp) if err != nil { log.Errorf("master failed to create endpoint %s", err) return err } log.Infof("Got endpoint create resp from master: %+v", mresp) // Take lock to ensure netPlugin processes only one cmd at a time netPlugin.Lock() defer func() { netPlugin.Unlock() }() // Ask netplugin to create the endpoint netID := nwCfg.NetworkName + "." + nwCfg.Tenant err = netPlugin.CreateEndpoint(netID + "-" + pluginHost) if err != nil { log.Errorf("Endpoint creation failed. Error: %s", err) return err } // Assign IP to interface ipCIDR := fmt.Sprintf("%s/%d", mresp.EndpointConfig.IPAddress, nwCfg.SubnetLen) err = netutils.SetInterfaceIP(nwCfg.NetworkName, ipCIDR) if err != nil { log.Errorf("Could not assign ip: %s", err) return err } return nil }
// AddHostPort adds a host port to the OVS func (sw *OvsSwitch) AddHostPort(intfName string, intfNum int, isHostNS bool) error { var err error // some error checking if sw.netType != "host" { log.Fatalf("Can not add host port to OVS type %s.", sw.netType) } if sw.hostBridge == nil { log.Fatalf("Cannot add host port -- no host bridge") } ovsPortType := "" ovsPortName := getOvsPortName(intfName, isHostNS) if isHostNS { ovsPortType = "internal" } else { // Create a Veth pair err := createVethPair(intfName, ovsPortName) // Set the OVS side of the port as up err = setLinkUp(ovsPortName) if err != nil { log.Errorf("Error setting link %s up. Err: %v", ovsPortName, err) return err } } portID := "host" + intfName // If the port already exists in OVS, remove it first if sw.ovsdbDriver.IsPortNamePresent(ovsPortName) { log.Debugf("Removing existing interface entry %s from OVS", ovsPortName) // Delete it from ovsdb err := sw.ovsdbDriver.DeletePort(ovsPortName) if err != nil { log.Errorf("Error deleting port %s from OVS. Err: %v", ovsPortName, err) } } // Ask OVSDB driver to add the port as an access port err = sw.ovsdbDriver.CreatePort(ovsPortName, ovsPortType, portID, hostVLAN, 0, 0) if err != nil { log.Errorf("Error adding hostport %s to OVS. Err: %v", intfName, err) return err } // Get the openflow port number for the interface ofpPort, err := sw.ovsdbDriver.GetOfpPortNo(ovsPortName) if err != nil { log.Errorf("Could not find the OVS port %s. Err: %v", intfName, err) return err } // Assign an IP based on the intfnumber ipStr, macStr := netutils.PortToHostIPMAC(intfNum) mac, _ := net.ParseMAC(macStr) ip := net.ParseIP(ipStr) portInfo := ofnet.EndpointInfo{ PortNo: ofpPort, MacAddr: mac, IpAddr: ip, } // Add to ofnet if this is the hostNS port. netutils.SetInterfaceMac(intfName, macStr) netutils.SetInterfaceIP(intfName, ipStr) err = setLinkUp(intfName) if isHostNS { err = sw.hostBridge.AddHostPort(portInfo) if err != nil { log.Errorf("Error adding host port %s. Err: %v", intfName, err) return err } log.Infof("Added host port %s to OVS switch %s.", intfName, sw.bridgeName) } defer func() { if err != nil { sw.ovsdbDriver.DeletePort(intfName) } }() return nil }