// Register netplugin with service registry func registerService(objClient objdb.API, ctrlIP, vtepIP, hostname string) error { // netplugin service info srvInfo := objdb.ServiceInfo{ ServiceName: "netplugin", TTL: 10, HostAddr: ctrlIP, Port: netpluginRPCPort, Hostname: hostname, } // Register the node with service registry err := objClient.RegisterService(srvInfo) if err != nil { log.Fatalf("Error registering service. Err: %v", err) return err } // netplugn VTEP service info srvInfo = objdb.ServiceInfo{ ServiceName: "netplugin.vtep", TTL: 10, HostAddr: vtepIP, Port: vxlanUDPPort, } // Register the node with service registry err = objClient.RegisterService(srvInfo) if err != nil { log.Fatalf("Error registering service. Err: %v", err) return err } log.Infof("Registered netplugin service with registry") return nil }
// Register netplugin with service registry func registerService(objdbClient objdb.API, localIP string) error { // service info srvInfo := objdb.ServiceInfo{ ServiceName: "netplugin", HostAddr: localIP, Port: ofnet.OFNET_AGENT_VXLAN_PORT, } // Register the node with service registry err := objdbClient.RegisterService(srvInfo) if err != nil { log.Fatalf("Error registering service. Err: %v", err) return err } log.Infof("Registered netplugin service with registry") return nil }
// 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.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) } } } } }