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
}