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 }