@@ -73,20 +73,34 @@ func (r *AWSCluster) ValidateUpdate(old runtime.Object) error {
73
73
)
74
74
}
75
75
76
- existingLoadBalancer := & AWSLoadBalancerSpec {}
77
76
newLoadBalancer := & AWSLoadBalancerSpec {}
78
77
79
- if oldC .Spec .ControlPlaneLoadBalancer != nil {
80
- existingLoadBalancer = oldC .Spec .ControlPlaneLoadBalancer .DeepCopy ()
81
- }
82
78
if r .Spec .ControlPlaneLoadBalancer != nil {
83
79
newLoadBalancer = r .Spec .ControlPlaneLoadBalancer .DeepCopy ()
84
80
}
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
+ }
90
104
}
91
105
92
106
if ! reflect .DeepEqual (oldC .Spec .ControlPlaneEndpoint , clusterv1.APIEndpoint {}) &&
@@ -126,6 +140,14 @@ func (r *AWSCluster) Default() {
126
140
SetDefaults_Bastion (& r .Spec .Bastion )
127
141
SetDefaults_NetworkSpec (& r .Spec .NetworkSpec )
128
142
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
+
129
151
if r .Spec .IdentityRef == nil {
130
152
r .Spec .IdentityRef = & AWSIdentityReference {
131
153
Kind : ControllerIdentityKind ,
0 commit comments