Skip to content

Commit 26e9bd3

Browse files
authored
Merge pull request #2511 from pbasov/dns-update
✨ Allow changing DNSNameservers in subnet config for OpenstackCluster
2 parents aa16eb1 + 7d47c65 commit 26e9bd3

File tree

4 files changed

+887
-4
lines changed

4 files changed

+887
-4
lines changed

pkg/cloud/services/networking/network.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
251289
func (s *Service) getNetworkByName(networkName string) (networks.Network, error) {
252290
opts := networks.ListOpts{
253291
Name: networkName,

0 commit comments

Comments
 (0)