func processPeerEvent(netPlugin *plugin.NetPlugin, opts cliOpts, peerInfo *drivers.PeerHostState, isDelete bool) (err error) { // if this is our own peer info coming back to us, ignore it if peerInfo.ID == opts.hostLabel { return nil } nodeInfo := core.ServiceInfo{ HostAddr: peerInfo.HostAddr, Port: 0, } // take a lock to ensure we are programming one event at a time. netPlugin.Lock() defer func() { netPlugin.Unlock() }() operStr := "" if isDelete { err = netPlugin.DeletePeerHost(nodeInfo) operStr = "delete" } else { err = netPlugin.AddPeerHost(nodeInfo) operStr = "create" } if err != nil { log.Errorf("PeerHost operation %s failed. Error: %s", operStr, err) } else { log.Infof("PeerHost operation %s succeeded", operStr) } return }
// Main loop to discover peer hosts and masters func peerDiscoveryLoop(netplugin *plugin.NetPlugin, objdbClient objdb.ObjdbApi) { // 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) // Get the local address localIP, err := objdbClient.GetLocalAddr() if err != nil { log.Fatalf("Error getting locla IP address. Err: %v", err) } // 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 := netplugin.AddMaster(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 on 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 := netplugin.AddMaster(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 := netplugin.DeleteMaster(core.ServiceInfo{ HostAddr: nodeInfo.HostAddr, Port: nodeInfo.Port, }) if err != nil { log.Errorf("Error deletin master {%+v}. Err: %v", nodeInfo, err) } } } } }