diff --git a/controllers/refresolver/lbservice/lbservice.go b/controllers/refresolver/lbservice/lbservice.go index 7ae7c0d85e..a805697fd5 100644 --- a/controllers/refresolver/lbservice/lbservice.go +++ b/controllers/refresolver/lbservice/lbservice.go @@ -31,13 +31,13 @@ import ( "sigs.k8s.io/controller-runtime/pkg/log" ) -// ReferenceResolver resolves LoadBalancer service references +// ReferenceResolver resolves Kubernetes service references type ReferenceResolver struct { service *corev1.Service gslb *k8gbv1beta1.Gslb } -// NewReferenceResolver creates a new reference resolver for LoadBalancer services +// NewReferenceResolver creates a new reference resolver for Kubernetes services func NewReferenceResolver(gslb *k8gbv1beta1.Gslb, k8sClient client.Client) (*ReferenceResolver, error) { serviceList, err := getGslbServiceRef(gslb, k8sClient) if err != nil { @@ -50,11 +50,6 @@ func NewReferenceResolver(gslb *k8gbv1beta1.Gslb, k8sClient client.Client) (*Ref service := serviceList[0] - // Verify it's a LoadBalancer service - if service.Spec.Type != corev1.ServiceTypeLoadBalancer { - return nil, fmt.Errorf("service %s is not of type LoadBalancer", service.Name) - } - return &ReferenceResolver{ service: &service, gslb: gslb, @@ -94,25 +89,39 @@ func getGslbServiceRef(gslb *k8gbv1beta1.Gslb, k8sClient client.Client) ([]corev return nil, fmt.Errorf("unknown query mode %v", query.Mode) } -// GetServers retrieves the GSLB server configuration from the LoadBalancer service +// GetServers retrieves the GSLB server configuration from the service func (rr *ReferenceResolver) GetServers() ([]*k8gbv1beta1.Server, error) { - // For LoadBalancer services, the hostname must be explicitly specified via annotation + // For services, the hostname must be explicitly specified via annotation // since the service itself doesn't contain hostname information // Check for required hostname annotation hostname, ok := rr.gslb.Annotations[utils.HostnameAnnotation] if !ok { log.FromContext(context.TODO()).Error(fmt.Errorf("missing required hostname annotation"), - fmt.Sprintf("LoadBalancer service GSLB requires %s annotation", utils.HostnameAnnotation), + fmt.Sprintf("Service GSLB requires %s annotation", utils.HostnameAnnotation), "gslb", rr.gslb.Name) - return nil, fmt.Errorf("LoadBalancer service GSLB %s requires %s annotation", rr.gslb.Name, utils.HostnameAnnotation) + return nil, fmt.Errorf("Service GSLB %s requires %s annotation", rr.gslb.Name, utils.HostnameAnnotation) } if hostname == "" { log.FromContext(context.TODO()).Error(fmt.Errorf("empty hostname annotation"), fmt.Sprintf("%s annotation cannot be empty", utils.HostnameAnnotation), "gslb", rr.gslb.Name) - return nil, fmt.Errorf("LoadBalancer service GSLB %s has empty %s annotation", rr.gslb.Name, utils.HostnameAnnotation) + return nil, fmt.Errorf("Service GSLB %s has empty %s annotation", rr.gslb.Name, utils.HostnameAnnotation) + } + + // For non-LoadBalancer services, the exposed IPs must be explicitly specified via annotation + // since only LoadBalancer services have external IPs in their status + + // Check for required exposed ip annotation + if rr.service.Spec.Type != corev1.ServiceTypeLoadBalancer { + _, ok := rr.gslb.Annotations[utils.ExternalIPsAnnotation] + if !ok { + log.FromContext(context.TODO()).Error(fmt.Errorf("missing required exposed ip annotation"), + fmt.Sprintf("%s service GSLB requires %s annotation", rr.service.Spec.Type, utils.ExternalIPsAnnotation), + "gslb", rr.gslb.Name) + return nil, fmt.Errorf("%s service GSLB %s requires %s annotation", rr.service.Spec.Type, rr.gslb.Name, utils.ExternalIPsAnnotation) + } } // Create server with the specified hostname @@ -133,7 +142,7 @@ func (rr *ReferenceResolver) GetServers() ([]*k8gbv1beta1.Server, error) { return []*k8gbv1beta1.Server{server}, nil } -// GetGslbExposedIPs retrieves the load balancer IP address of the GSLB +// GetGslbExposedIPs retrieves the exposed IP addresses of the GSLB func (rr *ReferenceResolver) GetGslbExposedIPs(gslbAnnotations map[string]string, parentZoneDNSServers utils.DNSList) ([]string, error) { // Check for explicit IP addresses in annotations first if serviceIPsFromAnnotation, ok := gslbAnnotations[utils.ExternalIPsAnnotation]; ok {