source/service.go
func (sc *serviceSource) Endpoints() ([]*endpoint.Endpoint, error) {
	services, err := sc.serviceInformer.Lister().Services(sc.namespace).List(labels.Everything())
	if err != nil {
		return nil, err
	}
	services, err = sc.filterByAnnotations(services)
	if err != nil {
		return nil, err
	}

	// filter on service types if at least one has been provided
	if len(sc.serviceTypeFilter) > 0 {
		services = sc.filterByServiceType(services)
	}

	// get the ip addresses of all the nodes and cache them for this run
	nodeTargets, err := sc.extractNodeTargets()
	if err != nil {
		return nil, err
	}

	endpoints := []*endpoint.Endpoint{}

	for _, svc := range services {
		// Check controller annotation to see if we are responsible.
		controller, ok := svc.Annotations[controllerAnnotationKey]
		if ok && controller != controllerAnnotationValue {
			log.Debugf("Skipping service %s/%s because controller value does not match, found: %s, required: %s",
				svc.Namespace, svc.Name, controller, controllerAnnotationValue)
			continue
		}

		svcEndpoints := sc.endpoints(svc, nodeTargets)

		// process legacy annotations if no endpoints were returned and compatibility mode is enabled.
		if len(svcEndpoints) == 0 && sc.compatibility != "" {
			svcEndpoints = legacyEndpointsFromService(svc, sc.compatibility)
		}

		// apply template if none of the above is found
		if (sc.combineFQDNAnnotation || len(svcEndpoints) == 0) && sc.fqdnTemplate != nil {
			sEndpoints, err := sc.endpointsFromTemplate(svc, nodeTargets)
			if err != nil {
				return nil, err
			}

			if sc.combineFQDNAnnotation {
				svcEndpoints = append(svcEndpoints, sEndpoints...)
			} else {
				svcEndpoints = sEndpoints
			}
		}

		if len(svcEndpoints) == 0 {
			log.Debugf("No endpoints could be generated from service %s/%s", svc.Namespace, svc.Name)
			continue
		}

		log.Debugf("Endpoints generated from service: %s/%s: %v", svc.Namespace, svc.Name, svcEndpoints)
		sc.setResourceLabel(svc, svcEndpoints)
		endpoints = append(endpoints, svcEndpoints...)
	}

	for _, ep := range endpoints {
		sort.Sort(ep.Targets)
	}

	return endpoints, nil
}
func (sc *serviceSource) Endpoints() ([]*endpoint.Endpoint, error) {
	services, err := sc.serviceInformer.Lister().Services(sc.namespace).List(labels.Everything())
	if err != nil {
		return nil, err
	}
	services, err = sc.filterByAnnotations(services)
	if err != nil {
		return nil, err
	}

	// filter on service types if at least one has been provided
	if len(sc.serviceTypeFilter) > 0 {
		services = sc.filterByServiceType(services)
	}

	// get the ip addresses of all the nodes and cache them for this run
	nodeTargets, err := sc.extractNodeTargets()
	if err != nil {
		return nil, err
	}

	endpoints := []*endpoint.Endpoint{}

	for _, svc := range services {
		// Check controller annotation to see if we are responsible.
		controller, ok := svc.Annotations[controllerAnnotationKey]
		if ok && controller != controllerAnnotationValue {
			log.Debugf("Skipping service %s/%s because controller value does not match, found: %s, required: %s",
				svc.Namespace, svc.Name, controller, controllerAnnotationValue)
			continue
		}

		svcEndpoints := sc.endpoints(svc, nodeTargets)

		// process legacy annotations if no endpoints were returned and compatibility mode is enabled.
		if len(svcEndpoints) == 0 && sc.compatibility != "" {
			svcEndpoints = legacyEndpointsFromService(svc, sc.compatibility)
		}

		// apply template if none of the above is found
		if (sc.combineFQDNAnnotation || len(svcEndpoints) == 0) && sc.fqdnTemplate != nil {
			sEndpoints, err := sc.endpointsFromTemplate(svc, nodeTargets)
			if err != nil {
				return nil, err
			}

			if sc.combineFQDNAnnotation {
				svcEndpoints = append(svcEndpoints, sEndpoints...)
			} else {
				svcEndpoints = sEndpoints
			}
		}

		if len(svcEndpoints) == 0 {
			log.Debugf("No endpoints could be generated from service %s/%s", svc.Namespace, svc.Name)
			continue
		}

		log.Debugf("Endpoints generated from service: %s/%s: %v", svc.Namespace, svc.Name, svcEndpoints)
		sc.setResourceLabel(svc, svcEndpoints)
		endpoints = append(endpoints, svcEndpoints...)
	}

	for _, ep := range endpoints {
		sort.Sort(ep.Targets)
	}

	return endpoints, nil
}
func ( sc * serviceSource ) Endpoints ( ) ( [ ] * endpoint . Endpoint , error ) { services , err := sc . serviceInformer . Lister ( ) . Services ( sc . namespace ) . List ( labels . Everything ( ) ) if err != nil { return nil , err } services , err = sc . filterByAnnotations ( services ) if err != nil { return nil , err } // filter on service types if at least one has been provided if len ( sc . serviceTypeFilter ) > 0 { services = sc . filterByServiceType ( services ) } // get the ip addresses of all the nodes and cache them for this run nodeTargets , err := sc . extractNodeTargets ( ) if err != nil { return nil , err } endpoints := [ ] * endpoint . Endpoint { } for _ , svc := range services { // Check controller annotation to see if we are responsible. controller , ok := svc . Annotations [ controllerAnnotationKey ] if ok && controller != controllerAnnotationValue { log . Debugf ( " " , svc . Namespace , svc . Name , controller , controllerAnnotationValue ) continue } svcEndpoints := sc . endpoints ( svc , nodeTargets ) // process legacy annotations if no endpoints were returned and compatibility mode is enabled. if len ( svcEndpoints ) == 0 && sc . compatibility != " " { svcEndpoints = legacyEndpointsFromService ( svc , sc . compatibility ) } // apply template if none of the above is found if ( sc . combineFQDNAnnotation || len ( svcEndpoints ) == 0 ) && sc . fqdnTemplate != nil { sEndpoints , err := sc . endpointsFromTemplate ( svc , nodeTargets ) if err != nil { return nil , err } if sc . combineFQDNAnnotation { svcEndpoints = append ( svcEndpoints , sEndpoints ... ) } else { svcEndpoints = sEndpoints } } if len ( svcEndpoints ) == 0 { log . Debugf ( " " , svc . Namespace , svc . Name ) continue } log . Debugf ( " " , svc . Namespace , svc . Name , svcEndpoints ) sc . setResourceLabel ( svc , svcEndpoints ) endpoints = append ( endpoints , svcEndpoints ... ) } for _ , ep := range endpoints { sort . Sort ( ep . Targets ) } return endpoints , nil }
// Endpoints returns endpoint objects for each service that should be processed.
Endpoints returns endpoint objects for each service that should be processed .