@@ -25,6 +25,7 @@ import (
2525 "github.com/gophercloud/gophercloud/v2/openstack/networking/v2/extensions/external"
2626 "github.com/gophercloud/gophercloud/v2/openstack/networking/v2/networks"
2727 "github.com/gophercloud/gophercloud/v2/openstack/networking/v2/subnets"
28+ "k8s.io/apimachinery/pkg/api/equality"
2829 "k8s.io/utils/ptr"
2930
3031 infrav1 "sigs.k8s.io/cluster-api-provider-openstack/api/v1beta1"
@@ -201,6 +202,10 @@ func (s *Service) ReconcileSubnet(openStackCluster *infrav1.OpenStackCluster, cl
201202 } else if len (subnetList ) == 1 {
202203 subnet = & subnetList [0 ]
203204 s .scope .Logger ().V (6 ).Info ("Reusing existing subnet" , "name" , subnet .Name , "id" , subnet .ID )
205+
206+ if err := s .updateSubnetDNSNameservers (openStackCluster , subnet ); err != nil {
207+ return err
208+ }
204209 }
205210
206211 openStackCluster .Status .Network .Subnets = []infrav1.Subnet {
@@ -248,6 +253,39 @@ func (s *Service) createSubnet(openStackCluster *infrav1.OpenStackCluster, clust
248253 return subnet , nil
249254}
250255
256+ // updateSubnetDNSNameservers updates the DNS nameservers for an existing subnet if they differ from the desired configuration.
257+ func (s * Service ) updateSubnetDNSNameservers (openStackCluster * infrav1.OpenStackCluster , subnet * subnets.Subnet ) error {
258+ // Picking the first managed subnet since we only support one for now
259+ desiredNameservers := openStackCluster .Spec .ManagedSubnets [0 ].DNSNameservers
260+ currentNameservers := subnet .DNSNameservers
261+
262+ var needsUpdate bool
263+ if len (desiredNameservers ) != len (currentNameservers ) {
264+ needsUpdate = true
265+ } else {
266+ needsUpdate = ! equality .Semantic .DeepEqual (currentNameservers , desiredNameservers )
267+ }
268+
269+ if needsUpdate {
270+ s .scope .Logger ().Info ("Updating subnet DNS nameservers" , "id" , subnet .ID , "from" , currentNameservers , "to" , desiredNameservers )
271+
272+ updateOpts := subnets.UpdateOpts {
273+ DNSNameservers : & desiredNameservers ,
274+ }
275+
276+ updatedSubnet , err := s .client .UpdateSubnet (subnet .ID , updateOpts )
277+ if err != nil {
278+ record .Warnf (openStackCluster , "FailedUpdateSubnet" , "Failed to update DNS nameservers for subnet %s: %v" , subnet .ID , err )
279+ return err
280+ }
281+
282+ * subnet = * updatedSubnet
283+ record .Eventf (openStackCluster , "SuccessfulUpdateSubnet" , "Updated DNS nameservers for subnet %s" , subnet .ID )
284+ }
285+
286+ return nil
287+ }
288+
251289func (s * Service ) getNetworkByName (networkName string ) (networks.Network , error ) {
252290 opts := networks.ListOpts {
253291 Name : networkName ,
0 commit comments