code: func (sc *ingressSource) Endpoints() ([]*endpoint.Endpoint, error) {
  	ingresses, err := sc.ingressInformer.Lister().Ingresses(sc.namespace).List(labels.Everything())
  	if err != nil {
  		return nil, err
  	}
  	ingresses, err = sc.filterByAnnotations(ingresses)
  	if err != nil {
  		return nil, err
  	}
  
  	endpoints := []*endpoint.Endpoint{}
  
  	for _, ing := range ingresses {
  		// Check controller annotation to see if we are responsible.
  		controller, ok := ing.Annotations[controllerAnnotationKey]
  		if ok && controller != controllerAnnotationValue {
  			log.Debugf("Skipping ingress %s/%s because controller value does not match, found: %s, required: %s",
  				ing.Namespace, ing.Name, controller, controllerAnnotationValue)
  			continue
  		}
  
  		ingEndpoints := endpointsFromIngress(ing, sc.ignoreHostnameAnnotation)
  
  		// apply template if host is missing on ingress
  		if (sc.combineFQDNAnnotation || len(ingEndpoints) == 0) && sc.fqdnTemplate != nil {
  			iEndpoints, err := sc.endpointsFromTemplate(ing)
  			if err != nil {
  				return nil, err
  			}
  
  			if sc.combineFQDNAnnotation {
  				ingEndpoints = append(ingEndpoints, iEndpoints...)
  			} else {
  				ingEndpoints = iEndpoints
  			}
  		}
  
  		if len(ingEndpoints) == 0 {
  			log.Debugf("No endpoints could be generated from ingress %s/%s", ing.Namespace, ing.Name)
  			continue
  		}
  
  		log.Debugf("Endpoints generated from ingress: %s/%s: %v", ing.Namespace, ing.Name, ingEndpoints)
  		sc.setResourceLabel(ing, ingEndpoints)
  		endpoints = append(endpoints, ingEndpoints...)
  	}
  
  	for _, ep := range endpoints {
  		sort.Sort(ep.Targets)
  	}
  
  	return endpoints, nil
  }
docs: // Endpoints returns endpoint objects for each host-target combination that should be processed.
  // Retrieves all ingress resources on all namespaces