Skip to content

Commit 29c24eb

Browse files
committed
integration tests for DNS Failover groups
Signed-off-by: Phil Brookes <pbrookes@redhat.com> Signed-off-by: Phil Brookes <pbrookes@redhat.com> rh-pre-commit.version: 2.3.2 rh-pre-commit.check-secrets: ENABLED
1 parent 73eee0c commit 29c24eb

File tree

12 files changed

+625
-18
lines changed

12 files changed

+625
-18
lines changed

config/coredns/Corefile

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,12 @@
1+
kuadrant-active-groups.k.example.com {
2+
debug
3+
errors
4+
log
5+
rewrite stop {
6+
name kuadrant-active-groups.k.example.com kuadrant-active-groups-coredns.pb.hcpapps.net
7+
}
8+
forward . /etc/resolv.conf
9+
}
110
k.example.com {
211
debug
312
errors

config/local-setup/dns-provider/coredns/kustomization.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ generatorOptions:
55
labels:
66
app.kubernetes.io/part-of: dns-operator
77
app.kubernetes.io/managed-by: kustomize
8+
kuadrant.io/default-provider: "true"
89

910
secretGenerator:
1011
- name: dns-provider-credentials

config/local-setup/dnsrecords/delegating/coredns/loadbalanced/dnsrecord-loadbalanced-coredns-cluster1.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ kind: DNSRecord
33
metadata:
44
name: dnsrecord-loadbalanced-coredns-cluster1
55
spec:
6-
rootHost: loadbalanced.k.example.com
6+
rootHost: k.example.com
77
endpoints:
88
- dnsName: loadbalanced.k.example.com
99
recordTTL: 300

config/local-setup/dnsrecords/delegating/coredns/loadbalanced/dnsrecord-loadbalanced-coredns-cluster2.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ kind: DNSRecord
33
metadata:
44
name: dnsrecord-loadbalanced-coredns-cluster2
55
spec:
6-
rootHost: loadbalanced.k.example.com
6+
rootHost: k.example.com
77
endpoints:
88
- dnsName: loadbalanced.k.example.com
99
recordTTL: 300

config/local-setup/dnsrecords/delegating/coredns/loadbalanced/dnsrecord-loadbalanced-coredns-cluster3.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ kind: DNSRecord
33
metadata:
44
name: dnsrecord-loadbalanced-coredns-cluster3
55
spec:
6-
rootHost: loadbalanced.k.example.com
6+
rootHost: k.example.com
77
endpoints:
88
- dnsName: loadbalanced.k.example.com
99
recordTTL: 300

coredns/examples/Corefile

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,12 @@
1+
kuadrant-active-groups.k.example.com {
2+
debug
3+
errors
4+
log
5+
rewrite stop {
6+
name kuadrant-active-groups.k.example.com kuadrant-active-groups-coredns.pb.hcpapps.net
7+
}
8+
forward . /etc/resolv.conf
9+
}
110
k.example.com {
211
debug
312
errors

internal/controller/dnsrecord_controller.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,9 @@ func (r *DNSRecordReconciler) Reconcile(ctx context.Context, req ctrl.Request) (
237237
ctx, logger = r.setLogger(ctx, baseLogger, dnsRecord)
238238
}
239239

240-
dnsRecord.SetStatusGroup(r.Group)
240+
if !dnsRecord.GetDNSRecord().IsAuthoritativeRecord() && r.Group != "" {
241+
dnsRecord.SetStatusGroup(r.Group)
242+
}
241243

242244
if dnsRecord.IsDelegating() {
243245
// ReadyForDelegation can be set to true once:
@@ -262,10 +264,7 @@ func (r *DNSRecordReconciler) Reconcile(ctx context.Context, req ctrl.Request) (
262264
if !dnsRecord.GetDNSRecord().IsAuthoritativeRecord() && r.Group != "" {
263265
var activeGroups types.Groups
264266
activeGroups = r.getActiveGroups(ctx, r.Client, dnsRecord)
265-
266-
dnsRecord.SetStatusGroup(r.Group)
267267
dnsRecord.SetStatusActiveGroups(activeGroups)
268-
269268
dnsRecord = newGroupAdapter(dnsRecord, activeGroups)
270269
}
271270

internal/controller/dnsrecord_groups.go

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
externaldnsendpoint "sigs.k8s.io/external-dns/endpoint"
1919
"sigs.k8s.io/external-dns/plan"
2020

21+
"github.com/go-logr/logr"
2122
"github.com/kuadrant/dns-operator/api/v1alpha1"
2223
"github.com/kuadrant/dns-operator/internal/external-dns/registry"
2324
externaldnsregistry "github.com/kuadrant/dns-operator/internal/external-dns/registry"
@@ -31,34 +32,47 @@ const (
3132

3233
// TXTResolver is an interface for resolving TXT DNS records
3334
type TXTResolver interface {
34-
LookupTXT(host string, nameservers []string) ([]string, error)
35+
LookupTXT(ctx context.Context, host string, nameservers []string) ([]string, error)
3536
}
3637

3738
// DefaultTXTResolver is the default implementation that uses net.LookupTXT
3839
type DefaultTXTResolver struct{}
3940

40-
func (d *DefaultTXTResolver) LookupTXT(host string, nameservers []string) ([]string, error) {
41+
func (d *DefaultTXTResolver) LookupTXT(ctx context.Context, host string, nameservers []string) ([]string, error) {
42+
logger, err := logr.FromContext(ctx)
43+
if err != nil {
44+
return []string{}, nil
45+
}
46+
logger.Info("looking up txt record", "host", host, "nameservers", nameservers)
4147
// If nameservers are provided, try each one until we get an answer
4248
if len(nameservers) > 0 {
4349
for _, ns := range nameservers {
50+
// Parse the nameserver to handle cases where port is already specified
51+
nsAddr := ns
52+
if _, _, err := net.SplitHostPort(ns); err != nil {
53+
// No port specified, add default port 53
54+
nsAddr = net.JoinHostPort(ns, "53")
55+
}
56+
logger.V(1).Info("using nameserver", "nameserver", ns, "resolved", nsAddr)
57+
4458
resolver := &net.Resolver{
4559
PreferGo: true,
4660
Dial: func(ctx context.Context, network, address string) (net.Conn, error) {
4761
dialer := net.Dialer{
48-
Timeout: time.Second * 1,
62+
Timeout: time.Second * 3,
4963
}
50-
// Use the nameserver with port 53
51-
return dialer.DialContext(ctx, "udp", net.JoinHostPort(ns, "53"))
64+
// Always use our specified nameserver, ignoring the address parameter
65+
return dialer.DialContext(ctx, network, nsAddr)
5266
},
5367
}
5468

55-
ctx, cancel := context.WithTimeout(context.Background(), time.Second*1)
5669
records, err := resolver.LookupTXT(ctx, host)
57-
cancel()
5870

5971
if err == nil && len(records) > 0 {
72+
logger.V(1).Info("successfully resolved txt record", "nameserver", nsAddr, "records", records)
6073
return records, nil
6174
}
75+
logger.V(1).Info("failed to resolve txt record", "nameserver", nsAddr, "error", err)
6276
}
6377
}
6478

@@ -112,16 +126,16 @@ func (r *BaseDNSRecordReconciler) getActiveGroups(ctx context.Context, c client.
112126
activeGroupsHost := activeGroupsTXTRecordName + "." + dnsRecord.GetZoneDomainName()
113127

114128
nameservers := r.getNameserversFromProvider(ctx, c, dnsRecord)
115-
values, err := r.TXTResolver.LookupTXT(activeGroupsHost, nameservers)
129+
values, err := r.TXTResolver.LookupTXT(ctx, activeGroupsHost, nameservers)
116130
if err != nil {
117131
logger.Error(err, "error looking up active groups")
118132
return activeGroups
119133
}
120134
// found an answer, format it and return
121135
if len(values) > 0 {
122136
activeGroupsStr := strings.Join(values, "")
123-
pairs := strings.Split(activeGroupsStr, ";")
124-
for _, pairStr := range pairs {
137+
pairs := strings.SplitSeq(activeGroupsStr, ";")
138+
for pairStr := range pairs {
125139
sections := strings.Split(pairStr, "=")
126140
if sections[0] == "groups" {
127141
for g := range strings.SplitSeq(sections[1], "&&") {

0 commit comments

Comments
 (0)