@@ -17,8 +17,10 @@ limitations under the License.
17
17
package loadbalancer
18
18
19
19
import (
20
+ "context"
20
21
"errors"
21
22
"fmt"
23
+ "net"
22
24
"reflect"
23
25
"time"
24
26
@@ -27,7 +29,7 @@ import (
27
29
"github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/monitors"
28
30
"github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/pools"
29
31
"k8s.io/apimachinery/pkg/util/wait"
30
- "k8s.io/utils/net"
32
+ utilsnet "k8s.io/utils/net"
31
33
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
32
34
"sigs.k8s.io/cluster-api/util"
33
35
@@ -42,10 +44,23 @@ import (
42
44
const (
43
45
networkPrefix string = "k8s-clusterapi"
44
46
kubeapiLBSuffix string = "kubeapi"
47
+ resolvedMsg string = "ControlPlaneEndpoint.Host is not an IP address, using the first resolved IP address"
45
48
)
46
49
47
50
const loadBalancerProvisioningStatusActive = "ACTIVE"
48
51
52
+ // We wrap the LookupHost function in a variable to allow overriding it in unit tests.
53
+ //
54
+ //nolint:gocritic
55
+ var lookupHost = func (host string ) ([]string , error ) {
56
+ ctx , cancel := context .WithTimeout (context .TODO (), 30 * time .Second )
57
+ defer cancel ()
58
+ return net .DefaultResolver .LookupHost (ctx , host )
59
+ }
60
+
61
+ // ReconcileLoadBalancer reconciles the load balancer for the given cluster.
62
+ //
63
+ //nolint:gocyclo // Function requires a lot of conditions to be checked
49
64
func (s * Service ) ReconcileLoadBalancer (openStackCluster * infrav1.OpenStackCluster , clusterName string , apiServerPort int ) (bool , error ) {
50
65
loadBalancerName := getLoadBalancerName (clusterName )
51
66
s .scope .Logger ().Info ("Reconciling load balancer" , "name" , loadBalancerName )
@@ -57,13 +72,22 @@ func (s *Service) ReconcileLoadBalancer(openStackCluster *infrav1.OpenStackClust
57
72
}
58
73
59
74
var fixedIPAddress string
75
+ var err error
76
+
60
77
switch {
61
78
case lbStatus .InternalIP != "" :
62
79
fixedIPAddress = lbStatus .InternalIP
63
80
case openStackCluster .Spec .APIServerFixedIP != "" :
64
81
fixedIPAddress = openStackCluster .Spec .APIServerFixedIP
65
82
case openStackCluster .Spec .DisableAPIServerFloatingIP && openStackCluster .Spec .ControlPlaneEndpoint .IsValid ():
66
- fixedIPAddress = openStackCluster .Spec .ControlPlaneEndpoint .Host
83
+ ips , err := lookupHost (openStackCluster .Spec .ControlPlaneEndpoint .Host )
84
+ if err != nil {
85
+ return false , fmt .Errorf ("lookup host: %w" , err )
86
+ }
87
+ fixedIPAddress = ips [0 ]
88
+ if net .ParseIP (fixedIPAddress ) == nil {
89
+ s .scope .Logger ().Info (resolvedMsg , "host" , openStackCluster .Spec .ControlPlaneEndpoint .Host , "ip" , fixedIPAddress )
90
+ }
67
91
}
68
92
69
93
providers , err := s .loadbalancerClient .ListLoadBalancerProviders ()
@@ -108,7 +132,14 @@ func (s *Service) ReconcileLoadBalancer(openStackCluster *infrav1.OpenStackClust
108
132
case openStackCluster .Spec .APIServerFloatingIP != "" :
109
133
floatingIPAddress = openStackCluster .Spec .APIServerFloatingIP
110
134
case openStackCluster .Spec .ControlPlaneEndpoint .IsValid ():
111
- floatingIPAddress = openStackCluster .Spec .ControlPlaneEndpoint .Host
135
+ ips , err := lookupHost (openStackCluster .Spec .ControlPlaneEndpoint .Host )
136
+ if err != nil {
137
+ return false , fmt .Errorf ("lookup host: %w" , err )
138
+ }
139
+ floatingIPAddress = ips [0 ]
140
+ if net .ParseIP (floatingIPAddress ) == nil {
141
+ s .scope .Logger ().Info (resolvedMsg , "host" , openStackCluster .Spec .ControlPlaneEndpoint .Host , "ip" , floatingIPAddress )
142
+ }
112
143
}
113
144
fp , err := s .networkingService .GetOrCreateFloatingIP (openStackCluster , openStackCluster , clusterName , floatingIPAddress )
114
145
if err != nil {
@@ -307,9 +338,9 @@ func validateIPs(openStackCluster *infrav1.OpenStackCluster, definedCIDRs []stri
307
338
308
339
for _ , v := range definedCIDRs {
309
340
switch {
310
- case net .IsIPv4String (v ):
341
+ case utilsnet .IsIPv4String (v ):
311
342
marshaledCIDRs = append (marshaledCIDRs , v + "/32" )
312
- case net .IsIPv4CIDRString (v ):
343
+ case utilsnet .IsIPv4CIDRString (v ):
313
344
marshaledCIDRs = append (marshaledCIDRs , v )
314
345
default :
315
346
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