@@ -19,6 +19,7 @@ package loadbalancer
1919import  (
2020	"errors" 
2121	"fmt" 
22+ 	"net" 
2223	"reflect" 
2324	"time" 
2425
@@ -27,7 +28,7 @@ import (
2728	"github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/monitors" 
2829	"github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/pools" 
2930	"k8s.io/apimachinery/pkg/util/wait" 
30- 	"k8s.io/utils/net" 
31+ 	utilsnet  "k8s.io/utils/net" 
3132	clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" 
3233	"sigs.k8s.io/cluster-api/util" 
3334
@@ -42,20 +43,37 @@ import (
4243const  (
4344	networkPrefix    string  =  "k8s-clusterapi" 
4445	kubeapiLBSuffix  string  =  "kubeapi" 
46+ 	resolvedMsg      string  =  "ControlPlaneEndpoint.Host is not an IP address, using the first resolved IP address" 
4547)
4648
4749const  loadBalancerProvisioningStatusActive  =  "ACTIVE" 
4850
51+ // We wrap the net.LookupHost function in a variable to allow overriding it in unit tests. 
52+ // 
53+ //nolint:gocritic 
54+ var  lookupHost  =  func (host  string ) ([]string , error ) {
55+ 	return  net .LookupHost (host )
56+ }
57+ 
4958func  (s  * Service ) ReconcileLoadBalancer (openStackCluster  * infrav1.OpenStackCluster , clusterName  string , apiServerPort  int ) (bool , error ) {
5059	loadBalancerName  :=  getLoadBalancerName (clusterName )
5160	s .scope .Logger ().Info ("Reconciling load balancer" , "name" , loadBalancerName )
5261
5362	var  fixedIPAddress  string 
63+ 	var  err  error 
64+ 
5465	switch  {
5566	case  openStackCluster .Spec .APIServerFixedIP  !=  "" :
5667		fixedIPAddress  =  openStackCluster .Spec .APIServerFixedIP 
5768	case  openStackCluster .Spec .DisableAPIServerFloatingIP  &&  openStackCluster .Spec .ControlPlaneEndpoint .IsValid ():
58- 		fixedIPAddress  =  openStackCluster .Spec .ControlPlaneEndpoint .Host 
69+ 		ips , err  :=  lookupHost (openStackCluster .Spec .ControlPlaneEndpoint .Host )
70+ 		if  err  !=  nil  {
71+ 			return  false , fmt .Errorf ("lookup host: %w" , err )
72+ 		}
73+ 		fixedIPAddress  =  ips [0 ]
74+ 		if  net .ParseIP (fixedIPAddress ) ==  nil  {
75+ 			s .scope .Logger ().Info (resolvedMsg , "host" , openStackCluster .Spec .ControlPlaneEndpoint .Host , "ip" , fixedIPAddress )
76+ 		}
5977	}
6078
6179	providers , err  :=  s .loadbalancerClient .ListLoadBalancerProviders ()
@@ -93,7 +111,14 @@ func (s *Service) ReconcileLoadBalancer(openStackCluster *infrav1.OpenStackClust
93111		case  openStackCluster .Spec .APIServerFloatingIP  !=  "" :
94112			floatingIPAddress  =  openStackCluster .Spec .APIServerFloatingIP 
95113		case  openStackCluster .Spec .ControlPlaneEndpoint .IsValid ():
96- 			floatingIPAddress  =  openStackCluster .Spec .ControlPlaneEndpoint .Host 
114+ 			ips , err  :=  lookupHost (openStackCluster .Spec .ControlPlaneEndpoint .Host )
115+ 			if  err  !=  nil  {
116+ 				return  false , fmt .Errorf ("lookup host: %w" , err )
117+ 			}
118+ 			floatingIPAddress  =  ips [0 ]
119+ 			if  net .ParseIP (floatingIPAddress ) ==  nil  {
120+ 				s .scope .Logger ().Info (resolvedMsg , "host" , openStackCluster .Spec .ControlPlaneEndpoint .Host , "ip" , floatingIPAddress )
121+ 			}
97122		}
98123		fp , err  :=  s .networkingService .GetOrCreateFloatingIP (openStackCluster , openStackCluster , clusterName , floatingIPAddress )
99124		if  err  !=  nil  {
@@ -294,9 +319,9 @@ func validateIPs(openStackCluster *infrav1.OpenStackCluster, definedCIDRs []stri
294319
295320	for  _ , v  :=  range  definedCIDRs  {
296321		switch  {
297- 		case  net .IsIPv4String (v ):
322+ 		case  utilsnet .IsIPv4String (v ):
298323			marshaledCIDRs  =  append (marshaledCIDRs , v + "/32" )
299- 		case  net .IsIPv4CIDRString (v ):
324+ 		case  utilsnet .IsIPv4CIDRString (v ):
300325			marshaledCIDRs  =  append (marshaledCIDRs , v )
301326		default :
302327			record .Warnf (openStackCluster , "FailedIPAddressValidation" , "%s is not a valid IPv4 nor CIDR address and will not get applied to allowed_cidrs" , v )
0 commit comments