service source uses externalIPs in ExternalName type if available

This commit is contained in:
Nandor Galambosi 2023-10-14 15:31:46 +02:00
parent d8f408b8a5
commit d7b0dfd781
3 changed files with 30 additions and 1 deletions

View File

@ -106,5 +106,6 @@ as one of the values.
### ExternalName ### ExternalName
Creates a target with the value of the Service's `externalName` field. 1. If the Service has one or more `spec.externalIPs`, uses the values in that field.
2. Otherwise, creates a target with the value of the Service's `externalName` field.

View File

@ -555,6 +555,9 @@ func extractServiceIps(svc *v1.Service) endpoint.Targets {
} }
func extractServiceExternalName(svc *v1.Service) endpoint.Targets { func extractServiceExternalName(svc *v1.Service) endpoint.Targets {
if len(svc.Spec.ExternalIPs) > 0 {
return svc.Spec.ExternalIPs
}
return endpoint.Targets{svc.Spec.ExternalName} return endpoint.Targets{svc.Spec.ExternalName}
} }

View File

@ -3545,6 +3545,7 @@ func TestExternalServices(t *testing.T) {
labels map[string]string labels map[string]string
annotations map[string]string annotations map[string]string
externalName string externalName string
externalIPs []string
expected []*endpoint.Endpoint expected []*endpoint.Endpoint
expectError bool expectError bool
}{ }{
@ -3562,6 +3563,7 @@ func TestExternalServices(t *testing.T) {
hostnameAnnotationKey: "service.example.org", hostnameAnnotationKey: "service.example.org",
}, },
"111.111.111.111", "111.111.111.111",
[]string{},
[]*endpoint.Endpoint{ []*endpoint.Endpoint{
{DNSName: "service.example.org", Targets: endpoint.Targets{"111.111.111.111"}, RecordType: endpoint.RecordTypeA}, {DNSName: "service.example.org", Targets: endpoint.Targets{"111.111.111.111"}, RecordType: endpoint.RecordTypeA},
}, },
@ -3581,6 +3583,7 @@ func TestExternalServices(t *testing.T) {
hostnameAnnotationKey: "service.example.org", hostnameAnnotationKey: "service.example.org",
}, },
"2001:db8::111", "2001:db8::111",
[]string{},
[]*endpoint.Endpoint{ []*endpoint.Endpoint{
{DNSName: "service.example.org", Targets: endpoint.Targets{"2001:db8::111"}, RecordType: endpoint.RecordTypeAAAA}, {DNSName: "service.example.org", Targets: endpoint.Targets{"2001:db8::111"}, RecordType: endpoint.RecordTypeAAAA},
}, },
@ -3600,11 +3603,32 @@ func TestExternalServices(t *testing.T) {
hostnameAnnotationKey: "service.example.org", hostnameAnnotationKey: "service.example.org",
}, },
"remote.example.com", "remote.example.com",
[]string{},
[]*endpoint.Endpoint{ []*endpoint.Endpoint{
{DNSName: "service.example.org", Targets: endpoint.Targets{"remote.example.com"}, RecordType: endpoint.RecordTypeCNAME}, {DNSName: "service.example.org", Targets: endpoint.Targets{"remote.example.com"}, RecordType: endpoint.RecordTypeCNAME},
}, },
false, false,
}, },
{
"annotated ExternalName service with externalIPs returns a single endpoint with multiple targets",
"",
"testing",
"foo",
v1.ServiceTypeExternalName,
"",
"",
false,
map[string]string{"component": "foo"},
map[string]string{
hostnameAnnotationKey: "service.example.org",
},
"service.example.org",
[]string{"10.2.3.4", "11.2.3.4"},
[]*endpoint.Endpoint{
{DNSName: "service.example.org", RecordType: endpoint.RecordTypeA, Targets: endpoint.Targets{"10.2.3.4", "11.2.3.4"}},
},
false,
},
} { } {
tc := tc tc := tc
t.Run(tc.title, func(t *testing.T) { t.Run(tc.title, func(t *testing.T) {
@ -3617,6 +3641,7 @@ func TestExternalServices(t *testing.T) {
Spec: v1.ServiceSpec{ Spec: v1.ServiceSpec{
Type: tc.svcType, Type: tc.svcType,
ExternalName: tc.externalName, ExternalName: tc.externalName,
ExternalIPs: tc.externalIPs,
}, },
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Namespace: tc.svcNamespace, Namespace: tc.svcNamespace,