@@ -19,6 +19,7 @@ package loadbalancer
19
19
import (
20
20
"errors"
21
21
"fmt"
22
+ "net"
22
23
"reflect"
23
24
"time"
24
25
@@ -27,7 +28,7 @@ import (
27
28
"github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/monitors"
28
29
"github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/pools"
29
30
"k8s.io/apimachinery/pkg/util/wait"
30
- "k8s.io/utils/net"
31
+ utilsnet "k8s.io/utils/net"
31
32
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
32
33
"sigs.k8s.io/cluster-api/util"
33
34
@@ -42,20 +43,37 @@ import (
42
43
const (
43
44
networkPrefix string = "k8s-clusterapi"
44
45
kubeapiLBSuffix string = "kubeapi"
46
+ resolvedMsg string = "ControlPlaneEndpoint.Host is not an IP address, using the first resolved IP address"
45
47
)
46
48
47
49
const loadBalancerProvisioningStatusActive = "ACTIVE"
48
50
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
+
49
58
func (s * Service ) ReconcileLoadBalancer (openStackCluster * infrav1.OpenStackCluster , clusterName string , apiServerPort int ) (bool , error ) {
50
59
loadBalancerName := getLoadBalancerName (clusterName )
51
60
s .scope .Logger ().Info ("Reconciling load balancer" , "name" , loadBalancerName )
52
61
53
62
var fixedIPAddress string
63
+ var err error
64
+
54
65
switch {
55
66
case openStackCluster .Spec .APIServerFixedIP != "" :
56
67
fixedIPAddress = openStackCluster .Spec .APIServerFixedIP
57
68
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
+ }
59
77
}
60
78
61
79
providers , err := s .loadbalancerClient .ListLoadBalancerProviders ()
@@ -93,7 +111,14 @@ func (s *Service) ReconcileLoadBalancer(openStackCluster *infrav1.OpenStackClust
93
111
case openStackCluster .Spec .APIServerFloatingIP != "" :
94
112
floatingIPAddress = openStackCluster .Spec .APIServerFloatingIP
95
113
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
+ }
97
122
}
98
123
fp , err := s .networkingService .GetOrCreateFloatingIP (openStackCluster , openStackCluster , clusterName , floatingIPAddress )
99
124
if err != nil {
@@ -294,9 +319,9 @@ func validateIPs(openStackCluster *infrav1.OpenStackCluster, definedCIDRs []stri
294
319
295
320
for _ , v := range definedCIDRs {
296
321
switch {
297
- case net .IsIPv4String (v ):
322
+ case utilsnet .IsIPv4String (v ):
298
323
marshaledCIDRs = append (marshaledCIDRs , v + "/32" )
299
- case net .IsIPv4CIDRString (v ):
324
+ case utilsnet .IsIPv4CIDRString (v ):
300
325
marshaledCIDRs = append (marshaledCIDRs , v )
301
326
default :
302
327
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