Skip to content
Draft
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 22 additions & 13 deletions controllers/refresolver/lbservice/lbservice.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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,
Expand Down Expand Up @@ -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
Expand All @@ -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 {
Expand Down
Loading