Skip to content

Commit d88dac5

Browse files
authored
Merge pull request #3959 from wweiwei-li/main
fix: Cannot set the IPv6 addresses in dualstack mode during modification
2 parents 4c9f8a1 + 643f33d commit d88dac5

File tree

2 files changed

+74
-1
lines changed

2 files changed

+74
-1
lines changed

pkg/deploy/elbv2/load_balancer_manager.go

+23-1
Original file line numberDiff line numberDiff line change
@@ -158,20 +158,28 @@ func (m *defaultLoadBalancerManager) updateSDKLoadBalancerWithIPAddressType(ctx
158158

159159
func (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+
}

pkg/deploy/elbv2/load_balancer_manager_test.go

+51
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"testing"
66

77
elbv2types "github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2/types"
8+
"github.com/aws/aws-sdk-go/aws"
89
"github.com/go-logr/logr"
910
"sigs.k8s.io/aws-load-balancer-controller/pkg/aws/services"
1011

@@ -612,6 +613,55 @@ func Test_defaultLoadBalancerManager_updateSDKLoadBalancerWithSubnetMappings(t *
612613
},
613614
wantErr: nil,
614615
},
616+
{
617+
name: "Set NLB IPv6 address in dualstack mode during ip address type modification ",
618+
fields: fields{
619+
setSubnetsWithContextCall: setSubnetsWithContextCall{
620+
req: &elbv2sdk.SetSubnetsInput{
621+
LoadBalancerArn: awssdk.String("LoadBalancerArn"),
622+
SubnetMappings: []elbv2types.SubnetMapping{
623+
{
624+
SubnetId: awssdk.String("subnet-A"),
625+
IPv6Address: aws.String("2600:1f18::1"),
626+
},
627+
{
628+
SubnetId: awssdk.String("subnet-B"),
629+
IPv6Address: aws.String("2600:1f18::2"),
630+
},
631+
},
632+
},
633+
resp: &elbv2sdk.SetSubnetsOutput{},
634+
},
635+
},
636+
args: args{
637+
resLB: &elbv2model.LoadBalancer{
638+
ResourceMeta: coremodel.NewResourceMeta(stack, "AWS::ElasticLoadBalancingV2::LoadBalancer", "id-1"),
639+
Spec: elbv2model.LoadBalancerSpec{
640+
SubnetMappings: []elbv2model.SubnetMapping{
641+
{
642+
SubnetID: "subnet-A",
643+
IPv6Address: aws.String("2600:1f18::1"),
644+
},
645+
{
646+
SubnetID: "subnet-B",
647+
IPv6Address: aws.String("2600:1f18::2"),
648+
},
649+
},
650+
Type: elbv2model.LoadBalancerTypeNetwork,
651+
IPAddressType: elbv2model.IPAddressTypeDualStack,
652+
},
653+
},
654+
sdkLB: LoadBalancerWithTags{
655+
LoadBalancer: &elbv2types.LoadBalancer{
656+
LoadBalancerArn: awssdk.String("LoadBalancerArn"),
657+
Type: elbv2types.LoadBalancerTypeEnumNetwork,
658+
AvailabilityZones: []elbv2types.AvailabilityZone{{SubnetId: awssdk.String("subnet-A")}, {SubnetId: awssdk.String("subnet-B")}},
659+
IpAddressType: elbv2types.IpAddressTypeIpv4,
660+
},
661+
},
662+
},
663+
wantErr: nil,
664+
},
615665
}
616666

617667
for _, tt := range tests {
@@ -632,6 +682,7 @@ func Test_defaultLoadBalancerManager_updateSDKLoadBalancerWithSubnetMappings(t *
632682
} else {
633683
assert.NoError(t, err)
634684
}
685+
635686
})
636687
}
637688
}

0 commit comments

Comments
 (0)