func (factory *RouterControllerFactory) Create(plugin router.Plugin) *controller.RouterController { routeEventQueue := oscache.NewEventQueue(cache.MetaNamespaceKeyFunc) cache.NewReflector(&routeLW{factory.OSClient}, &routeapi.Route{}, routeEventQueue, 2*time.Minute).Run() endpointsEventQueue := oscache.NewEventQueue(cache.MetaNamespaceKeyFunc) cache.NewReflector(&endpointsLW{factory.KClient}, &kapi.Endpoints{}, endpointsEventQueue, 2*time.Minute).Run() return &controller.RouterController{ Plugin: plugin, NextEndpoints: func() (watch.EventType, *kapi.Endpoints, error) { eventType, obj, err := endpointsEventQueue.Pop() if err != nil { return watch.Error, nil, err } return eventType, obj.(*kapi.Endpoints), nil }, NextRoute: func() (watch.EventType, *routeapi.Route, error) { eventType, obj, err := routeEventQueue.Pop() if err != nil { return watch.Error, nil, err } return eventType, obj.(*routeapi.Route), nil }, } }
func (oi *OsdnRegistryInterface) WatchMinions(receiver chan *osdnapi.MinionEvent, stop chan bool) error { minionEventQueue := oscache.NewEventQueue(cache.MetaNamespaceKeyFunc) listWatch := &cache.ListWatch{ ListFunc: func() (runtime.Object, error) { return oi.kClient.Nodes().List(labels.Everything(), fields.Everything()) }, WatchFunc: func(resourceVersion string) (watch.Interface, error) { return oi.kClient.Nodes().Watch(labels.Everything(), fields.Everything(), resourceVersion) }, } cache.NewReflector(listWatch, &kapi.Node{}, minionEventQueue, 4*time.Minute).Run() for { eventType, obj, err := minionEventQueue.Pop() if err != nil { return err } switch eventType { case watch.Added: // we should ignore the modified event because status updates cause unnecessary noise // the only time we would care about modified would be if the minion changes its IP address // and hence all nodes need to update their vtep entries for the respective subnet // create minionEvent node := obj.(*kapi.Node) receiver <- &osdnapi.MinionEvent{Type: osdnapi.Added, Minion: node.ObjectMeta.Name} case watch.Deleted: // TODO: There is a chance that a Delete event will not get triggered. // Need to use a periodic sync loop that lists and compares. node := obj.(*kapi.Node) receiver <- &osdnapi.MinionEvent{Type: osdnapi.Deleted, Minion: node.ObjectMeta.Name} } } return nil }
func (oi *OsdnRegistryInterface) WatchSubnets(receiver chan *osdnapi.SubnetEvent, stop chan bool) error { subnetEventQueue := oscache.NewEventQueue(cache.MetaNamespaceKeyFunc) listWatch := &cache.ListWatch{ ListFunc: func() (runtime.Object, error) { return oi.oClient.HostSubnets().List() }, WatchFunc: func(resourceVersion string) (watch.Interface, error) { return oi.oClient.HostSubnets().Watch(resourceVersion) }, } cache.NewReflector(listWatch, &api.HostSubnet{}, subnetEventQueue, 4*time.Minute).Run() for { eventType, obj, err := subnetEventQueue.Pop() if err != nil { return err } switch eventType { case watch.Added, watch.Modified: // create SubnetEvent hs := obj.(*api.HostSubnet) receiver <- &osdnapi.SubnetEvent{Type: osdnapi.Added, Minion: hs.Host, Sub: osdnapi.Subnet{Minion: hs.HostIP, Sub: hs.Subnet}} case watch.Deleted: // TODO: There is a chance that a Delete event will not get triggered. // Need to use a periodic sync loop that lists and compares. hs := obj.(*api.HostSubnet) receiver <- &osdnapi.SubnetEvent{Type: osdnapi.Deleted, Minion: hs.Host, Sub: osdnapi.Subnet{Minion: hs.HostIP, Sub: hs.Subnet}} } } return nil }