Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 38 additions & 0 deletions pkg/cloud/services/networking/network.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import (
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/extensions/external"
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/networks"
"github.com/gophercloud/gophercloud/v2/openstack/networking/v2/subnets"
"k8s.io/apimachinery/pkg/api/equality"
"k8s.io/utils/ptr"

infrav1 "sigs.k8s.io/cluster-api-provider-openstack/api/v1beta1"
Expand Down Expand Up @@ -201,6 +202,10 @@ func (s *Service) ReconcileSubnet(openStackCluster *infrav1.OpenStackCluster, cl
} else if len(subnetList) == 1 {
subnet = &subnetList[0]
s.scope.Logger().V(6).Info("Reusing existing subnet", "name", subnet.Name, "id", subnet.ID)

if err := s.updateSubnetDNSNameservers(openStackCluster, subnet); err != nil {
return err
}
}

openStackCluster.Status.Network.Subnets = []infrav1.Subnet{
Expand Down Expand Up @@ -248,6 +253,39 @@ func (s *Service) createSubnet(openStackCluster *infrav1.OpenStackCluster, clust
return subnet, nil
}

// updateSubnetDNSNameservers updates the DNS nameservers for an existing subnet if they differ from the desired configuration.
func (s *Service) updateSubnetDNSNameservers(openStackCluster *infrav1.OpenStackCluster, subnet *subnets.Subnet) error {
// Picking the first managed subnet since we only support one for now
desiredNameservers := openStackCluster.Spec.ManagedSubnets[0].DNSNameservers
currentNameservers := subnet.DNSNameservers

var needsUpdate bool
if len(desiredNameservers) != len(currentNameservers) {
needsUpdate = true
} else {
needsUpdate = !equality.Semantic.DeepEqual(currentNameservers, desiredNameservers)
}

if needsUpdate {
s.scope.Logger().Info("Updating subnet DNS nameservers", "id", subnet.ID, "from", currentNameservers, "to", desiredNameservers)

updateOpts := subnets.UpdateOpts{
DNSNameservers: &desiredNameservers,
}

updatedSubnet, err := s.client.UpdateSubnet(subnet.ID, updateOpts)
if err != nil {
record.Warnf(openStackCluster, "FailedUpdateSubnet", "Failed to update DNS nameservers for subnet %s: %v", subnet.ID, err)
return err
}

*subnet = *updatedSubnet
record.Eventf(openStackCluster, "SuccessfulUpdateSubnet", "Updated DNS nameservers for subnet %s", subnet.ID)
}

return nil
}

func (s *Service) getNetworkByName(networkName string) (networks.Network, error) {
opts := networks.ListOpts{
Name: networkName,
Expand Down
Loading