@@ -25,6 +25,7 @@ import (
25
25
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/extensions/external"
26
26
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/networks"
27
27
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/subnets"
28
+ "k8s.io/apimachinery/pkg/api/equality"
28
29
"k8s.io/utils/ptr"
29
30
30
31
infrav1 "sigs.k8s.io/cluster-api-provider-openstack/api/v1beta1"
@@ -201,6 +202,10 @@ func (s *Service) ReconcileSubnet(openStackCluster *infrav1.OpenStackCluster, cl
201
202
} else if len (subnetList ) == 1 {
202
203
subnet = & subnetList [0 ]
203
204
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
+ }
204
209
}
205
210
206
211
openStackCluster .Status .Network .Subnets = []infrav1.Subnet {
@@ -248,6 +253,39 @@ func (s *Service) createSubnet(openStackCluster *infrav1.OpenStackCluster, clust
248
253
return subnet , nil
249
254
}
250
255
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
+
251
289
func (s * Service ) getNetworkByName (networkName string ) (networks.Network , error ) {
252
290
opts := networks.ListOpts {
253
291
Name : networkName ,
0 commit comments