func processGlobalFwdModeUpdEvent(netPlugin *plugin.NetPlugin, opts core.InstanceInfo, fwdMode string) { // parse store URL parts := strings.Split(opts.DbURL, "://") if len(parts) < 2 { log.Fatalf("Invalid cluster-store-url %s", opts.DbURL) } stateStore := parts[0] // initialize the config pluginConfig := plugin.Config{ Drivers: plugin.Drivers{ Network: "ovs", State: stateStore, }, Instance: opts, } pluginConfig.Instance.FwdMode = fwdMode netPlugin.GlobalFwdModeUpdate(pluginConfig) for _, master := range cluster.MasterDB { netPlugin.AddMaster(core.ServiceInfo{ HostAddr: master.HostAddr, Port: 9001, //netmasterRPCPort }) } serviceList, _ := cluster.ObjdbClient.GetService("netplugin") for _, serviceInfo := range serviceList { if serviceInfo.HostAddr != opts.VtepIP { netPlugin.AddPeerHost(core.ServiceInfo{ HostAddr: serviceInfo.HostAddr, Port: 4789, //vxlanUDPPort }) } } }
// Main loop to discover peer hosts and masters func peerDiscoveryLoop(netplugin *plugin.NetPlugin, objClient objdb.API, ctrlIP, vtepIP string) { // Create channels for watch thread nodeEventCh := make(chan objdb.WatchServiceEvent, 1) watchStopCh := make(chan bool, 1) masterEventCh := make(chan objdb.WatchServiceEvent, 1) masterWatchStopCh := make(chan bool, 1) // Start a watch on netmaster err := objClient.WatchService("netmaster.rpc", masterEventCh, masterWatchStopCh) if err != nil { log.Fatalf("Could not start a watch on netmaster service. Err: %v", err) } // Start a watch on netplugin service err = objClient.WatchService("netplugin.vtep", nodeEventCh, watchStopCh) if err != nil { log.Fatalf("Could not start a watch on netplugin service. Err: %v", err) } for { select { case srvEvent := <-nodeEventCh: log.Debugf("Received netplugin service watch event: %+v", srvEvent) // collect the info about the node nodeInfo := srvEvent.ServiceInfo // check if its our own info coming back to us if nodeInfo.HostAddr == vtepIP { break } // Handle based on event type if srvEvent.EventType == objdb.WatchServiceEventAdd { log.Infof("Node add event for {%+v}", nodeInfo) // add the node err := netplugin.AddPeerHost(core.ServiceInfo{ HostAddr: nodeInfo.HostAddr, Port: vxlanUDPPort, }) if err != nil { log.Errorf("Error adding node {%+v}. Err: %v", nodeInfo, err) } } else if srvEvent.EventType == objdb.WatchServiceEventDel { log.Infof("Node delete event for {%+v}", nodeInfo) // remove the node err := netplugin.DeletePeerHost(core.ServiceInfo{ HostAddr: nodeInfo.HostAddr, Port: vxlanUDPPort, }) if err != nil { log.Errorf("Error adding node {%+v}. Err: %v", nodeInfo, err) } } case srvEvent := <-masterEventCh: log.Infof("Received netmaster service watch event: %+v", srvEvent) // collect the info about the node nodeInfo := srvEvent.ServiceInfo // Handle based on event type if srvEvent.EventType == objdb.WatchServiceEventAdd { log.Infof("Master add event for {%+v}", nodeInfo) // Add the master err := addMaster(netplugin, nodeInfo) if err != nil { log.Errorf("Error adding master {%+v}. Err: %v", nodeInfo, err) } } else if srvEvent.EventType == objdb.WatchServiceEventDel { log.Infof("Master delete event for {%+v}", nodeInfo) // Delete the master err := deleteMaster(netplugin, nodeInfo) if err != nil { log.Errorf("Error deleting master {%+v}. Err: %v", nodeInfo, err) } } } // Dont process next peer event for another 100ms time.Sleep(100 * time.Millisecond) } }
// Main loop to discover peer hosts and masters func peerDiscoveryLoop(netplugin *plugin.NetPlugin, objdbClient objdb.ObjdbApi, localIP string) { // Create channels for watch thread nodeEventCh := make(chan objdb.WatchServiceEvent, 1) watchStopCh := make(chan bool, 1) masterEventCh := make(chan objdb.WatchServiceEvent, 1) masterWatchStopCh := make(chan bool, 1) // Start a watch on netplugin service so that we dont miss any err := objdbClient.WatchService("netplugin", nodeEventCh, watchStopCh) if err != nil { log.Fatalf("Could not start a watch on netplugin service. Err: %v", err) } // Start a watch on netmaster too err = objdbClient.WatchService("netmaster", masterEventCh, masterWatchStopCh) if err != nil { log.Fatalf("Could not start a watch on netmaster service. Err: %v", err) } // Get a list of all existing netplugin nodes nodeList, err := objdbClient.GetService("netplugin") if err != nil { log.Errorf("Error getting node list from objdb. Err: %v", err) } log.Infof("Got netplugin service list: %+v", nodeList) // walk each node and add it as a PeerHost for _, node := range nodeList { // Ignore if its our own info if node.HostAddr == localIP { continue } // add the node err := netplugin.AddPeerHost(core.ServiceInfo{ HostAddr: node.HostAddr, Port: ofnet.OFNET_AGENT_PORT, }) if err != nil { log.Errorf("Error adding node {%+v}. Err: %v", node, err) } } // Get a list of all existing netmasters masterList, err := objdbClient.GetService("netmaster") if err != nil { log.Errorf("Error getting master list from objdb. Err: %v", err) } log.Infof("Got netmaster service list: %+v", masterList) // Walk each master and add it for _, master := range masterList { // Add the master err := addMaster(netplugin, core.ServiceInfo{ HostAddr: master.HostAddr, Port: ofnet.OFNET_MASTER_PORT, }) if err != nil { log.Errorf("Error adding master {%+v}. Err: %v", master, err) } } for { select { case srvEvent := <-nodeEventCh: log.Infof("Received netplugin service watch event: %+v", srvEvent) // collect the info about the node nodeInfo := srvEvent.ServiceInfo // check if its our own info coming back to us if nodeInfo.HostAddr == localIP { break } // Handle based on event type if srvEvent.EventType == objdb.WatchServiceEventAdd { log.Infof("Node add event for {%+v}", nodeInfo) // add the node err := netplugin.AddPeerHost(core.ServiceInfo{ HostAddr: nodeInfo.HostAddr, Port: ofnet.OFNET_AGENT_PORT, }) if err != nil { log.Errorf("Error adding node {%+v}. Err: %v", nodeInfo, err) } } else if srvEvent.EventType == objdb.WatchServiceEventDel { log.Infof("Node delete event for {%+v}", nodeInfo) // remove the node err := netplugin.DeletePeerHost(core.ServiceInfo{ HostAddr: nodeInfo.HostAddr, Port: ofnet.OFNET_AGENT_PORT, }) if err != nil { log.Errorf("Error adding node {%+v}. Err: %v", nodeInfo, err) } } case srvEvent := <-masterEventCh: log.Infof("Received netmaster service watch event: %+v", srvEvent) // collect the info about the node nodeInfo := srvEvent.ServiceInfo // Handle based on event type if srvEvent.EventType == objdb.WatchServiceEventAdd { log.Infof("Master add event for {%+v}", nodeInfo) // Add the master err := addMaster(netplugin, core.ServiceInfo{ HostAddr: nodeInfo.HostAddr, Port: ofnet.OFNET_MASTER_PORT, }) if err != nil { log.Errorf("Error adding master {%+v}. Err: %v", nodeInfo, err) } } else if srvEvent.EventType == objdb.WatchServiceEventDel { log.Infof("Master delete event for {%+v}", nodeInfo) // Delete the master err := deleteMaster(netplugin, core.ServiceInfo{ HostAddr: nodeInfo.HostAddr, Port: nodeInfo.Port, }) if err != nil { log.Errorf("Error deleting master {%+v}. Err: %v", nodeInfo, err) } } } } }
// Main loop to discover peer hosts and masters func peerDiscoveryLoop(netplugin *plugin.NetPlugin, objdbClient objdb.API, localIP string) { // Create channels for watch thread nodeEventCh := make(chan objdb.WatchServiceEvent, 1) watchStopCh := make(chan bool, 1) masterEventCh := make(chan objdb.WatchServiceEvent, 1) masterWatchStopCh := make(chan bool, 1) // Start a watch on netmaster err := objdbClient.WatchService("netmaster", masterEventCh, masterWatchStopCh) if err != nil { log.Fatalf("Could not start a watch on netmaster service. Err: %v", err) } // Start a watch on netplugin service err = objdbClient.WatchService("netplugin", nodeEventCh, watchStopCh) if err != nil { log.Fatalf("Could not start a watch on netplugin service. Err: %v", err) } for { select { case srvEvent := <-nodeEventCh: log.Infof("Received netplugin service watch event: %+v", srvEvent) // collect the info about the node nodeInfo := srvEvent.ServiceInfo // check if its our own info coming back to us if nodeInfo.HostAddr == localIP { break } // Handle based on event type if srvEvent.EventType == objdb.WatchServiceEventAdd { log.Infof("Node add event for {%+v}", nodeInfo) // add the node err := netplugin.AddPeerHost(core.ServiceInfo{ HostAddr: nodeInfo.HostAddr, Port: ofnet.OFNET_AGENT_VXLAN_PORT, }) if err != nil { log.Errorf("Error adding node {%+v}. Err: %v", nodeInfo, err) } // add the node err = netplugin.AddPeerHost(core.ServiceInfo{ HostAddr: nodeInfo.HostAddr, Port: ofnet.OFNET_AGENT_VLAN_PORT, }) if err != nil { log.Errorf("Error adding node {%+v}. Err: %v", nodeInfo, err) } } else if srvEvent.EventType == objdb.WatchServiceEventDel { log.Infof("Node delete event for {%+v}", nodeInfo) // remove the node err := netplugin.DeletePeerHost(core.ServiceInfo{ HostAddr: nodeInfo.HostAddr, Port: ofnet.OFNET_AGENT_VXLAN_PORT, }) if err != nil { log.Errorf("Error adding node {%+v}. Err: %v", nodeInfo, err) } // remove the node err = netplugin.DeletePeerHost(core.ServiceInfo{ HostAddr: nodeInfo.HostAddr, Port: ofnet.OFNET_AGENT_VLAN_PORT, }) if err != nil { log.Errorf("Error adding node {%+v}. Err: %v", nodeInfo, err) } } case srvEvent := <-masterEventCh: log.Infof("Received netmaster service watch event: %+v", srvEvent) // collect the info about the node nodeInfo := srvEvent.ServiceInfo // Handle based on event type if srvEvent.EventType == objdb.WatchServiceEventAdd { log.Infof("Master add event for {%+v}", nodeInfo) // Add the master err := addMaster(netplugin, core.ServiceInfo{ HostAddr: nodeInfo.HostAddr, Port: ofnet.OFNET_MASTER_PORT, }) if err != nil { log.Errorf("Error adding master {%+v}. Err: %v", nodeInfo, err) } } else if srvEvent.EventType == objdb.WatchServiceEventDel { log.Infof("Master delete event for {%+v}", nodeInfo) // Delete the master err := deleteMaster(netplugin, core.ServiceInfo{ HostAddr: nodeInfo.HostAddr, Port: nodeInfo.Port, }) if err != nil { log.Errorf("Error deleting master {%+v}. Err: %v", nodeInfo, err) } } } } }