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
}