@ -8,6 +8,7 @@ package main
import (
"context"
"encoding/json"
"fmt"
"testing"
"github.com/google/go-cmp/cmp"
@ -87,13 +88,16 @@ func TestDNSRecordsReconciler(t *testing.T) {
} ,
}
headlessForEgressSvcFQDN := headlessSvcForParent ( egressSvcFQDN , "svc" ) // create the proxy headless Service
ep := endpointSliceForService ( headlessForEgressSvcFQDN , "10.9.8.7" )
ep := endpointSliceForService ( headlessForEgressSvcFQDN , "10.9.8.7" , discoveryv1 . AddressTypeIPv4 )
epv6 := endpointSliceForService ( headlessForEgressSvcFQDN , "2600:1900:4011:161:0:d:0:d" , discoveryv1 . AddressTypeIPv6 )
mustCreate ( t , fc , egressSvcFQDN )
mustCreate ( t , fc , headlessForEgressSvcFQDN )
mustCreate ( t , fc , ep )
mustCreate ( t , fc , epv6 )
expectReconciled ( t , dnsRR , "tailscale" , "egress-fqdn" ) // dns-records-reconciler reconcile the headless Service
// ConfigMap should now have a record for foo.bar.ts.net -> 10.8.8.7
wantHosts := map [ string ] [ ] string { "foo.bar.ts.net" : { "10.9.8.7" } }
wantHosts := map [ string ] [ ] string { "foo.bar.ts.net" : { "10.9.8.7" } } // IPv6 endpoint is currently ignored
expectHostsRecords ( t , fc , wantHosts )
// 2. DNS record is updated if tailscale.com/tailnet-fqdn annotation's
@ -106,7 +110,7 @@ func TestDNSRecordsReconciler(t *testing.T) {
expectHostsRecords ( t , fc , wantHosts )
// 3. DNS record is updated if the IP address of the proxy Pod changes.
ep = endpointSliceForService ( headlessForEgressSvcFQDN , "10.6.5.4" )
ep = endpointSliceForService ( headlessForEgressSvcFQDN , "10.6.5.4" , discoveryv1 . AddressTypeIPv4 )
mustUpdate ( t , fc , ep . Namespace , ep . Name , func ( ep * discoveryv1 . EndpointSlice ) {
ep . Endpoints [ 0 ] . Addresses = [ ] string { "10.6.5.4" }
} )
@ -116,7 +120,7 @@ func TestDNSRecordsReconciler(t *testing.T) {
// 4. DNS record is created for an ingress proxy configured via Ingress
headlessForIngress := headlessSvcForParent ( ing , "ingress" )
ep = endpointSliceForService ( headlessForIngress , "10.9.8.7" )
ep = endpointSliceForService ( headlessForIngress , "10.9.8.7" , discoveryv1 . AddressTypeIPv4 )
mustCreate ( t , fc , headlessForIngress )
mustCreate ( t , fc , ep )
expectReconciled ( t , dnsRR , "tailscale" , "ts-ingress" ) // dns-records-reconciler should reconcile the headless Service
@ -140,6 +144,17 @@ func TestDNSRecordsReconciler(t *testing.T) {
expectReconciled ( t , dnsRR , "tailscale" , "ts-ingress" )
wantHosts [ "another.ingress.ts.net" ] = [ ] string { "7.8.9.10" }
expectHostsRecords ( t , fc , wantHosts )
// 7. A not-ready Endpoint is removed from DNS config.
mustUpdate ( t , fc , ep . Namespace , ep . Name , func ( ep * discoveryv1 . EndpointSlice ) {
ep . Endpoints [ 0 ] . Conditions . Ready = ptr . To ( false )
ep . Endpoints = append ( ep . Endpoints , discoveryv1 . Endpoint {
Addresses : [ ] string { "1.2.3.4" } ,
} )
} )
expectReconciled ( t , dnsRR , "tailscale" , "ts-ingress" )
wantHosts [ "another.ingress.ts.net" ] = [ ] string { "1.2.3.4" }
expectHostsRecords ( t , fc , wantHosts )
}
func headlessSvcForParent ( o client . Object , typ string ) * corev1 . Service {
@ -162,15 +177,21 @@ func headlessSvcForParent(o client.Object, typ string) *corev1.Service {
}
}
func endpointSliceForService ( svc * corev1 . Service , ip string ) * discoveryv1 . EndpointSlice {
func endpointSliceForService ( svc * corev1 . Service , ip string , fam discoveryv1 . AddressType ) * discoveryv1 . EndpointSlice {
return & discoveryv1 . EndpointSlice {
ObjectMeta : metav1 . ObjectMeta {
Name : svc. Name ,
Name : fmt. Sprintf ( "%s-%s" , svc. Name , string ( fam ) ) ,
Namespace : svc . Namespace ,
Labels : map [ string ] string { discoveryv1 . LabelServiceName : svc . Name } ,
} ,
AddressType : fam ,
Endpoints : [ ] discoveryv1 . Endpoint { {
Addresses : [ ] string { ip } ,
Conditions : discoveryv1 . EndpointConditions {
Ready : ptr . To ( true ) ,
Serving : ptr . To ( true ) ,
Terminating : ptr . To ( false ) ,
} ,
} } ,
}
}