func()

in pkg/resolvers/endpoints.go [452:482]


func (r *defaultEndpointsResolver) getMatchingServicePort(ctx context.Context, svc *corev1.Service, port *intstr.IntOrString, protocol corev1.Protocol) (int32, error) {
	if port == nil {
		return 0, errors.New("unable to lookup service listen port, input port is nil")
	}
	if portVal, err := k8s.LookupServiceListenPort(svc, *port, protocol); err == nil {
		return portVal, nil
	} else {
		r.logger.Info("Unable to lookup service port", "err", err)
	}
	// List pods matching the svc selector
	podSelector, err := metav1.LabelSelectorAsSelector(metav1.SetAsLabelSelector(svc.Spec.Selector))
	if err != nil {
		return 0, err
	}
	podList := &corev1.PodList{}
	if err := r.k8sClient.List(ctx, podList, &client.ListOptions{
		LabelSelector: podSelector,
		Namespace:     svc.Namespace,
	}); err != nil {
		r.logger.Info("Unable to List Pods", "err", err)
		return 0, err
	}
	for i := range podList.Items {
		if portVal, err := k8s.LookupListenPortFromPodSpec(svc, &podList.Items[i], *port, protocol); err == nil {
			return portVal, nil
		} else {
			r.logger.V(1).Info("The pod doesn't have port matched", "err", err, "pod", podList.Items[i])
		}
	}
	return 0, errors.Errorf("unable to find matching service listen port %s for service %s", port.String(), k8s.NamespacedName(svc))
}