func()

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
}