func()

in pkg/providers/translation/service.go [52:115]


func (t *translator) translateUpstreamV2(ep *kube.Endpoint, namespace, name, subset string, port int32) (*apisixv1.Upstream, error) {
	au, err := t.ApisixUpstreamLister.V2(namespace, name)
	ups := apisixv1.NewDefaultUpstream()
	if err != nil {
		if k8serrors.IsNotFound(err) {
			// If subset in ApisixRoute is not empty but the ApisixUpstream resource not found,
			// just set an empty node list.
			if subset != "" {
				ups.Nodes = apisixv1.UpstreamNodes{}
				return ups, nil
			}
		} else {
			return nil, &TranslateError{
				Field:  "ApisixUpstream",
				Reason: err.Error(),
			}
		}
	}
	var (
		subsets           []v2.ApisixUpstreamSubset
		upsCfg            *v2.ApisixUpstreamConfig
		portLevelSettings []v2.PortLevelSettings
	)
	if au != nil && au.V2().Spec != nil {
		if !utils.MatchCRDsIngressClass(au.V2().Spec.IngressClassName, t.IngressClassName) {
			au = nil
		} else {
			subsets = au.V2().Spec.Subsets
			upsCfg = &au.V2().Spec.ApisixUpstreamConfig
			portLevelSettings = au.V2().Spec.PortLevelSettings
		}
	}
	var labels types.Labels
	if subset != "" {
		for _, ss := range subsets {
			if ss.Name == subset {
				labels = ss.Labels
				break
			}
		}
	}
	// Filter nodes by subset.
	nodes, err := t.TranslateEndpoint(*ep, port, labels)
	if err != nil {
		return nil, err
	}
	if au == nil || au.V2().Spec == nil {
		ups.Nodes = nodes
		return ups, nil
	}

	for _, pls := range portLevelSettings {
		if pls.Port == port {
			upsCfg = &pls.ApisixUpstreamConfig
			break
		}
	}
	ups, err = t.TranslateUpstreamConfigV2(upsCfg)
	if err != nil {
		return nil, err
	}
	ups.Nodes = nodes
	return ups, nil
}