//processBgpEvent processes Bgp neighbor add/delete events func processBgpEvent(netPlugin *plugin.NetPlugin, opts cliOpts, hostID string, isDelete bool) error { var err error if opts.hostLabel != hostID { log.Errorf("Ignoring Bgp Event on this host") return err } netPlugin.Lock() defer func() { netPlugin.Unlock() }() operStr := "" if isDelete { err = netPlugin.DeleteBgp(hostID) operStr = "delete" } else { err = netPlugin.AddBgp(hostID) operStr = "create" } if err != nil { log.Errorf("Bgp operation %s failed. Error: %s", operStr, err) } else { log.Infof("Bgp operation %s succeeded", operStr) } return err }
// processEpState restores endpoint state func processEpState(netPlugin *plugin.NetPlugin, opts cliOpts, epID string) error { // take a lock to ensure we are programming one event at a time. // Also network create events need to be processed before endpoint creates // and reverse shall happen for deletes. That order is ensured by netmaster, // so we don't need to worry about that here netPlugin.Lock() defer func() { netPlugin.Unlock() }() // read endpoint config epCfg := &mastercfg.CfgEndpointState{} epCfg.StateDriver = netPlugin.StateDriver err := epCfg.Read(epID) if err != nil { log.Errorf("Failed to read config for ep '%s' \n", epID) return err } // if the endpoint is not for this host, ignore it if skipHost(epCfg.VtepIP, epCfg.HomingHost, opts.hostLabel) { log.Infof("skipping mismatching host for ep %s. EP's host %s (my host: %s)", epID, epCfg.HomingHost, opts.hostLabel) return nil } // Create the endpoint err = netPlugin.CreateEndpoint(epID) if err != nil { log.Errorf("Endpoint operation create failed. Error: %s", err) return err } log.Infof("Endpoint operation create succeeded") return err }
func processNetEvent(netPlugin *plugin.NetPlugin, nwCfg *mastercfg.CfgNetworkState, isDelete bool) (err error) { // take a lock to ensure we are programming one event at a time. // Also network create events need to be processed before endpoint creates // and reverse shall happen for deletes. That order is ensured by netmaster, // so we don't need to worry about that here netPlugin.Lock() defer func() { netPlugin.Unlock() }() operStr := "" if isDelete { err = netPlugin.DeleteNetwork(nwCfg.ID, nwCfg.NwType, nwCfg.PktTagType, nwCfg.PktTag, nwCfg.ExtPktTag, nwCfg.Gateway, nwCfg.Tenant) operStr = "delete" } else { err = netPlugin.CreateNetwork(nwCfg.ID) operStr = "create" } if err != nil { log.Errorf("Network operation %s failed. Error: %s", operStr, err) } else { log.Infof("Network operation %s succeeded", operStr) } return }
func processServiceLBEvent(netPlugin *plugin.NetPlugin, opts cliOpts, svcLBCfg *mastercfg.CfgServiceLBState, isDelete bool) error { var err error portSpecList := []core.PortSpec{} portSpec := core.PortSpec{} netPlugin.Lock() defer func() { netPlugin.Unlock() }() serviceID := svcLBCfg.ID log.Infof("Recevied Process Service load balancer event {%v}", svcLBCfg) //create portspect list from state. //Ports format: servicePort:ProviderPort:Protocol for _, port := range svcLBCfg.Ports { portInfo := strings.Split(port, ":") if len(portInfo) != 3 { return errors.New("Invalid Port Format") } svcPort := portInfo[0] provPort := portInfo[1] portSpec.Protocol = portInfo[2] sPort, _ := strconv.ParseUint(svcPort, 10, 16) portSpec.SvcPort = uint16(sPort) pPort, _ := strconv.ParseUint(provPort, 10, 16) portSpec.ProvPort = uint16(pPort) portSpecList = append(portSpecList, portSpec) } spec := &core.ServiceSpec{ IPAddress: svcLBCfg.IPAddress, Ports: portSpecList, } operStr := "" if isDelete { err = netPlugin.DeleteServiceLB(serviceID, spec) operStr = "delete" } else { err = netPlugin.AddServiceLB(serviceID, spec) operStr = "create" } if err != nil { log.Errorf("Service Load Balancer %s failed.Error:%s", operStr, err) return err } log.Infof("Service Load Balancer %s succeeded", operStr) return nil }
// 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 }
func processEpgEvent(netPlugin *plugin.NetPlugin, opts core.InstanceInfo, ID string, isDelete bool) error { log.Infof("Received processEpgEvent") var err error netPlugin.Lock() defer func() { netPlugin.Unlock() }() operStr := "" if isDelete { operStr = "delete" } else { err = netPlugin.UpdateEndpointGroup(ID) operStr = "update" } if err != nil { log.Errorf("Epg %s failed. Error: %s", operStr, err) } else { log.Infof("Epg %s succeeded", operStr) } return err }