func (d *Daemon) endpointAddFn(obj interface{}) { ep, ok := obj.(*v1.Endpoints) if !ok { return } log.Debugf("Endpoint %+v", ep) svcns := types.K8sServiceNamespace{ Service: ep.Name, Namespace: ep.Namespace, } newSvcEP := types.NewK8sServiceEndpoint() for _, sub := range ep.Subsets { for _, addr := range sub.Addresses { newSvcEP.BEIPs[addr.IP] = true } for _, port := range sub.Ports { lbPort, err := types.NewL4Addr(types.L4Type(port.Protocol), uint16(port.Port)) if err != nil { log.Errorf("Error while creating a new LB Port: %s", err) continue } newSvcEP.Ports[types.FEPortName(port.Name)] = lbPort } } d.loadBalancer.K8sMU.Lock() defer d.loadBalancer.K8sMU.Unlock() d.loadBalancer.K8sEndpoints[svcns] = newSvcEP d.syncLB(&svcns, nil, nil) }
func (d *Daemon) serviceAddFn(obj interface{}) { svc, ok := obj.(*v1.Service) if !ok { return } log.Debugf("Service %+v", svc) if svc.Spec.Type != v1.ServiceTypeClusterIP { log.Infof("Ignoring service %s/%s since its type is %s", svc.Namespace, svc.Name, svc.Spec.Type) return } svcns := types.K8sServiceNamespace{ Service: svc.Name, Namespace: svc.Namespace, } clusterIP := net.ParseIP(svc.Spec.ClusterIP) newSI := types.NewK8sServiceInfo(clusterIP) for _, port := range svc.Spec.Ports { p, err := types.NewFEPort(types.L4Type(port.Protocol), uint16(port.Port)) if err != nil { log.Errorf("Unable to add service port %v: %s", port, err) continue } if _, ok := newSI.Ports[types.FEPortName(port.Name)]; !ok { newSI.Ports[types.FEPortName(port.Name)] = p } } log.Debugf("Got new service %+v", newSI) d.loadBalancer.K8sMU.Lock() defer d.loadBalancer.K8sMU.Unlock() d.loadBalancer.K8sServices[svcns] = newSI d.syncLB(&svcns, nil, nil) }