@@ -158,20 +158,28 @@ func (m *defaultLoadBalancerManager) updateSDKLoadBalancerWithIPAddressType(ctx
158
158
159
159
func (m * defaultLoadBalancerManager ) updateSDKLoadBalancerWithSubnetMappings (ctx context.Context , resLB * elbv2model.LoadBalancer , sdkLB LoadBalancerWithTags ) error {
160
160
desiredSubnets := sets .NewString ()
161
+ desiredIPv6Addresses := sets .NewString ()
161
162
desiredSubnetsSourceNATPrefixes := sets .NewString ()
162
163
currentSubnetsSourceNATPrefixes := sets .NewString ()
163
164
for _ , mapping := range resLB .Spec .SubnetMappings {
164
165
desiredSubnets .Insert (mapping .SubnetID )
165
166
if mapping .SourceNatIpv6Prefix != nil {
166
167
desiredSubnetsSourceNATPrefixes .Insert (awssdk .ToString (mapping .SourceNatIpv6Prefix ))
167
168
}
169
+ if mapping .IPv6Address != nil {
170
+ desiredIPv6Addresses .Insert (awssdk .ToString (mapping .IPv6Address ))
171
+ }
168
172
}
169
173
currentSubnets := sets .NewString ()
174
+ currentIPv6Addresses := sets .NewString ()
170
175
for _ , az := range sdkLB .LoadBalancer .AvailabilityZones {
171
176
currentSubnets .Insert (awssdk .ToString (az .SubnetId ))
172
177
if len (az .SourceNatIpv6Prefixes ) != 0 {
173
178
currentSubnetsSourceNATPrefixes .Insert (az .SourceNatIpv6Prefixes [0 ])
174
179
}
180
+ if len (az .LoadBalancerAddresses ) > 0 && az .LoadBalancerAddresses [0 ].IPv6Address != nil {
181
+ currentIPv6Addresses .Insert (awssdk .ToString (az .LoadBalancerAddresses [0 ].IPv6Address ))
182
+ }
175
183
}
176
184
sdkLBEnablePrefixForIpv6SourceNatValue := string (elbv2model .EnablePrefixForIpv6SourceNatOff )
177
185
resLBEnablePrefixForIpv6SourceNatValue := string (elbv2model .EnablePrefixForIpv6SourceNatOff )
@@ -180,7 +188,9 @@ func (m *defaultLoadBalancerManager) updateSDKLoadBalancerWithSubnetMappings(ctx
180
188
181
189
resLBEnablePrefixForIpv6SourceNatValue = string (resLB .Spec .EnablePrefixForIpv6SourceNat )
182
190
183
- if desiredSubnets .Equal (currentSubnets ) && desiredSubnetsSourceNATPrefixes .Equal (currentSubnetsSourceNATPrefixes ) && ((sdkLBEnablePrefixForIpv6SourceNatValue == resLBEnablePrefixForIpv6SourceNatValue ) || (resLBEnablePrefixForIpv6SourceNatValue == "" )) {
191
+ isFirstTimeIPv6Setup := currentIPv6Addresses .Len () == 0 && desiredIPv6Addresses .Len () > 0
192
+ needsDualstackIPv6Update := isIPv4ToDualstackUpdate (resLB , sdkLB ) && isFirstTimeIPv6Setup
193
+ if ! needsDualstackIPv6Update && desiredSubnets .Equal (currentSubnets ) && desiredSubnetsSourceNATPrefixes .Equal (currentSubnetsSourceNATPrefixes ) && ((sdkLBEnablePrefixForIpv6SourceNatValue == resLBEnablePrefixForIpv6SourceNatValue ) || (resLBEnablePrefixForIpv6SourceNatValue == "" )) {
184
194
return nil
185
195
}
186
196
req := & elbv2sdk.SetSubnetsInput {
@@ -355,3 +365,15 @@ func isEnforceSGInboundRulesOnPrivateLinkUpdated(resLB *elbv2model.LoadBalancer,
355
365
return true , currentEnforceSecurityGroupInboundRulesOnPrivateLinkTraffic , desiredEnforceSecurityGroupInboundRulesOnPrivateLinkTraffic
356
366
357
367
}
368
+
369
+ func isIPv4ToDualstackUpdate (resLB * elbv2model.LoadBalancer , sdkLB LoadBalancerWithTags ) bool {
370
+ if & resLB .Spec .IPAddressType == nil {
371
+ return false
372
+ }
373
+ desiredIPAddressType := string (resLB .Spec .IPAddressType )
374
+ currentIPAddressType := sdkLB .LoadBalancer .IpAddressType
375
+ isIPAddressTypeUpdated := desiredIPAddressType != string (currentIPAddressType )
376
+ return isIPAddressTypeUpdated &&
377
+ resLB .Spec .Type == elbv2model .LoadBalancerTypeNetwork &&
378
+ desiredIPAddressType == string (elbv2model .IPAddressTypeDualStack )
379
+ }
0 commit comments