@@ -40,9 +40,8 @@ import (
40
40
)
41
41
42
42
const (
43
- networkPrefix string = "k8s-clusterapi"
44
- kubeapiLBSuffix string = "kubeapi"
45
- defaultLoadBalancerProvider string = "amphora"
43
+ networkPrefix string = "k8s-clusterapi"
44
+ kubeapiLBSuffix string = "kubeapi"
46
45
)
47
46
48
47
const loadBalancerProvisioningStatusActive = "ACTIVE"
@@ -64,13 +63,18 @@ func (s *Service) ReconcileLoadBalancer(openStackCluster *infrav1.OpenStackClust
64
63
return err
65
64
}
66
65
67
- // As mostly all LoadBalancer features are only supported on "amphora" we explicitly set the provider
68
- // in the LoadBalancer create call to make sure to get the desired features - even if multiple providers exist.
69
- var lbProvider string
70
- for _ , v := range providers {
71
- if v .Name == defaultLoadBalancerProvider {
72
- lbProvider = v .Name
73
- break
66
+ // Choose the selected provider if it is set in cluster spec, if not, omit the field and Octavia will use the default provider.
67
+ lbProvider := ""
68
+ if openStackCluster .Spec .APIServerLoadBalancer .Provider != "" {
69
+ for _ , v := range providers {
70
+ if v .Name == openStackCluster .Spec .APIServerLoadBalancer .Provider {
71
+ lbProvider = v .Name
72
+ break
73
+ }
74
+ }
75
+ if lbProvider == "" {
76
+ record .Warnf (openStackCluster , "OctaviaProviderNotFound" , "Provider specified for Octavia not found." )
77
+ record .Eventf (openStackCluster , "OctaviaProviderNotFound" , "Provider %s specified for Octavia not found, using the default provider." , openStackCluster .Spec .APIServerLoadBalancer .Provider )
74
78
}
75
79
}
76
80
@@ -124,7 +128,7 @@ func (s *Service) ReconcileLoadBalancer(openStackCluster *infrav1.OpenStackClust
124
128
return err
125
129
}
126
130
127
- pool , err := s .getOrCreatePool (openStackCluster , lbPortObjectsName , listener .ID , lb .ID )
131
+ pool , err := s .getOrCreatePool (openStackCluster , lbPortObjectsName , listener .ID , lb .ID , lb . Provider )
128
132
if err != nil {
129
133
return err
130
134
}
@@ -296,7 +300,7 @@ func validateIPs(openStackCluster *infrav1.OpenStackCluster, definedCIDRs []stri
296
300
return marshaledCIDRs
297
301
}
298
302
299
- func (s * Service ) getOrCreatePool (openStackCluster * infrav1.OpenStackCluster , poolName , listenerID , lbID string ) (* pools.Pool , error ) {
303
+ func (s * Service ) getOrCreatePool (openStackCluster * infrav1.OpenStackCluster , poolName , listenerID , lbID , lbProvider string ) (* pools.Pool , error ) {
300
304
pool , err := s .checkIfPoolExists (poolName )
301
305
if err != nil {
302
306
return nil , err
@@ -308,12 +312,19 @@ func (s *Service) getOrCreatePool(openStackCluster *infrav1.OpenStackCluster, po
308
312
309
313
s .scope .Logger .Info (fmt .Sprintf ("Creating load balancer pool for listener %q" , listenerID ), "name" , poolName , "lb-id" , lbID )
310
314
315
+ method := pools .LBMethodRoundRobin
316
+
317
+ if lbProvider == "ovn" {
318
+ method = pools .LBMethodSourceIpPort
319
+ }
320
+
311
321
poolCreateOpts := pools.CreateOpts {
312
322
Name : poolName ,
313
323
Protocol : "TCP" ,
314
- LBMethod : pools . LBMethodRoundRobin ,
324
+ LBMethod : method ,
315
325
ListenerID : listenerID ,
316
326
}
327
+
317
328
pool , err = s .loadbalancerClient .CreatePool (poolCreateOpts )
318
329
if err != nil {
319
330
record .Warnf (openStackCluster , "FailedCreatePool" , "Failed to create pool %s: %v" , poolName , err )
@@ -351,6 +362,13 @@ func (s *Service) getOrCreateMonitor(openStackCluster *infrav1.OpenStackCluster,
351
362
Timeout : 5 ,
352
363
}
353
364
monitor , err = s .loadbalancerClient .CreateMonitor (monitorCreateOpts )
365
+ // Skip creating monitor if it is not supported by Octavia provider
366
+ if capoerrors .IsNotImplementedError (err ) {
367
+ record .Warnf (openStackCluster , "SkippedCreateMonitor" , "Health monitors are not supported with the current Octavia provider." )
368
+ record .Eventf (openStackCluster , "SkippedCreateMonitor" , "Health Monitor is not created as it's not implemented with the current Octavia provider." )
369
+ return nil
370
+ }
371
+
354
372
if err != nil {
355
373
record .Warnf (openStackCluster , "FailedCreateMonitor" , "Failed to create monitor %s: %v" , monitorName , err )
356
374
return err
0 commit comments