From c70693cb66d4744d89fd6c9f4e4c5cc624f650bd Mon Sep 17 00:00:00 2001
From: root
Date: Thu, 28 Mar 2024 06:09:24 +0000
Subject: [PATCH 1/2] Add opt to use AZ for APISeverLoadBalancer
---
api/v1alpha5/zz_generated.conversion.go | 1 +
api/v1alpha6/zz_generated.conversion.go | 6 +-----
api/v1alpha7/zz_generated.conversion.go | 6 +-----
api/v1beta1/types.go | 4 ++++
api/v1beta1/zz_generated.deepcopy.go | 5 +++++
...structure.cluster.x-k8s.io_openstackclusters.yaml | 4 ++++
...e.cluster.x-k8s.io_openstackclustertemplates.yaml | 4 ++++
docs/book/src/api/v1beta1/api.md | 12 ++++++++++++
pkg/cloud/services/loadbalancer/loadbalancer.go | 4 ++++
9 files changed, 36 insertions(+), 10 deletions(-)
diff --git a/api/v1alpha5/zz_generated.conversion.go b/api/v1alpha5/zz_generated.conversion.go
index f5d208397e..0fc6fc63c2 100644
--- a/api/v1alpha5/zz_generated.conversion.go
+++ b/api/v1alpha5/zz_generated.conversion.go
@@ -426,6 +426,7 @@ func autoConvert_v1beta1_APIServerLoadBalancer_To_v1alpha5_APIServerLoadBalancer
out.AdditionalPorts = *(*[]int)(unsafe.Pointer(&in.AdditionalPorts))
out.AllowedCIDRs = *(*[]string)(unsafe.Pointer(&in.AllowedCIDRs))
// WARNING: in.Provider requires manual conversion: does not exist in peer-type
+ // WARNING: in.AvailabilityZone requires manual conversion: does not exist in peer-type
return nil
}
diff --git a/api/v1alpha6/zz_generated.conversion.go b/api/v1alpha6/zz_generated.conversion.go
index b35e716ad4..61a8126d5b 100644
--- a/api/v1alpha6/zz_generated.conversion.go
+++ b/api/v1alpha6/zz_generated.conversion.go
@@ -445,14 +445,10 @@ func autoConvert_v1beta1_APIServerLoadBalancer_To_v1alpha6_APIServerLoadBalancer
if err := optional.Convert_optional_String_To_string(&in.Provider, &out.Provider, s); err != nil {
return err
}
+ // WARNING: in.AvailabilityZone requires manual conversion: does not exist in peer-type
return nil
}
-// Convert_v1beta1_APIServerLoadBalancer_To_v1alpha6_APIServerLoadBalancer is an autogenerated conversion function.
-func Convert_v1beta1_APIServerLoadBalancer_To_v1alpha6_APIServerLoadBalancer(in *v1beta1.APIServerLoadBalancer, out *APIServerLoadBalancer, s conversion.Scope) error {
- return autoConvert_v1beta1_APIServerLoadBalancer_To_v1alpha6_APIServerLoadBalancer(in, out, s)
-}
-
func autoConvert_v1alpha6_AddressPair_To_v1beta1_AddressPair(in *AddressPair, out *v1beta1.AddressPair, s conversion.Scope) error {
out.IPAddress = in.IPAddress
if err := optional.Convert_string_To_optional_String(&in.MACAddress, &out.MACAddress, s); err != nil {
diff --git a/api/v1alpha7/zz_generated.conversion.go b/api/v1alpha7/zz_generated.conversion.go
index 5646dbe6f8..e0c8c3eb0c 100644
--- a/api/v1alpha7/zz_generated.conversion.go
+++ b/api/v1alpha7/zz_generated.conversion.go
@@ -470,14 +470,10 @@ func autoConvert_v1beta1_APIServerLoadBalancer_To_v1alpha7_APIServerLoadBalancer
if err := optional.Convert_optional_String_To_string(&in.Provider, &out.Provider, s); err != nil {
return err
}
+ // WARNING: in.AvailabilityZone requires manual conversion: does not exist in peer-type
return nil
}
-// Convert_v1beta1_APIServerLoadBalancer_To_v1alpha7_APIServerLoadBalancer is an autogenerated conversion function.
-func Convert_v1beta1_APIServerLoadBalancer_To_v1alpha7_APIServerLoadBalancer(in *v1beta1.APIServerLoadBalancer, out *APIServerLoadBalancer, s conversion.Scope) error {
- return autoConvert_v1beta1_APIServerLoadBalancer_To_v1alpha7_APIServerLoadBalancer(in, out, s)
-}
-
func autoConvert_v1alpha7_AdditionalBlockDevice_To_v1beta1_AdditionalBlockDevice(in *AdditionalBlockDevice, out *v1beta1.AdditionalBlockDevice, s conversion.Scope) error {
out.Name = in.Name
out.SizeGiB = in.SizeGiB
diff --git a/api/v1beta1/types.go b/api/v1beta1/types.go
index d2d90d8f6e..6b0b40eb40 100644
--- a/api/v1beta1/types.go
+++ b/api/v1beta1/types.go
@@ -654,6 +654,10 @@ type APIServerLoadBalancer struct {
// specified.
// +optional
Provider optional.String `json:"provider,omitempty"`
+
+ // AvailabilityZone is the failure domain that will be used to create the APIServerLoadBalancer Spec.
+ //+optional
+ AvailabilityZone optional.String `json:"availabilityZone,omitempty"`
}
func (s *APIServerLoadBalancer) IsZero() bool {
diff --git a/api/v1beta1/zz_generated.deepcopy.go b/api/v1beta1/zz_generated.deepcopy.go
index b5d80bafff..a3fcd63c13 100644
--- a/api/v1beta1/zz_generated.deepcopy.go
+++ b/api/v1beta1/zz_generated.deepcopy.go
@@ -50,6 +50,11 @@ func (in *APIServerLoadBalancer) DeepCopyInto(out *APIServerLoadBalancer) {
*out = new(string)
**out = **in
}
+ if in.AvailabilityZone != nil {
+ in, out := &in.AvailabilityZone, &out.AvailabilityZone
+ *out = new(string)
+ **out = **in
+ }
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new APIServerLoadBalancer.
diff --git a/config/crd/bases/infrastructure.cluster.x-k8s.io_openstackclusters.yaml b/config/crd/bases/infrastructure.cluster.x-k8s.io_openstackclusters.yaml
index 4aa7ca14b0..8a99dc7710 100644
--- a/config/crd/bases/infrastructure.cluster.x-k8s.io_openstackclusters.yaml
+++ b/config/crd/bases/infrastructure.cluster.x-k8s.io_openstackclusters.yaml
@@ -4882,6 +4882,10 @@ spec:
type: string
type: array
x-kubernetes-list-type: set
+ availabilityZone:
+ description: AvailabilityZone is the failure domain that will
+ be used to create the APIServerLoadBalancer Spec.
+ type: string
enabled:
default: true
description: |-
diff --git a/config/crd/bases/infrastructure.cluster.x-k8s.io_openstackclustertemplates.yaml b/config/crd/bases/infrastructure.cluster.x-k8s.io_openstackclustertemplates.yaml
index 66b4e12174..1c0e9b658c 100644
--- a/config/crd/bases/infrastructure.cluster.x-k8s.io_openstackclustertemplates.yaml
+++ b/config/crd/bases/infrastructure.cluster.x-k8s.io_openstackclustertemplates.yaml
@@ -2306,6 +2306,10 @@ spec:
type: string
type: array
x-kubernetes-list-type: set
+ availabilityZone:
+ description: AvailabilityZone is the failure domain that
+ will be used to create the APIServerLoadBalancer Spec.
+ type: string
enabled:
default: true
description: |-
diff --git a/docs/book/src/api/v1beta1/api.md b/docs/book/src/api/v1beta1/api.md
index c60863aaf2..5f84388151 100644
--- a/docs/book/src/api/v1beta1/api.md
+++ b/docs/book/src/api/v1beta1/api.md
@@ -913,6 +913,18 @@ API load balancer. The Octavia default will be used if it is not
specified.
+
+
+availabilityZone
+
+string
+
+ |
+
+(Optional)
+ AvailabilityZone is the failure domain that will be used to create the APIServerLoadBalancer Spec.
+ |
+
AdditionalBlockDevice
diff --git a/pkg/cloud/services/loadbalancer/loadbalancer.go b/pkg/cloud/services/loadbalancer/loadbalancer.go
index 2de72c81d6..0dde10384c 100644
--- a/pkg/cloud/services/loadbalancer/loadbalancer.go
+++ b/pkg/cloud/services/loadbalancer/loadbalancer.go
@@ -298,6 +298,7 @@ func (s *Service) getOrCreateAPILoadBalancer(openStackCluster *infrav1.OpenStack
if err != nil {
return nil, err
}
+ availabilityZone := openStackCluster.Spec.APIServerLoadBalancer.AvailabilityZone
lbCreateOpts := loadbalancers.CreateOpts{
Name: loadBalancerName,
@@ -306,6 +307,9 @@ func (s *Service) getOrCreateAPILoadBalancer(openStackCluster *infrav1.OpenStack
Provider: lbProvider,
Tags: openStackCluster.Spec.Tags,
}
+ if availabilityZone != nil {
+ lbCreateOpts.AvailabilityZone = *availabilityZone
+ }
if vipAddress != nil {
lbCreateOpts.VipAddress = *vipAddress
}
From dfbc3ef4b62f24a745b6587284e275df277f26c5 Mon Sep 17 00:00:00 2001
From: root
Date: Thu, 28 Mar 2024 06:09:24 +0000
Subject: [PATCH 2/2] Add opt to use AZ for APISeverLoadBalancer
---
api/v1alpha5/zz_generated.conversion.go | 1 +
api/v1alpha6/openstackcluster_conversion.go | 2 ++
api/v1alpha6/types_conversion.go | 9 +++++++
api/v1alpha6/zz_generated.conversion.go | 6 +----
api/v1alpha7/openstackcluster_conversion.go | 2 ++
api/v1alpha7/types_conversion.go | 11 ++++++++
api/v1alpha7/zz_generated.conversion.go | 6 +----
api/v1beta1/types.go | 4 +++
api/v1beta1/zz_generated.deepcopy.go | 5 ++++
...re.cluster.x-k8s.io_openstackclusters.yaml | 4 +++
...er.x-k8s.io_openstackclustertemplates.yaml | 4 +++
docs/book/src/api/v1beta1/api.md | 12 +++++++++
.../services/loadbalancer/loadbalancer.go | 25 ++++++++++++-------
13 files changed, 72 insertions(+), 19 deletions(-)
diff --git a/api/v1alpha5/zz_generated.conversion.go b/api/v1alpha5/zz_generated.conversion.go
index f5d208397e..0fc6fc63c2 100644
--- a/api/v1alpha5/zz_generated.conversion.go
+++ b/api/v1alpha5/zz_generated.conversion.go
@@ -426,6 +426,7 @@ func autoConvert_v1beta1_APIServerLoadBalancer_To_v1alpha5_APIServerLoadBalancer
out.AdditionalPorts = *(*[]int)(unsafe.Pointer(&in.AdditionalPorts))
out.AllowedCIDRs = *(*[]string)(unsafe.Pointer(&in.AllowedCIDRs))
// WARNING: in.Provider requires manual conversion: does not exist in peer-type
+ // WARNING: in.AvailabilityZone requires manual conversion: does not exist in peer-type
return nil
}
diff --git a/api/v1alpha6/openstackcluster_conversion.go b/api/v1alpha6/openstackcluster_conversion.go
index 92fe7df622..156583b69f 100644
--- a/api/v1alpha6/openstackcluster_conversion.go
+++ b/api/v1alpha6/openstackcluster_conversion.go
@@ -218,6 +218,8 @@ func restorev1beta1ClusterSpec(previous *infrav1.OpenStackClusterSpec, dst *infr
optional.RestoreBool(&previous.DisableAPIServerFloatingIP, &dst.DisableAPIServerFloatingIP)
optional.RestoreBool(&previous.ControlPlaneOmitAvailabilityZone, &dst.ControlPlaneOmitAvailabilityZone)
optional.RestoreBool(&previous.DisablePortSecurity, &dst.DisablePortSecurity)
+
+ restorev1beta1APIServerLoadBalancer(previous.APIServerLoadBalancer, dst.APIServerLoadBalancer)
}
func Convert_v1alpha6_OpenStackClusterSpec_To_v1beta1_OpenStackClusterSpec(in *OpenStackClusterSpec, out *infrav1.OpenStackClusterSpec, s apiconversion.Scope) error {
diff --git a/api/v1alpha6/types_conversion.go b/api/v1alpha6/types_conversion.go
index 6ec354ecee..c82bbfb5de 100644
--- a/api/v1alpha6/types_conversion.go
+++ b/api/v1alpha6/types_conversion.go
@@ -392,3 +392,12 @@ func Convert_v1beta1_OpenStackIdentityReference_To_v1alpha6_OpenStackIdentityRef
out.Name = in.Name
return nil
}
+
+func restorev1beta1APIServerLoadBalancer(previous *infrav1.APIServerLoadBalancer, dst *infrav1.APIServerLoadBalancer) {
+ if dst == nil || previous == nil {
+ return
+ }
+
+ // AZ doesn't exist in v1alpha6, so always restore.
+ dst.AvailabilityZone = previous.AvailabilityZone
+}
diff --git a/api/v1alpha6/zz_generated.conversion.go b/api/v1alpha6/zz_generated.conversion.go
index b35e716ad4..61a8126d5b 100644
--- a/api/v1alpha6/zz_generated.conversion.go
+++ b/api/v1alpha6/zz_generated.conversion.go
@@ -445,14 +445,10 @@ func autoConvert_v1beta1_APIServerLoadBalancer_To_v1alpha6_APIServerLoadBalancer
if err := optional.Convert_optional_String_To_string(&in.Provider, &out.Provider, s); err != nil {
return err
}
+ // WARNING: in.AvailabilityZone requires manual conversion: does not exist in peer-type
return nil
}
-// Convert_v1beta1_APIServerLoadBalancer_To_v1alpha6_APIServerLoadBalancer is an autogenerated conversion function.
-func Convert_v1beta1_APIServerLoadBalancer_To_v1alpha6_APIServerLoadBalancer(in *v1beta1.APIServerLoadBalancer, out *APIServerLoadBalancer, s conversion.Scope) error {
- return autoConvert_v1beta1_APIServerLoadBalancer_To_v1alpha6_APIServerLoadBalancer(in, out, s)
-}
-
func autoConvert_v1alpha6_AddressPair_To_v1beta1_AddressPair(in *AddressPair, out *v1beta1.AddressPair, s conversion.Scope) error {
out.IPAddress = in.IPAddress
if err := optional.Convert_string_To_optional_String(&in.MACAddress, &out.MACAddress, s); err != nil {
diff --git a/api/v1alpha7/openstackcluster_conversion.go b/api/v1alpha7/openstackcluster_conversion.go
index 3defae462a..f4555820de 100644
--- a/api/v1alpha7/openstackcluster_conversion.go
+++ b/api/v1alpha7/openstackcluster_conversion.go
@@ -222,6 +222,8 @@ func restorev1beta1ClusterSpec(previous *infrav1.OpenStackClusterSpec, dst *infr
optional.RestoreBool(&previous.DisableAPIServerFloatingIP, &dst.DisableAPIServerFloatingIP)
optional.RestoreBool(&previous.ControlPlaneOmitAvailabilityZone, &dst.ControlPlaneOmitAvailabilityZone)
optional.RestoreBool(&previous.DisablePortSecurity, &dst.DisablePortSecurity)
+
+ restorev1beta1APIServerLoadBalancer(previous.APIServerLoadBalancer, dst.APIServerLoadBalancer)
}
func Convert_v1alpha7_OpenStackClusterSpec_To_v1beta1_OpenStackClusterSpec(in *OpenStackClusterSpec, out *infrav1.OpenStackClusterSpec, s apiconversion.Scope) error {
diff --git a/api/v1alpha7/types_conversion.go b/api/v1alpha7/types_conversion.go
index 98bdd6df26..5a1249d78d 100644
--- a/api/v1alpha7/types_conversion.go
+++ b/api/v1alpha7/types_conversion.go
@@ -351,3 +351,14 @@ func Convert_v1beta1_OpenStackIdentityReference_To_v1alpha7_OpenStackIdentityRef
out.Name = in.Name
return nil
}
+
+/* APIServerLoadBalancer */
+
+func restorev1beta1APIServerLoadBalancer(previous *infrav1.APIServerLoadBalancer, dst *infrav1.APIServerLoadBalancer) {
+ if dst == nil || previous == nil {
+ return
+ }
+
+ // AZ doesn't exist in v1alpha6, so always restore.
+ dst.AvailabilityZone = previous.AvailabilityZone
+}
diff --git a/api/v1alpha7/zz_generated.conversion.go b/api/v1alpha7/zz_generated.conversion.go
index 5646dbe6f8..e0c8c3eb0c 100644
--- a/api/v1alpha7/zz_generated.conversion.go
+++ b/api/v1alpha7/zz_generated.conversion.go
@@ -470,14 +470,10 @@ func autoConvert_v1beta1_APIServerLoadBalancer_To_v1alpha7_APIServerLoadBalancer
if err := optional.Convert_optional_String_To_string(&in.Provider, &out.Provider, s); err != nil {
return err
}
+ // WARNING: in.AvailabilityZone requires manual conversion: does not exist in peer-type
return nil
}
-// Convert_v1beta1_APIServerLoadBalancer_To_v1alpha7_APIServerLoadBalancer is an autogenerated conversion function.
-func Convert_v1beta1_APIServerLoadBalancer_To_v1alpha7_APIServerLoadBalancer(in *v1beta1.APIServerLoadBalancer, out *APIServerLoadBalancer, s conversion.Scope) error {
- return autoConvert_v1beta1_APIServerLoadBalancer_To_v1alpha7_APIServerLoadBalancer(in, out, s)
-}
-
func autoConvert_v1alpha7_AdditionalBlockDevice_To_v1beta1_AdditionalBlockDevice(in *AdditionalBlockDevice, out *v1beta1.AdditionalBlockDevice, s conversion.Scope) error {
out.Name = in.Name
out.SizeGiB = in.SizeGiB
diff --git a/api/v1beta1/types.go b/api/v1beta1/types.go
index d2d90d8f6e..6b0b40eb40 100644
--- a/api/v1beta1/types.go
+++ b/api/v1beta1/types.go
@@ -654,6 +654,10 @@ type APIServerLoadBalancer struct {
// specified.
// +optional
Provider optional.String `json:"provider,omitempty"`
+
+ // AvailabilityZone is the failure domain that will be used to create the APIServerLoadBalancer Spec.
+ //+optional
+ AvailabilityZone optional.String `json:"availabilityZone,omitempty"`
}
func (s *APIServerLoadBalancer) IsZero() bool {
diff --git a/api/v1beta1/zz_generated.deepcopy.go b/api/v1beta1/zz_generated.deepcopy.go
index b5d80bafff..a3fcd63c13 100644
--- a/api/v1beta1/zz_generated.deepcopy.go
+++ b/api/v1beta1/zz_generated.deepcopy.go
@@ -50,6 +50,11 @@ func (in *APIServerLoadBalancer) DeepCopyInto(out *APIServerLoadBalancer) {
*out = new(string)
**out = **in
}
+ if in.AvailabilityZone != nil {
+ in, out := &in.AvailabilityZone, &out.AvailabilityZone
+ *out = new(string)
+ **out = **in
+ }
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new APIServerLoadBalancer.
diff --git a/config/crd/bases/infrastructure.cluster.x-k8s.io_openstackclusters.yaml b/config/crd/bases/infrastructure.cluster.x-k8s.io_openstackclusters.yaml
index 4aa7ca14b0..8a99dc7710 100644
--- a/config/crd/bases/infrastructure.cluster.x-k8s.io_openstackclusters.yaml
+++ b/config/crd/bases/infrastructure.cluster.x-k8s.io_openstackclusters.yaml
@@ -4882,6 +4882,10 @@ spec:
type: string
type: array
x-kubernetes-list-type: set
+ availabilityZone:
+ description: AvailabilityZone is the failure domain that will
+ be used to create the APIServerLoadBalancer Spec.
+ type: string
enabled:
default: true
description: |-
diff --git a/config/crd/bases/infrastructure.cluster.x-k8s.io_openstackclustertemplates.yaml b/config/crd/bases/infrastructure.cluster.x-k8s.io_openstackclustertemplates.yaml
index 66b4e12174..1c0e9b658c 100644
--- a/config/crd/bases/infrastructure.cluster.x-k8s.io_openstackclustertemplates.yaml
+++ b/config/crd/bases/infrastructure.cluster.x-k8s.io_openstackclustertemplates.yaml
@@ -2306,6 +2306,10 @@ spec:
type: string
type: array
x-kubernetes-list-type: set
+ availabilityZone:
+ description: AvailabilityZone is the failure domain that
+ will be used to create the APIServerLoadBalancer Spec.
+ type: string
enabled:
default: true
description: |-
diff --git a/docs/book/src/api/v1beta1/api.md b/docs/book/src/api/v1beta1/api.md
index c60863aaf2..5f84388151 100644
--- a/docs/book/src/api/v1beta1/api.md
+++ b/docs/book/src/api/v1beta1/api.md
@@ -913,6 +913,18 @@ API load balancer. The Octavia default will be used if it is not
specified.
+
+
+availabilityZone
+
+string
+
+ |
+
+(Optional)
+ AvailabilityZone is the failure domain that will be used to create the APIServerLoadBalancer Spec.
+ |
+
AdditionalBlockDevice
diff --git a/pkg/cloud/services/loadbalancer/loadbalancer.go b/pkg/cloud/services/loadbalancer/loadbalancer.go
index 2de72c81d6..6efda043da 100644
--- a/pkg/cloud/services/loadbalancer/loadbalancer.go
+++ b/pkg/cloud/services/loadbalancer/loadbalancer.go
@@ -281,17 +281,21 @@ func (s *Service) getOrCreateAPILoadBalancer(openStackCluster *infrav1.OpenStack
// Choose the selected provider if it is set in cluster spec, if not, omit the field and Octavia will use the default provider.
lbProvider := ""
- if openStackCluster.Spec.APIServerLoadBalancer != nil && openStackCluster.Spec.APIServerLoadBalancer.Provider != nil {
- for _, v := range providers {
- if v.Name == *openStackCluster.Spec.APIServerLoadBalancer.Provider {
- lbProvider = v.Name
- break
+ var availabilityZone *string
+ if openStackCluster.Spec.APIServerLoadBalancer != nil {
+ if openStackCluster.Spec.APIServerLoadBalancer.Provider != nil {
+ for _, v := range providers {
+ if v.Name == *openStackCluster.Spec.APIServerLoadBalancer.Provider {
+ lbProvider = v.Name
+ break
+ }
+ }
+ if lbProvider == "" {
+ record.Warnf(openStackCluster, "OctaviaProviderNotFound", "Provider specified for Octavia not found.")
+ record.Eventf(openStackCluster, "OctaviaProviderNotFound", "Provider %s specified for Octavia not found, using the default provider.", openStackCluster.Spec.APIServerLoadBalancer.Provider)
}
}
- if lbProvider == "" {
- record.Warnf(openStackCluster, "OctaviaProviderNotFound", "Provider specified for Octavia not found.")
- record.Eventf(openStackCluster, "OctaviaProviderNotFound", "Provider %s specified for Octavia not found, using the default provider.", openStackCluster.Spec.APIServerLoadBalancer.Provider)
- }
+ availabilityZone = openStackCluster.Spec.APIServerLoadBalancer.AvailabilityZone
}
vipAddress, err := getAPIServerVIPAddress(openStackCluster)
@@ -306,6 +310,9 @@ func (s *Service) getOrCreateAPILoadBalancer(openStackCluster *infrav1.OpenStack
Provider: lbProvider,
Tags: openStackCluster.Spec.Tags,
}
+ if availabilityZone != nil {
+ lbCreateOpts.AvailabilityZone = *availabilityZone
+ }
if vipAddress != nil {
lbCreateOpts.VipAddress = *vipAddress
}