@@ -158,20 +158,28 @@ func (m *defaultLoadBalancerManager) updateSDKLoadBalancerWithIPAddressType(ctx
158158
159159func (m * defaultLoadBalancerManager ) updateSDKLoadBalancerWithSubnetMappings (ctx context.Context , resLB * elbv2model.LoadBalancer , sdkLB LoadBalancerWithTags ) error {
160160 desiredSubnets := sets .NewString ()
161+ desiredIPv6Addresses := sets .NewString ()
161162 desiredSubnetsSourceNATPrefixes := sets .NewString ()
162163 currentSubnetsSourceNATPrefixes := sets .NewString ()
163164 for _ , mapping := range resLB .Spec .SubnetMappings {
164165 desiredSubnets .Insert (mapping .SubnetID )
165166 if mapping .SourceNatIpv6Prefix != nil {
166167 desiredSubnetsSourceNATPrefixes .Insert (awssdk .ToString (mapping .SourceNatIpv6Prefix ))
167168 }
169+ if mapping .IPv6Address != nil {
170+ desiredIPv6Addresses .Insert (awssdk .ToString (mapping .IPv6Address ))
171+ }
168172 }
169173 currentSubnets := sets .NewString ()
174+ currentIPv6Addresses := sets .NewString ()
170175 for _ , az := range sdkLB .LoadBalancer .AvailabilityZones {
171176 currentSubnets .Insert (awssdk .ToString (az .SubnetId ))
172177 if len (az .SourceNatIpv6Prefixes ) != 0 {
173178 currentSubnetsSourceNATPrefixes .Insert (az .SourceNatIpv6Prefixes [0 ])
174179 }
180+ if len (az .LoadBalancerAddresses ) > 0 && az .LoadBalancerAddresses [0 ].IPv6Address != nil {
181+ currentIPv6Addresses .Insert (awssdk .ToString (az .LoadBalancerAddresses [0 ].IPv6Address ))
182+ }
175183 }
176184 sdkLBEnablePrefixForIpv6SourceNatValue := string (elbv2model .EnablePrefixForIpv6SourceNatOff )
177185 resLBEnablePrefixForIpv6SourceNatValue := string (elbv2model .EnablePrefixForIpv6SourceNatOff )
@@ -180,7 +188,9 @@ func (m *defaultLoadBalancerManager) updateSDKLoadBalancerWithSubnetMappings(ctx
180188
181189 resLBEnablePrefixForIpv6SourceNatValue = string (resLB .Spec .EnablePrefixForIpv6SourceNat )
182190
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 == "" )) {
184194 return nil
185195 }
186196 req := & elbv2sdk.SetSubnetsInput {
@@ -355,3 +365,15 @@ func isEnforceSGInboundRulesOnPrivateLinkUpdated(resLB *elbv2model.LoadBalancer,
355365 return true , currentEnforceSecurityGroupInboundRulesOnPrivateLinkTraffic , desiredEnforceSecurityGroupInboundRulesOnPrivateLinkTraffic
356366
357367}
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