func()

in pkg/controller/pvtz/actuator.go [104:191]


func (a *Actuator) desiredAandAAAA(svc *corev1.Service) ([]*model.PvtzEndpoint, error) {
	var ipsV4 []string
	var ipsV6 []string

	switch svc.Spec.Type {
	case corev1.ServiceTypeLoadBalancer:
		for _, ingress := range svc.Status.LoadBalancer.Ingress {
			if IsIPv4(ingress.IP) {
				ipsV4 = append(ipsV4, ingress.IP)
			} else if IsIPv6(ingress.IP) {
				ipsV6 = append(ipsV6, ingress.IP)
			} else {
				return nil, fmt.Errorf("ingress ip %s is invalid", ingress.IP)
			}
		}
	case corev1.ServiceTypeClusterIP:
		if svc.Spec.ClusterIP == corev1.ClusterIPNone {
			rawEps, err := a.getEndpoints(types.NamespacedName{Namespace: svc.Namespace, Name: svc.Name})
			if err != nil {
				return nil, fmt.Errorf("getting endpoints error: %s", err)
			}
			for _, rawSubnet := range rawEps.Subsets {
				for _, addr := range rawSubnet.Addresses {
					if IsIPv4(addr.IP) {
						ipsV4 = append(ipsV4, addr.IP)
					} else if IsIPv6(addr.IP) {
						ipsV6 = append(ipsV6, addr.IP)
					} else {
						return nil, fmt.Errorf("pod ip %s is invalid", addr.IP)
					}
				}
			}
		} else {
			ips := append(svc.Spec.ClusterIPs, svc.Spec.ClusterIP)
			for _, ip := range ips {
				if IsIPv4(ip) {
					ipsV4 = append(ipsV4, ip)
				} else if IsIPv6(ip) {
					ipsV6 = append(ipsV6, ip)
				} else {
					return nil, fmt.Errorf("cluster ip %s is invalid", ip)
				}
			}
		}
	case corev1.ServiceTypeNodePort:
		ips := append(svc.Spec.ClusterIPs, svc.Spec.ClusterIP)
		for _, ip := range ips {
			if IsIPv4(ip) {
				ipsV4 = append(ipsV4, ip)
			} else if IsIPv6(ip) {
				ipsV6 = append(ipsV6, ip)
			} else {
				return nil, fmt.Errorf("cluster ip %s is invalid", ip)
			}
		}
	case corev1.ServiceTypeExternalName:
		if ip := net.ParseIP(svc.Spec.ExternalName); ip != nil {
			if IsIPv4(ip.String()) {
				ipsV4 = append(ipsV4, svc.Spec.ExternalName)
			} else {
				ipsV6 = append(ipsV6, svc.Spec.ExternalName)
			}
		}
	}
	var eps []*model.PvtzEndpoint

	epTemplate := model.NewPvtzEndpointBuilder()
	epTemplate.WithRr(serviceRr(svc))
	epTemplate.WithTtl(ctrlCfg.CloudCFG.Global.PrivateZoneRecordTTL)

	if len(ipsV4) != 0 {
		epb := epTemplate.DeepCopy()
		epb.WithType(model.RecordTypeA)
		for _, ip := range ipsV4 {
			epb.WithValueData(ip)
		}
		eps = append(eps, epb.Build())
	}
	if len(ipsV6) != 0 {
		epb := epTemplate.DeepCopy()
		epb.WithType(model.RecordTypeAAAA)
		for _, ip := range ipsV6 {
			epb.WithValueData(ip)
		}
		eps = append(eps, epb.Build())
	}
	return eps, nil
}