mirror of
https://github.com/kubernetes-sigs/external-dns.git
synced 2025-08-06 17:46:57 +02:00
Merge pull request #3600 from johngmyers/ipv6-headless
Support AAAA records from headless services
This commit is contained in:
commit
fd501ddd7c
@ -271,7 +271,7 @@ func (sc *serviceSource) extractHeadlessEndpoints(svc *v1.Service, hostname stri
|
|||||||
|
|
||||||
endpointsType := getEndpointsTypeFromAnnotations(svc.Annotations)
|
endpointsType := getEndpointsTypeFromAnnotations(svc.Annotations)
|
||||||
|
|
||||||
targetsByHeadlessDomain := make(map[string]endpoint.Targets)
|
targetsByHeadlessDomainAndType := make(map[endpointKey]endpoint.Targets)
|
||||||
for _, subset := range endpointsObject.Subsets {
|
for _, subset := range endpointsObject.Subsets {
|
||||||
addresses := subset.Addresses
|
addresses := subset.Addresses
|
||||||
if svc.Spec.PublishNotReadyAddresses || sc.alwaysPublishNotReadyAddresses {
|
if svc.Spec.PublishNotReadyAddresses || sc.alwaysPublishNotReadyAddresses {
|
||||||
@ -324,18 +324,29 @@ func (sc *serviceSource) extractHeadlessEndpoints(svc *v1.Service, hostname stri
|
|||||||
log.Debugf("Generating matching endpoint %s with EndpointAddress IP %s", headlessDomain, address.IP)
|
log.Debugf("Generating matching endpoint %s with EndpointAddress IP %s", headlessDomain, address.IP)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
targetsByHeadlessDomain[headlessDomain] = append(targetsByHeadlessDomain[headlessDomain], targets...)
|
for _, target := range targets {
|
||||||
|
key := endpointKey{
|
||||||
|
dnsName: headlessDomain,
|
||||||
|
recordType: suitableType(target),
|
||||||
|
}
|
||||||
|
targetsByHeadlessDomainAndType[key] = append(targetsByHeadlessDomainAndType[key], target)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
headlessDomains := []string{}
|
headlessKeys := []endpointKey{}
|
||||||
for headlessDomain := range targetsByHeadlessDomain {
|
for headlessKey := range targetsByHeadlessDomainAndType {
|
||||||
headlessDomains = append(headlessDomains, headlessDomain)
|
headlessKeys = append(headlessKeys, headlessKey)
|
||||||
}
|
}
|
||||||
sort.Strings(headlessDomains)
|
sort.Slice(headlessKeys, func(i, j int) bool {
|
||||||
for _, headlessDomain := range headlessDomains {
|
if headlessKeys[i].dnsName != headlessKeys[j].dnsName {
|
||||||
allTargets := targetsByHeadlessDomain[headlessDomain]
|
return headlessKeys[i].dnsName < headlessKeys[j].dnsName
|
||||||
|
}
|
||||||
|
return headlessKeys[i].recordType < headlessKeys[j].recordType
|
||||||
|
})
|
||||||
|
for _, headlessKey := range headlessKeys {
|
||||||
|
allTargets := targetsByHeadlessDomainAndType[headlessKey]
|
||||||
targets := []string{}
|
targets := []string{}
|
||||||
|
|
||||||
deduppedTargets := map[string]struct{}{}
|
deduppedTargets := map[string]struct{}{}
|
||||||
@ -350,9 +361,9 @@ func (sc *serviceSource) extractHeadlessEndpoints(svc *v1.Service, hostname stri
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ttl.IsConfigured() {
|
if ttl.IsConfigured() {
|
||||||
endpoints = append(endpoints, endpoint.NewEndpointWithTTL(headlessDomain, endpoint.RecordTypeA, ttl, targets...))
|
endpoints = append(endpoints, endpoint.NewEndpointWithTTL(headlessKey.dnsName, headlessKey.recordType, ttl, targets...))
|
||||||
} else {
|
} else {
|
||||||
endpoints = append(endpoints, endpoint.NewEndpoint(headlessDomain, endpoint.RecordTypeA, targets...))
|
endpoints = append(endpoints, endpoint.NewEndpoint(headlessKey.dnsName, headlessKey.recordType, targets...))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2244,7 +2244,7 @@ func TestHeadlessServices(t *testing.T) {
|
|||||||
expectError bool
|
expectError bool
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
"annotated Headless services return endpoints for each selected Pod",
|
"annotated Headless services return IPv4 endpoints for each selected Pod",
|
||||||
"",
|
"",
|
||||||
"testing",
|
"testing",
|
||||||
"foo",
|
"foo",
|
||||||
@ -2276,6 +2276,39 @@ func TestHeadlessServices(t *testing.T) {
|
|||||||
},
|
},
|
||||||
false,
|
false,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"annotated Headless services return IPv6 endpoints for each selected Pod",
|
||||||
|
"",
|
||||||
|
"testing",
|
||||||
|
"foo",
|
||||||
|
v1.ServiceTypeClusterIP,
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
false,
|
||||||
|
map[string]string{"component": "foo"},
|
||||||
|
map[string]string{
|
||||||
|
hostnameAnnotationKey: "service.example.org",
|
||||||
|
},
|
||||||
|
map[string]string{},
|
||||||
|
v1.ClusterIPNone,
|
||||||
|
[]string{"2001:db8::1", "2001:db8::2"},
|
||||||
|
[]string{"", ""},
|
||||||
|
map[string]string{
|
||||||
|
"component": "foo",
|
||||||
|
},
|
||||||
|
[]string{},
|
||||||
|
[]string{"foo-0", "foo-1"},
|
||||||
|
[]string{"foo-0", "foo-1"},
|
||||||
|
[]bool{true, true},
|
||||||
|
false,
|
||||||
|
[]v1.Node{},
|
||||||
|
[]*endpoint.Endpoint{
|
||||||
|
{DNSName: "foo-0.service.example.org", RecordType: endpoint.RecordTypeAAAA, Targets: endpoint.Targets{"2001:db8::1"}},
|
||||||
|
{DNSName: "foo-1.service.example.org", RecordType: endpoint.RecordTypeAAAA, Targets: endpoint.Targets{"2001:db8::2"}},
|
||||||
|
{DNSName: "service.example.org", RecordType: endpoint.RecordTypeAAAA, Targets: endpoint.Targets{"2001:db8::1", "2001:db8::2"}},
|
||||||
|
},
|
||||||
|
false,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"hostname annotated Headless services are ignored",
|
"hostname annotated Headless services are ignored",
|
||||||
"",
|
"",
|
||||||
@ -2306,7 +2339,7 @@ func TestHeadlessServices(t *testing.T) {
|
|||||||
false,
|
false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"annotated Headless services return endpoints with TTL for each selected Pod",
|
"annotated Headless services return IPv4 endpoints with TTL for each selected Pod",
|
||||||
"",
|
"",
|
||||||
"testing",
|
"testing",
|
||||||
"foo",
|
"foo",
|
||||||
@ -2339,6 +2372,40 @@ func TestHeadlessServices(t *testing.T) {
|
|||||||
},
|
},
|
||||||
false,
|
false,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"annotated Headless services return IPv6 endpoints with TTL for each selected Pod",
|
||||||
|
"",
|
||||||
|
"testing",
|
||||||
|
"foo",
|
||||||
|
v1.ServiceTypeClusterIP,
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
false,
|
||||||
|
map[string]string{"component": "foo"},
|
||||||
|
map[string]string{
|
||||||
|
hostnameAnnotationKey: "service.example.org",
|
||||||
|
ttlAnnotationKey: "1",
|
||||||
|
},
|
||||||
|
map[string]string{},
|
||||||
|
v1.ClusterIPNone,
|
||||||
|
[]string{"2001:db8::1", "2001:db8::2"},
|
||||||
|
[]string{"", ""},
|
||||||
|
map[string]string{
|
||||||
|
"component": "foo",
|
||||||
|
},
|
||||||
|
[]string{},
|
||||||
|
[]string{"foo-0", "foo-1"},
|
||||||
|
[]string{"foo-0", "foo-1"},
|
||||||
|
[]bool{true, true},
|
||||||
|
false,
|
||||||
|
[]v1.Node{},
|
||||||
|
[]*endpoint.Endpoint{
|
||||||
|
{DNSName: "foo-0.service.example.org", RecordType: endpoint.RecordTypeAAAA, Targets: endpoint.Targets{"2001:db8::1"}, RecordTTL: endpoint.TTL(1)},
|
||||||
|
{DNSName: "foo-1.service.example.org", RecordType: endpoint.RecordTypeAAAA, Targets: endpoint.Targets{"2001:db8::2"}, RecordTTL: endpoint.TTL(1)},
|
||||||
|
{DNSName: "service.example.org", RecordType: endpoint.RecordTypeAAAA, Targets: endpoint.Targets{"2001:db8::1", "2001:db8::2"}, RecordTTL: endpoint.TTL(1)},
|
||||||
|
},
|
||||||
|
false,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"annotated Headless services return endpoints for each selected Pod, which are in running state",
|
"annotated Headless services return endpoints for each selected Pod, which are in running state",
|
||||||
"",
|
"",
|
||||||
@ -2436,7 +2503,7 @@ func TestHeadlessServices(t *testing.T) {
|
|||||||
false,
|
false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"annotated Headless services return only a unique set of targets",
|
"annotated Headless services return only a unique set of IPv4 targets",
|
||||||
"",
|
"",
|
||||||
"testing",
|
"testing",
|
||||||
"foo",
|
"foo",
|
||||||
@ -2467,7 +2534,38 @@ func TestHeadlessServices(t *testing.T) {
|
|||||||
false,
|
false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"annotated Headless services return targets from pod annotation",
|
"annotated Headless services return only a unique set of IPv6 targets",
|
||||||
|
"",
|
||||||
|
"testing",
|
||||||
|
"foo",
|
||||||
|
v1.ServiceTypeClusterIP,
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
false,
|
||||||
|
map[string]string{"component": "foo"},
|
||||||
|
map[string]string{
|
||||||
|
hostnameAnnotationKey: "service.example.org",
|
||||||
|
},
|
||||||
|
map[string]string{},
|
||||||
|
v1.ClusterIPNone,
|
||||||
|
[]string{"2001:db8::1", "2001:db8::1", "2001:db8::2"},
|
||||||
|
[]string{"", "", ""},
|
||||||
|
map[string]string{
|
||||||
|
"component": "foo",
|
||||||
|
},
|
||||||
|
[]string{},
|
||||||
|
[]string{"foo-0", "foo-1", "foo-3"},
|
||||||
|
[]string{"", "", ""},
|
||||||
|
[]bool{true, true, true},
|
||||||
|
false,
|
||||||
|
[]v1.Node{},
|
||||||
|
[]*endpoint.Endpoint{
|
||||||
|
{DNSName: "service.example.org", RecordType: endpoint.RecordTypeAAAA, Targets: endpoint.Targets{"2001:db8::1", "2001:db8::2"}},
|
||||||
|
},
|
||||||
|
false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"annotated Headless services return IPv4 targets from pod annotation",
|
||||||
"",
|
"",
|
||||||
"testing",
|
"testing",
|
||||||
"foo",
|
"foo",
|
||||||
@ -2500,7 +2598,40 @@ func TestHeadlessServices(t *testing.T) {
|
|||||||
false,
|
false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"annotated Headless services return targets from node external IP if endpoints-type annotation is set",
|
"annotated Headless services return IPv6 targets from pod annotation",
|
||||||
|
"",
|
||||||
|
"testing",
|
||||||
|
"foo",
|
||||||
|
v1.ServiceTypeClusterIP,
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
false,
|
||||||
|
map[string]string{"component": "foo"},
|
||||||
|
map[string]string{
|
||||||
|
hostnameAnnotationKey: "service.example.org",
|
||||||
|
},
|
||||||
|
map[string]string{
|
||||||
|
targetAnnotationKey: "2001:db8::4",
|
||||||
|
},
|
||||||
|
v1.ClusterIPNone,
|
||||||
|
[]string{"2001:db8::1"},
|
||||||
|
[]string{""},
|
||||||
|
map[string]string{
|
||||||
|
"component": "foo",
|
||||||
|
},
|
||||||
|
[]string{},
|
||||||
|
[]string{"foo"},
|
||||||
|
[]string{"", "", ""},
|
||||||
|
[]bool{true, true, true},
|
||||||
|
false,
|
||||||
|
[]v1.Node{},
|
||||||
|
[]*endpoint.Endpoint{
|
||||||
|
{DNSName: "service.example.org", RecordType: endpoint.RecordTypeAAAA, Targets: endpoint.Targets{"2001:db8::4"}},
|
||||||
|
},
|
||||||
|
false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"annotated Headless services return IPv4 targets from node external IP if endpoints-type annotation is set",
|
||||||
"",
|
"",
|
||||||
"testing",
|
"testing",
|
||||||
"foo",
|
"foo",
|
||||||
@ -2543,7 +2674,98 @@ func TestHeadlessServices(t *testing.T) {
|
|||||||
false,
|
false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"annotated Headless services return targets from hostIP if endpoints-type annotation is set",
|
"annotated Headless services return IPv6 targets from node external IP if endpoints-type annotation is set",
|
||||||
|
"",
|
||||||
|
"testing",
|
||||||
|
"foo",
|
||||||
|
v1.ServiceTypeClusterIP,
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
false,
|
||||||
|
map[string]string{"component": "foo"},
|
||||||
|
map[string]string{
|
||||||
|
hostnameAnnotationKey: "service.example.org",
|
||||||
|
endpointsTypeAnnotationKey: EndpointsTypeNodeExternalIP,
|
||||||
|
},
|
||||||
|
map[string]string{},
|
||||||
|
v1.ClusterIPNone,
|
||||||
|
[]string{"2001:db8::1"},
|
||||||
|
[]string{""},
|
||||||
|
map[string]string{
|
||||||
|
"component": "foo",
|
||||||
|
},
|
||||||
|
[]string{},
|
||||||
|
[]string{"foo"},
|
||||||
|
[]string{"", "", ""},
|
||||||
|
[]bool{true, true, true},
|
||||||
|
false,
|
||||||
|
[]v1.Node{
|
||||||
|
{
|
||||||
|
Status: v1.NodeStatus{
|
||||||
|
Addresses: []v1.NodeAddress{
|
||||||
|
{
|
||||||
|
Type: v1.NodeInternalIP,
|
||||||
|
Address: "2001:db8::4",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
[]*endpoint.Endpoint{
|
||||||
|
{DNSName: "service.example.org", RecordType: endpoint.RecordTypeAAAA, Targets: endpoint.Targets{"2001:db8::4"}},
|
||||||
|
},
|
||||||
|
false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"annotated Headless services return dual-stack targets from node external IP if endpoints-type annotation is set",
|
||||||
|
"",
|
||||||
|
"testing",
|
||||||
|
"foo",
|
||||||
|
v1.ServiceTypeClusterIP,
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
false,
|
||||||
|
map[string]string{"component": "foo"},
|
||||||
|
map[string]string{
|
||||||
|
hostnameAnnotationKey: "service.example.org",
|
||||||
|
endpointsTypeAnnotationKey: EndpointsTypeNodeExternalIP,
|
||||||
|
},
|
||||||
|
map[string]string{},
|
||||||
|
v1.ClusterIPNone,
|
||||||
|
[]string{"1.1.1.1"},
|
||||||
|
[]string{""},
|
||||||
|
map[string]string{
|
||||||
|
"component": "foo",
|
||||||
|
},
|
||||||
|
[]string{},
|
||||||
|
[]string{"foo"},
|
||||||
|
[]string{"", "", ""},
|
||||||
|
[]bool{true, true, true},
|
||||||
|
false,
|
||||||
|
[]v1.Node{
|
||||||
|
{
|
||||||
|
Status: v1.NodeStatus{
|
||||||
|
Addresses: []v1.NodeAddress{
|
||||||
|
{
|
||||||
|
Type: v1.NodeExternalIP,
|
||||||
|
Address: "1.2.3.4",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Type: v1.NodeInternalIP,
|
||||||
|
Address: "2001:db8::4",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
[]*endpoint.Endpoint{
|
||||||
|
{DNSName: "service.example.org", RecordType: endpoint.RecordTypeA, Targets: endpoint.Targets{"1.2.3.4"}},
|
||||||
|
{DNSName: "service.example.org", RecordType: endpoint.RecordTypeAAAA, Targets: endpoint.Targets{"2001:db8::4"}},
|
||||||
|
},
|
||||||
|
false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"annotated Headless services return IPv4 targets from hostIP if endpoints-type annotation is set",
|
||||||
"",
|
"",
|
||||||
"testing",
|
"testing",
|
||||||
"foo",
|
"foo",
|
||||||
@ -2574,6 +2796,38 @@ func TestHeadlessServices(t *testing.T) {
|
|||||||
},
|
},
|
||||||
false,
|
false,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"annotated Headless services return IPv6 targets from hostIP if endpoints-type annotation is set",
|
||||||
|
"",
|
||||||
|
"testing",
|
||||||
|
"foo",
|
||||||
|
v1.ServiceTypeClusterIP,
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
false,
|
||||||
|
map[string]string{"component": "foo"},
|
||||||
|
map[string]string{
|
||||||
|
hostnameAnnotationKey: "service.example.org",
|
||||||
|
endpointsTypeAnnotationKey: EndpointsTypeHostIP,
|
||||||
|
},
|
||||||
|
map[string]string{},
|
||||||
|
v1.ClusterIPNone,
|
||||||
|
[]string{"2001:db8::1"},
|
||||||
|
[]string{"2001:db8::4"},
|
||||||
|
map[string]string{
|
||||||
|
"component": "foo",
|
||||||
|
},
|
||||||
|
[]string{},
|
||||||
|
[]string{"foo"},
|
||||||
|
[]string{"", "", ""},
|
||||||
|
[]bool{true, true, true},
|
||||||
|
false,
|
||||||
|
[]v1.Node{},
|
||||||
|
[]*endpoint.Endpoint{
|
||||||
|
{DNSName: "service.example.org", RecordType: endpoint.RecordTypeAAAA, Targets: endpoint.Targets{"2001:db8::4"}},
|
||||||
|
},
|
||||||
|
false,
|
||||||
|
},
|
||||||
} {
|
} {
|
||||||
tc := tc
|
tc := tc
|
||||||
t.Run(tc.title, func(t *testing.T) {
|
t.Run(tc.title, func(t *testing.T) {
|
||||||
@ -2716,7 +2970,7 @@ func TestHeadlessServicesHostIP(t *testing.T) {
|
|||||||
expectError bool
|
expectError bool
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
"annotated Headless services return endpoints for each selected Pod",
|
"annotated Headless services return IPv4 endpoints for each selected Pod",
|
||||||
"",
|
"",
|
||||||
"testing",
|
"testing",
|
||||||
"foo",
|
"foo",
|
||||||
@ -2749,6 +3003,40 @@ func TestHeadlessServicesHostIP(t *testing.T) {
|
|||||||
},
|
},
|
||||||
false,
|
false,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"annotated Headless services return IPv6 endpoints for each selected Pod",
|
||||||
|
"",
|
||||||
|
"testing",
|
||||||
|
"foo",
|
||||||
|
v1.ServiceTypeClusterIP,
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
false,
|
||||||
|
map[string]string{"component": "foo"},
|
||||||
|
map[string]string{
|
||||||
|
hostnameAnnotationKey: "service.example.org",
|
||||||
|
},
|
||||||
|
v1.ClusterIPNone,
|
||||||
|
[]string{"2001:db8::1", "2001:db8::2"},
|
||||||
|
map[string]string{
|
||||||
|
"component": "foo",
|
||||||
|
},
|
||||||
|
[]string{},
|
||||||
|
[]string{"foo-0", "foo-1"},
|
||||||
|
[]string{"foo-0", "foo-1"},
|
||||||
|
[]bool{true, true},
|
||||||
|
[]*v1.ObjectReference{
|
||||||
|
{APIVersion: "", Kind: "Pod", Name: "foo-0"},
|
||||||
|
{APIVersion: "", Kind: "Pod", Name: "foo-1"},
|
||||||
|
},
|
||||||
|
false,
|
||||||
|
[]*endpoint.Endpoint{
|
||||||
|
{DNSName: "foo-0.service.example.org", RecordType: endpoint.RecordTypeAAAA, Targets: endpoint.Targets{"2001:db8::1"}},
|
||||||
|
{DNSName: "foo-1.service.example.org", RecordType: endpoint.RecordTypeAAAA, Targets: endpoint.Targets{"2001:db8::2"}},
|
||||||
|
{DNSName: "service.example.org", RecordType: endpoint.RecordTypeAAAA, Targets: endpoint.Targets{"2001:db8::1", "2001:db8::2"}},
|
||||||
|
},
|
||||||
|
false,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"hostname annotated Headless services are ignored",
|
"hostname annotated Headless services are ignored",
|
||||||
"",
|
"",
|
||||||
@ -2780,7 +3068,7 @@ func TestHeadlessServicesHostIP(t *testing.T) {
|
|||||||
false,
|
false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"annotated Headless services return endpoints with TTL for each selected Pod",
|
"annotated Headless services return IPv4 endpoints with TTL for each selected Pod",
|
||||||
"",
|
"",
|
||||||
"testing",
|
"testing",
|
||||||
"foo",
|
"foo",
|
||||||
@ -2814,6 +3102,41 @@ func TestHeadlessServicesHostIP(t *testing.T) {
|
|||||||
},
|
},
|
||||||
false,
|
false,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"annotated Headless services return IPv6 endpoints with TTL for each selected Pod",
|
||||||
|
"",
|
||||||
|
"testing",
|
||||||
|
"foo",
|
||||||
|
v1.ServiceTypeClusterIP,
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
false,
|
||||||
|
map[string]string{"component": "foo"},
|
||||||
|
map[string]string{
|
||||||
|
hostnameAnnotationKey: "service.example.org",
|
||||||
|
ttlAnnotationKey: "1",
|
||||||
|
},
|
||||||
|
v1.ClusterIPNone,
|
||||||
|
[]string{"2001:db8::1", "2001:db8::2"},
|
||||||
|
map[string]string{
|
||||||
|
"component": "foo",
|
||||||
|
},
|
||||||
|
[]string{},
|
||||||
|
[]string{"foo-0", "foo-1"},
|
||||||
|
[]string{"foo-0", "foo-1"},
|
||||||
|
[]bool{true, true},
|
||||||
|
[]*v1.ObjectReference{
|
||||||
|
{APIVersion: "", Kind: "Pod", Name: "foo-0"},
|
||||||
|
{APIVersion: "", Kind: "Pod", Name: "foo-1"},
|
||||||
|
},
|
||||||
|
false,
|
||||||
|
[]*endpoint.Endpoint{
|
||||||
|
{DNSName: "foo-0.service.example.org", RecordType: endpoint.RecordTypeAAAA, Targets: endpoint.Targets{"2001:db8::1"}, RecordTTL: endpoint.TTL(1)},
|
||||||
|
{DNSName: "foo-1.service.example.org", RecordType: endpoint.RecordTypeAAAA, Targets: endpoint.Targets{"2001:db8::2"}, RecordTTL: endpoint.TTL(1)},
|
||||||
|
{DNSName: "service.example.org", RecordType: endpoint.RecordTypeAAAA, Targets: endpoint.Targets{"2001:db8::1", "2001:db8::2"}, RecordTTL: endpoint.TTL(1)},
|
||||||
|
},
|
||||||
|
false,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"annotated Headless services return endpoints for each selected Pod, which are in running state",
|
"annotated Headless services return endpoints for each selected Pod, which are in running state",
|
||||||
"",
|
"",
|
||||||
@ -2882,7 +3205,7 @@ func TestHeadlessServicesHostIP(t *testing.T) {
|
|||||||
false,
|
false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"annotated Headless services return endpoints for pods missing hostname",
|
"annotated Headless services return IPv4 endpoints for pods missing hostname",
|
||||||
"",
|
"",
|
||||||
"testing",
|
"testing",
|
||||||
"foo",
|
"foo",
|
||||||
@ -2913,6 +3236,38 @@ func TestHeadlessServicesHostIP(t *testing.T) {
|
|||||||
},
|
},
|
||||||
false,
|
false,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"annotated Headless services return IPv6 endpoints for pods missing hostname",
|
||||||
|
"",
|
||||||
|
"testing",
|
||||||
|
"foo",
|
||||||
|
v1.ServiceTypeClusterIP,
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
false,
|
||||||
|
map[string]string{"component": "foo"},
|
||||||
|
map[string]string{
|
||||||
|
hostnameAnnotationKey: "service.example.org",
|
||||||
|
},
|
||||||
|
v1.ClusterIPNone,
|
||||||
|
[]string{"2001:db8::1", "2001:db8::2"},
|
||||||
|
map[string]string{
|
||||||
|
"component": "foo",
|
||||||
|
},
|
||||||
|
[]string{},
|
||||||
|
[]string{"foo-0", "foo-1"},
|
||||||
|
[]string{"", ""},
|
||||||
|
[]bool{true, true},
|
||||||
|
[]*v1.ObjectReference{
|
||||||
|
{APIVersion: "", Kind: "Pod", Name: "foo-0"},
|
||||||
|
{APIVersion: "", Kind: "Pod", Name: "foo-1"},
|
||||||
|
},
|
||||||
|
false,
|
||||||
|
[]*endpoint.Endpoint{
|
||||||
|
{DNSName: "service.example.org", RecordType: endpoint.RecordTypeAAAA, Targets: endpoint.Targets{"2001:db8::1", "2001:db8::2"}},
|
||||||
|
},
|
||||||
|
false,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"annotated Headless services without a targetRef has no endpoints",
|
"annotated Headless services without a targetRef has no endpoints",
|
||||||
"",
|
"",
|
||||||
@ -3066,7 +3421,7 @@ func TestExternalServices(t *testing.T) {
|
|||||||
expectError bool
|
expectError bool
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
"external services return an A endpoint for the external name that is an IP address",
|
"external services return an A endpoint for the external name that is an IPv4 address",
|
||||||
"",
|
"",
|
||||||
"testing",
|
"testing",
|
||||||
"foo",
|
"foo",
|
||||||
@ -3084,6 +3439,25 @@ func TestExternalServices(t *testing.T) {
|
|||||||
},
|
},
|
||||||
false,
|
false,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"external services return an AAAA endpoint for the external name that is an IPv6 address",
|
||||||
|
"",
|
||||||
|
"testing",
|
||||||
|
"foo",
|
||||||
|
v1.ServiceTypeExternalName,
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
false,
|
||||||
|
map[string]string{"component": "foo"},
|
||||||
|
map[string]string{
|
||||||
|
hostnameAnnotationKey: "service.example.org",
|
||||||
|
},
|
||||||
|
"2001:db8::111",
|
||||||
|
[]*endpoint.Endpoint{
|
||||||
|
{DNSName: "service.example.org", Targets: endpoint.Targets{"2001:db8::111"}, RecordType: endpoint.RecordTypeAAAA},
|
||||||
|
},
|
||||||
|
false,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"external services return a CNAME endpoint for the external name that is a domain",
|
"external services return a CNAME endpoint for the external name that is a domain",
|
||||||
"",
|
"",
|
||||||
|
Loading…
Reference in New Issue
Block a user