in pkg/providers/apisix/translation/apisix_upstream.go [59:121]
func (t *translator) TranslateApisixUpstreamExternalNodes(au *v2.ApisixUpstream) ([]apisixv1.UpstreamNode, error) {
var nodes []apisixv1.UpstreamNode
for i, node := range au.Spec.ExternalNodes {
if node.Type == v2.ExternalTypeDomain {
weight := translation.DefaultWeight
if node.Weight != nil {
weight = *node.Weight
}
if !utils.MatchHostDef(node.Name) {
return nil, fmt.Errorf("ApisixUpstream %s/%s ExternalNodes[%v]'s name %s as Domain must match lowercase RFC 1123 subdomain. "+
"a lowercase RFC 1123 subdomain must consist of lower case alphanumeric characters, '-' or '.', and must start and end with an alphanumeric character",
au.Namespace, au.Name, i, node.Name)
}
n := apisixv1.UpstreamNode{
Host: node.Name,
Weight: weight,
}
if node.Port != nil {
n.Port = *node.Port
} else {
n.Port = utils.SchemeToPort(au.Spec.Scheme)
}
nodes = append(nodes, n)
} else if node.Type == v2.ExternalTypeService {
svc, err := t.ServiceLister.Services(au.Namespace).Get(node.Name)
if err != nil {
// In theory, ApisixRoute now watches all service add event, a not found error is already handled
if k8serrors.IsNotFound(err) {
// TODO: Should retry
return nil, err
}
return nil, err
}
if svc.Spec.Type != corev1.ServiceTypeExternalName {
return nil, fmt.Errorf("ApisixUpstream %s/%s ExternalNodes[%v] must refers to a ExternalName service: %s", au.Namespace, au.Name, i, node.Name)
}
weight := translation.DefaultWeight
if node.Weight != nil {
weight = *node.Weight
}
n := apisixv1.UpstreamNode{
Host: svc.Spec.ExternalName,
Weight: weight,
}
if node.Port != nil {
n.Port = *node.Port
} else {
n.Port = utils.SchemeToPort(au.Spec.Scheme)
}
nodes = append(nodes, n)
}
}
return nodes, nil
}