Skip to content

Add opt to use AZ for APISeverLoadBalancer #2004

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Apr 11, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions api/v1alpha5/zz_generated.conversion.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions api/v1alpha6/conversion_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -793,4 +793,5 @@ func Test_FuzzRestorers(t *testing.T) {
testhelpers.FuzzRestorer(t, "restorev1beta1SubnetParam", restorev1beta1SubnetParam)
testhelpers.FuzzRestorer(t, "restorev1alpha6Port", restorev1alpha6Port)
testhelpers.FuzzRestorer(t, "restorev1alpha6SecurityGroup", restorev1alpha6SecurityGroup)
testhelpers.FuzzRestorer(t, "restorev1beta1APIServerLoadBalancer", restorev1beta1APIServerLoadBalancer)
}
2 changes: 2 additions & 0 deletions api/v1alpha6/openstackcluster_conversion.go
Original file line number Diff line number Diff line change
Expand Up @@ -232,6 +232,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 {
Expand Down
12 changes: 11 additions & 1 deletion api/v1alpha6/types_conversion.go
Original file line number Diff line number Diff line change
Expand Up @@ -497,7 +497,6 @@ func Convert_v1alpha6_SecurityGroup_To_v1beta1_SecurityGroupStatus(in *SecurityG
}

/* SecurityGroupRule */
/* APIServerLoadBalancer */
/* ValueSpec */
/* OpenStackIdentityReference */

Expand All @@ -510,6 +509,17 @@ func Convert_v1beta1_OpenStackIdentityReference_To_v1alpha6_OpenStackIdentityRef
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
}

/* Placeholders */

// conversion-gen registers these functions so we must provider stubs, but
Expand Down
1 change: 1 addition & 0 deletions api/v1alpha6/zz_generated.conversion.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions api/v1alpha7/conversion_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -405,4 +405,5 @@ func Test_FuzzRestorers(t *testing.T) {
testhelpers.FuzzRestorer(t, "restorev1beta1RouterParam", restorev1beta1RouterParam)
testhelpers.FuzzRestorer(t, "restorev1alpha7Port", restorev1alpha7Port)
testhelpers.FuzzRestorer(t, "restorev1beta1Port", restorev1beta1Port)
testhelpers.FuzzRestorer(t, "restorev1beta1APIServerLoadBalancer", restorev1beta1APIServerLoadBalancer)
}
2 changes: 2 additions & 0 deletions api/v1alpha7/openstackcluster_conversion.go
Original file line number Diff line number Diff line change
Expand Up @@ -239,6 +239,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 {
Expand Down
11 changes: 11 additions & 0 deletions api/v1alpha7/types_conversion.go
Original file line number Diff line number Diff line change
Expand Up @@ -510,6 +510,17 @@ func Convert_v1beta1_OpenStackIdentityReference_To_v1alpha7_OpenStackIdentityRef
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
}

/* Placeholders */

// conversion-gen registers these functions so we must provider stubs, but
Expand Down
1 change: 1 addition & 0 deletions api/v1alpha7/zz_generated.conversion.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions api/v1beta1/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -812,13 +812,18 @@ type APIServerLoadBalancer struct {
// Network defines which network should the load balancer be allocated on.
//+optional
Network *NetworkParam `json:"network,omitempty"`

// Subnets define which subnets should the load balancer be allocated on.
// It is expected that subnets are located on the network specified in this resource.
// Only the first element is taken into account.
// +optional
// +listType=atomic
// kubebuilder:validation:MaxLength:=2
Subnets []SubnetParam `json:"subnets,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 {
Expand Down
5 changes: 5 additions & 0 deletions api/v1beta1/zz_generated.deepcopy.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 12 additions & 0 deletions docs/book/src/api/v1beta1/api.md

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

25 changes: 16 additions & 9 deletions pkg/cloud/services/loadbalancer/loadbalancer.go
Original file line number Diff line number Diff line change
Expand Up @@ -306,17 +306,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)
Expand All @@ -332,6 +336,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
}
Expand Down