Skip to content

Commit 95299c9

Browse files
authored
Merge pull request #2862 from sedefsavas/v1alpha3-internet-facing-fix
[Backport-v1alpha3] Correct the casing of internet-facing ELB scheme
2 parents 6e79eba + 65f1525 commit 95299c9

File tree

5 files changed

+53
-15
lines changed

5 files changed

+53
-15
lines changed

api/v1alpha3/awscluster_types.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -144,9 +144,9 @@ type Bastion struct {
144144

145145
// AWSLoadBalancerSpec defines the desired state of an AWS load balancer
146146
type AWSLoadBalancerSpec struct {
147-
// Scheme sets the scheme of the load balancer (defaults to Internet-facing)
148-
// +kubebuilder:default=Internet-facing
149-
// +kubebuilder:validation:Enum=Internet-facing;internal
147+
// Scheme sets the scheme of the load balancer (defaults to internet-facing)
148+
// +kubebuilder:default=internet-facing
149+
// +kubebuilder:validation:Enum=internet-facing;Internet-facing;internal
150150
// +optional
151151
Scheme *ClassicELBScheme `json:"scheme,omitempty"`
152152

api/v1alpha3/awscluster_webhook.go

Lines changed: 31 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -73,20 +73,34 @@ func (r *AWSCluster) ValidateUpdate(old runtime.Object) error {
7373
)
7474
}
7575

76-
existingLoadBalancer := &AWSLoadBalancerSpec{}
7776
newLoadBalancer := &AWSLoadBalancerSpec{}
7877

79-
if oldC.Spec.ControlPlaneLoadBalancer != nil {
80-
existingLoadBalancer = oldC.Spec.ControlPlaneLoadBalancer.DeepCopy()
81-
}
8278
if r.Spec.ControlPlaneLoadBalancer != nil {
8379
newLoadBalancer = r.Spec.ControlPlaneLoadBalancer.DeepCopy()
8480
}
85-
if !reflect.DeepEqual(existingLoadBalancer.Scheme, newLoadBalancer.Scheme) {
86-
allErrs = append(allErrs,
87-
field.Invalid(field.NewPath("spec", "controlPlaneLoadBalancer", "scheme"),
88-
r.Spec.ControlPlaneLoadBalancer.Scheme, "field is immutable"),
89-
)
81+
82+
if oldC.Spec.ControlPlaneLoadBalancer == nil {
83+
// If old scheme was nil, the only value accepted here is the default value: internet-facing
84+
if newLoadBalancer.Scheme != nil && newLoadBalancer.Scheme.String() != ClassicELBSchemeInternetFacing.String() {
85+
allErrs = append(allErrs,
86+
field.Invalid(field.NewPath("spec", "controlPlaneLoadBalancer", "scheme"),
87+
r.Spec.ControlPlaneLoadBalancer.Scheme, "field is immutable, default value was set to internet-facing"),
88+
)
89+
}
90+
}
91+
if oldC.Spec.ControlPlaneLoadBalancer != nil {
92+
existingLoadBalancer := oldC.Spec.ControlPlaneLoadBalancer.DeepCopy()
93+
94+
if !reflect.DeepEqual(existingLoadBalancer.Scheme, newLoadBalancer.Scheme) {
95+
// Only allow changes from Internet-facing scheme to internet-facing.
96+
if newLoadBalancer.Scheme == nil || !(existingLoadBalancer.Scheme.String() == ClassicELBSchemeIncorrectInternetFacing.String() &&
97+
newLoadBalancer.Scheme.String() == ClassicELBSchemeInternetFacing.String()) {
98+
allErrs = append(allErrs,
99+
field.Invalid(field.NewPath("spec", "controlPlaneLoadBalancer", "scheme"),
100+
r.Spec.ControlPlaneLoadBalancer.Scheme, "field is immutable"),
101+
)
102+
}
103+
}
90104
}
91105

92106
if !reflect.DeepEqual(oldC.Spec.ControlPlaneEndpoint, clusterv1.APIEndpoint{}) &&
@@ -126,6 +140,14 @@ func (r *AWSCluster) Default() {
126140
SetDefaults_Bastion(&r.Spec.Bastion)
127141
SetDefaults_NetworkSpec(&r.Spec.NetworkSpec)
128142

143+
if r.Spec.ControlPlaneLoadBalancer == nil {
144+
// Default nil scheme to internet-facing.
145+
r.Spec.ControlPlaneLoadBalancer = &AWSLoadBalancerSpec{Scheme: &ClassicELBSchemeInternetFacing}
146+
} else if r.Spec.ControlPlaneLoadBalancer.Scheme != nil && r.Spec.ControlPlaneLoadBalancer.Scheme.String() == ClassicELBSchemeIncorrectInternetFacing.String() {
147+
// If ELB scheme is set to Internet-facing due to an API bug in versions > v0.6.6, default it to internet-facing.
148+
r.Spec.ControlPlaneLoadBalancer.Scheme = &ClassicELBSchemeInternetFacing
149+
}
150+
129151
if r.Spec.IdentityRef == nil {
130152
r.Spec.IdentityRef = &AWSIdentityReference{
131153
Kind: ControllerIdentityKind,

api/v1alpha3/types.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,13 +89,20 @@ type ClassicELBScheme string
8989
var (
9090
// ClassicELBSchemeInternetFacing defines an internet-facing, publicly
9191
// accessible AWS Classic ELB scheme
92-
ClassicELBSchemeInternetFacing = ClassicELBScheme("Internet-facing")
92+
ClassicELBSchemeInternetFacing = ClassicELBScheme("internet-facing")
9393

9494
// ClassicELBSchemeInternal defines an internal-only facing
9595
// load balancer internal to an ELB.
9696
ClassicELBSchemeInternal = ClassicELBScheme("internal")
97+
98+
// ClassicELBSchemeIncorrectInternetFacing was inaccurately used to define an internet-facing LB in v0.6 releases > v0.6.6 and v0.7.0 release.
99+
ClassicELBSchemeIncorrectInternetFacing = ClassicELBScheme("Internet-facing")
97100
)
98101

102+
func (e ClassicELBScheme) String() string {
103+
return string(e)
104+
}
105+
99106
// ClassicELBProtocol defines listener protocols for a classic load balancer.
100107
type ClassicELBProtocol string
101108

config/crd/bases/infrastructure.cluster.x-k8s.io_awsclusters.yaml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -539,10 +539,11 @@ spec:
539539
to false."
540540
type: boolean
541541
scheme:
542-
default: Internet-facing
542+
default: internet-facing
543543
description: Scheme sets the scheme of the load balancer (defaults
544-
to Internet-facing)
544+
to internet-facing)
545545
enum:
546+
- internet-facing
546547
- Internet-facing
547548
- internal
548549
type: string

pkg/cloud/services/elb/loadbalancer.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,14 @@ func (s *Service) getAPIServerClassicELBSpec() (*infrav1.ClassicELB, error) {
316316
}
317317
securityGroupIDs = append(securityGroupIDs, s.scope.SecurityGroups()[infrav1.SecurityGroupAPIServerLB].ID)
318318

319+
// If ELB scheme is set to Internet-facing due to an API bug in versions > v0.6.6, change it to internet-facing and patch.
320+
if s.scope.ControlPlaneLoadBalancerScheme().String() == infrav1.ClassicELBSchemeIncorrectInternetFacing.String() {
321+
s.scope.ControlPlaneLoadBalancer().Scheme = &infrav1.ClassicELBSchemeInternetFacing
322+
if err := s.scope.PatchObject(); err != nil {
323+
return nil, err
324+
}
325+
}
326+
319327
res := &infrav1.ClassicELB{
320328
Name: elbName,
321329
Scheme: s.scope.ControlPlaneLoadBalancerScheme(),

0 commit comments

Comments
 (0)