package registry import ( "fmt" "net" "time" "github.com/GoogleCloudPlatform/kubernetes/pkg/api" "github.com/GoogleCloudPlatform/kubernetes/pkg/proxy/config" "github.com/GoogleCloudPlatform/kubernetes/pkg/util" ) type KubernetesWatcher struct { Registry *KubernetesRegistry } func (k *KubernetesWatcher) OnUpdate(services []api.Service) { fmt.Println("got update") activeServices := util.StringSet{} for _, service := range services { fmt.Printf("%#v\n", service.ObjectMeta) name, exists := service.ObjectMeta.Labels["name"] if !exists { continue } activeServices.Insert(name) serviceIP := net.ParseIP(service.Spec.PortalIP) ks := &KubernetesService{ ServiceName: name, ServiceNodes: []*KubernetesNode{ &KubernetesNode{ NodeAddress: serviceIP.String(), NodePort: service.Spec.Ports[0].Port, }, }, } k.Registry.mtx.Lock() k.Registry.services[name] = ks k.Registry.mtx.Unlock() } k.Registry.mtx.Lock() defer k.Registry.mtx.Unlock() for name, _ := range k.Registry.services { if !activeServices.Has(name) { delete(k.Registry.services, name) } } } func NewKubernetesWatcher(kr *KubernetesRegistry) *KubernetesWatcher { serviceConfig := config.NewServiceConfig() endpointsConfig := config.NewEndpointsConfig() config.NewSourceAPI( kr.Client.Services(api.NamespaceAll), kr.Client.Endpoints(api.NamespaceAll), time.Second*10, serviceConfig.Channel("api"), endpointsConfig.Channel("api"), ) ks := &KubernetesWatcher{ Registry: kr, } serviceConfig.RegisterHandler(ks) return ks }