@@ -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 ,
0 commit comments