func()

in pkg/appgw/health_probes.go [220:285]


func (c *appGwConfigBuilder) getProbeForServiceContainer(service *v1.Service, backendID backendIdentifier) *v1.Probe {
	// find all the target ports used by the service
	allPorts := make(map[int32]interface{})
	for _, sp := range service.Spec.Ports {
		if sp.Protocol != v1.ProtocolTCP {
			continue
		}

		if backendID.Backend.Service != nil && (fmt.Sprint(sp.Port) == serviceBackendPortToStr(backendID.Backend.Service.Port) ||
			sp.Name == serviceBackendPortToStr(backendID.Backend.Service.Port) ||
			sp.TargetPort.String() == serviceBackendPortToStr(backendID.Backend.Service.Port)) {

			// Matched a service port in the service
			if sp.TargetPort.String() == "" {
				allPorts[sp.Port] = nil
			} else if sp.TargetPort.Type == intstr.Int {
				// port is defined as port number
				allPorts[sp.TargetPort.IntVal] = nil
			} else {
				for targetPort := range c.resolvePortName(sp.Name, &backendID) {
					allPorts[targetPort] = nil
				}
			}
		}
	}

	podList := c.k8sContext.ListPodsByServiceSelector(service)

	if len(podList) == 0 {
		return nil
	}

	// use the target port to figure out the container and use it's readiness/liveness probe
	for _, container := range podList[0].Spec.Containers {
		for _, port := range container.Ports {
			if _, ok := allPorts[port.ContainerPort]; !ok {
				continue
			}

			// found the container
			var probe *v1.Probe
			if container.ReadinessProbe != nil && container.ReadinessProbe.HTTPGet != nil {
				probe = container.ReadinessProbe
			} else if container.LivenessProbe != nil && container.LivenessProbe.HTTPGet != nil {
				probe = container.LivenessProbe
			}

			// if probe port is named, resolve it by going through container port and set it in the probe itself
			if probe != nil && probe.HTTPGet.Port.String() != "" && probe.HTTPGet.Port.Type == intstr.String {
				for _, port := range container.Ports {
					if port.Name == probe.HTTPGet.Port.StrVal {
						probe.HTTPGet.Port = intstr.IntOrString{
							Type:   intstr.Int,
							IntVal: port.ContainerPort,
						}
						break
					}
				}
			}

			return probe
		}
	}

	return nil
}