diff --git a/go-controller/pkg/ovn/dns_name_resolver/external_dns.go b/go-controller/pkg/ovn/dns_name_resolver/external_dns.go index a5505a2d48..9661e920a0 100644 --- a/go-controller/pkg/ovn/dns_name_resolver/external_dns.go +++ b/go-controller/pkg/ovn/dns_name_resolver/external_dns.go @@ -157,7 +157,7 @@ func (extEgDNS *ExternalEgressDNS) reconcileDNSNameResolver(key string) error { addresses = append(addresses, resolvedAddress.IP) } } - err = extEgDNS.dnsTracker.addDNSName(dnsName, addresses) + err = extEgDNS.dnsTracker.addOrUpdateDNSName(dnsName, addresses) return err } diff --git a/go-controller/pkg/ovn/dns_name_resolver/external_dns_test.go b/go-controller/pkg/ovn/dns_name_resolver/external_dns_test.go index d8afbc84a4..3b3c266bce 100644 --- a/go-controller/pkg/ovn/dns_name_resolver/external_dns_test.go +++ b/go-controller/pkg/ovn/dns_name_resolver/external_dns_test.go @@ -52,21 +52,15 @@ func newDNSNameResolverObject(name, namespace, dnsName string, addresses []strin } func expectDNSNameWithAddresses(extEgDNS *ExternalEgressDNS, dnsName string, expectedAddresses []string) { - var resolvedName *dnsResolvedName - err := wait.PollUntilContextTimeout(context.Background(), 1*time.Second, 5*time.Minute, true, func(ctx context.Context) (done bool, err error) { - var exists bool - resolvedName, exists = extEgDNS.getResolvedName(dnsName) + gomega.Eventually(func() []string { + resolvedName, exists := extEgDNS.getResolvedName(dnsName) if !exists { - return false, nil + return []string{} } - - return true, nil - }) - gomega.Expect(err).NotTo(gomega.HaveOccurred()) - - v4, v6 := resolvedName.dnsAddressSet.GetAddresses() - ipStrings := append(v4, v6...) - gomega.Expect(ipStrings).To(gomega.ConsistOf(expectedAddresses)) + v4, v6 := resolvedName.dnsAddressSet.GetAddresses() + ipStrings := append(v4, v6...) + return ipStrings + }).Should(gomega.ConsistOf(expectedAddresses)) } var _ = ginkgo.Describe("Egress Firewall External DNS Operations", func() { @@ -227,6 +221,37 @@ var _ = ginkgo.Describe("Egress Firewall External DNS Operations", func() { }) }) + ginkgo.Context("on dns name resolver resource update", func() { + ginkgo.It("Should update addresses for a dns name", func() { + start() + + config.IPv4Mode = true + config.IPv6Mode = true + + addresses := []string{"1.1.1.1", "2.2.2.2", "2001:0db8:85a3:0000:0000:8a2e:0370:7334"} + dnsNameResolver := newDNSNameResolverObject("dns-default", config.Kubernetes.OVNConfigNamespace, dnsName, addresses) + + _, err := fakeClient.OCPNetworkClient.NetworkV1alpha1().DNSNameResolvers(dnsNameResolver.Namespace). + Create(context.TODO(), dnsNameResolver, metav1.CreateOptions{}) + gomega.Expect(err).NotTo(gomega.HaveOccurred()) + + expectDNSNameWithAddresses(extEgDNS, dnsName, addresses) + + addresses = []string{"2.2.2.2", "3.3.3.3", "2001:0db8:85a3:0000:0000:8a2e:0370:7334", "2001:0db8:85a3:0000:0000:8a2e:0370:7335"} + var resolvedAddresses []ocpnetworkapiv1alpha1.DNSNameResolverResolvedAddress + for _, address := range addresses { + resolvedAddresses = append(resolvedAddresses, ocpnetworkapiv1alpha1.DNSNameResolverResolvedAddress{IP: address}) + } + dnsNameResolver.Status.ResolvedNames[0].ResolvedAddresses = resolvedAddresses + + _, err = fakeClient.OCPNetworkClient.NetworkV1alpha1().DNSNameResolvers(dnsNameResolver.Namespace). + Update(context.TODO(), dnsNameResolver, metav1.UpdateOptions{}) + gomega.Expect(err).NotTo(gomega.HaveOccurred()) + + expectDNSNameWithAddresses(extEgDNS, dnsName, addresses) + }) + }) + ginkgo.It("Should not delete added addresses if DNS name is still used in a namespace", func() { start() diff --git a/go-controller/pkg/ovn/dns_name_resolver/external_dns_tracker.go b/go-controller/pkg/ovn/dns_name_resolver/external_dns_tracker.go index 4fd13d9524..b02d1f56cb 100644 --- a/go-controller/pkg/ovn/dns_name_resolver/external_dns_tracker.go +++ b/go-controller/pkg/ovn/dns_name_resolver/external_dns_tracker.go @@ -57,8 +57,8 @@ func newDNSTracker(addressSetFactory addressset.AddressSetFactory, controllerNam } } -// addDNSName is called whenever a DNS name is needed to be added or updated. -func (dnsTracker *dnsTracker) addDNSName(dnsName string, addresses []string) error { +// addOrUpdateDNSName is called whenever a DNS name is needed to be added or updated. +func (dnsTracker *dnsTracker) addOrUpdateDNSName(dnsName string, addresses []string) error { dnsTracker.dnsLock.Lock() defer dnsTracker.dnsLock.Unlock() @@ -90,7 +90,7 @@ func (dnsTracker *dnsTracker) addDNSName(dnsName string, addresses []string) err addresses = filteredIPs } - if err := resolvedName.dnsAddressSet.AddAddresses(addresses); err != nil { + if err := resolvedName.dnsAddressSet.SetAddresses(addresses); err != nil { return fmt.Errorf("cannot add IPs to AddressSet for DNS name %s: %v", dnsName, err) }