Skip to content

Commit c9ec8ab

Browse files
committed
fix bug in subnet resolver
1 parent de50bdd commit c9ec8ab

File tree

2 files changed

+164
-10
lines changed

2 files changed

+164
-10
lines changed

pkg/networking/subnet_resolver.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -458,20 +458,20 @@ func (r *defaultSubnetsResolver) chooseSubnetsPerAZ(subnets []ec2types.Subnet) [
458458
for az, azSubnets := range subnetsByAZ {
459459
if len(azSubnets) == 1 {
460460
chosenSubnets = append(chosenSubnets, azSubnets[0])
461-
} else if len(subnets) > 1 {
462-
sort.Slice(subnets, func(i, j int) bool {
463-
subnetIHasCurrentClusterTag := r.isSubnetContainsCurrentClusterTag(subnets[i])
464-
subnetJHasCurrentClusterTag := r.isSubnetContainsCurrentClusterTag(subnets[j])
461+
} else if len(azSubnets) > 1 {
462+
sort.Slice(azSubnets, func(i, j int) bool {
463+
subnetIHasCurrentClusterTag := r.isSubnetContainsCurrentClusterTag(azSubnets[i])
464+
subnetJHasCurrentClusterTag := r.isSubnetContainsCurrentClusterTag(azSubnets[j])
465465
if subnetIHasCurrentClusterTag && (!subnetJHasCurrentClusterTag) {
466466
return true
467467
} else if (!subnetIHasCurrentClusterTag) && subnetJHasCurrentClusterTag {
468468
return false
469469
}
470-
return awssdk.ToString(subnets[i].SubnetId) < awssdk.ToString(subnets[j].SubnetId)
470+
return awssdk.ToString(azSubnets[i].SubnetId) < awssdk.ToString(azSubnets[j].SubnetId)
471471
})
472472
r.logger.V(1).Info("multiple subnets in the same AvailabilityZone", "AvailabilityZone", az,
473-
"chosen", subnets[0].SubnetId, "ignored", extractSubnetIDs(subnets[1:]))
474-
chosenSubnets = append(chosenSubnets, subnets[0])
473+
"chosen", azSubnets[0].SubnetId, "ignored", extractSubnetIDs(azSubnets[1:]))
474+
chosenSubnets = append(chosenSubnets, azSubnets[0])
475475
}
476476
}
477477
sortSubnetsByID(chosenSubnets)
@@ -528,9 +528,9 @@ func (r *defaultSubnetsResolver) isSubnetContainsSufficientIPAddresses(subnet ec
528528
// subnets passed-in must be non-empty
529529
func (r *defaultSubnetsResolver) validateSubnetsAZExclusivity(subnets []ec2types.Subnet) error {
530530
subnetsByAZ := mapSDKSubnetsByAZ(subnets)
531-
for az, subnets := range subnetsByAZ {
532-
if len(subnets) > 1 {
533-
return fmt.Errorf("multiple subnets in same Availability Zone %v: %v", az, extractSubnetIDs(subnets))
531+
for az, azSubnets := range subnetsByAZ {
532+
if len(azSubnets) > 1 {
533+
return fmt.Errorf("multiple subnets in same Availability Zone %v: %v", az, extractSubnetIDs(azSubnets))
534534
}
535535
}
536536
return nil

pkg/networking/subnet_resolver_test.go

Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1024,6 +1024,146 @@ func Test_defaultSubnetsResolver_ResolveViaDiscovery(t *testing.T) {
10241024
},
10251025
wantErr: errors.New("unable to resolve at least one subnet. Evaluated 2 subnets: 1 are tagged for other clusters, and 1 have insufficient available IP addresses"),
10261026
},
1027+
{
1028+
name: "multiple subnets found per AZ, pick one per az",
1029+
fields: fields{
1030+
clusterTagCheckEnabled: true,
1031+
albSingleSubnetEnabled: false,
1032+
discoveryByReachabilityEnabled: true,
1033+
describeSubnetsAsListCalls: []describeSubnetsAsListCall{
1034+
{
1035+
input: &ec2sdk.DescribeSubnetsInput{
1036+
Filters: []ec2types.Filter{
1037+
{
1038+
Name: awssdk.String("vpc-id"),
1039+
Values: []string{"vpc-dummy"},
1040+
},
1041+
{
1042+
Name: awssdk.String("tag:kubernetes.io/role/elb"),
1043+
Values: []string{"", "1"},
1044+
},
1045+
},
1046+
},
1047+
output: []ec2types.Subnet{
1048+
{
1049+
SubnetId: awssdk.String("subnet-1"),
1050+
AvailabilityZone: awssdk.String("us-west-2a"),
1051+
AvailabilityZoneId: awssdk.String("usw2-az1"),
1052+
AvailableIpAddressCount: awssdk.Int32(8),
1053+
VpcId: awssdk.String("vpc-dummy"),
1054+
Tags: []ec2types.Tag{
1055+
{
1056+
Key: awssdk.String("kubernetes.io/role/elb"),
1057+
Value: awssdk.String("1"),
1058+
},
1059+
},
1060+
},
1061+
{
1062+
SubnetId: awssdk.String("subnet-2"),
1063+
AvailabilityZone: awssdk.String("us-west-2a"),
1064+
AvailabilityZoneId: awssdk.String("usw2-az1"),
1065+
AvailableIpAddressCount: awssdk.Int32(8),
1066+
VpcId: awssdk.String("vpc-dummy"),
1067+
Tags: []ec2types.Tag{
1068+
{
1069+
Key: awssdk.String("kubernetes.io/role/elb"),
1070+
Value: awssdk.String("1"),
1071+
},
1072+
{
1073+
Key: awssdk.String("kubernetes.io/cluster/cluster-dummy"),
1074+
Value: awssdk.String("owned"),
1075+
},
1076+
},
1077+
},
1078+
{
1079+
SubnetId: awssdk.String("subnet-3"),
1080+
AvailabilityZone: awssdk.String("us-west-2b"),
1081+
AvailabilityZoneId: awssdk.String("usw2-az2"),
1082+
AvailableIpAddressCount: awssdk.Int32(8),
1083+
VpcId: awssdk.String("vpc-dummy"),
1084+
Tags: []ec2types.Tag{
1085+
{
1086+
Key: awssdk.String("kubernetes.io/role/elb"),
1087+
Value: awssdk.String("1"),
1088+
},
1089+
},
1090+
},
1091+
{
1092+
SubnetId: awssdk.String("subnet-4"),
1093+
AvailabilityZone: awssdk.String("us-west-2b"),
1094+
AvailabilityZoneId: awssdk.String("usw2-az2"),
1095+
AvailableIpAddressCount: awssdk.Int32(8),
1096+
VpcId: awssdk.String("vpc-dummy"),
1097+
Tags: []ec2types.Tag{
1098+
{
1099+
Key: awssdk.String("kubernetes.io/role/elb"),
1100+
Value: awssdk.String("1"),
1101+
},
1102+
},
1103+
},
1104+
},
1105+
},
1106+
},
1107+
fetchAZInfosCalls: []fetchAZInfosCall{
1108+
{
1109+
availabilityZoneIDs: []string{"usw2-az1"},
1110+
azInfoByAZID: map[string]ec2types.AvailabilityZone{
1111+
"usw2-az1": {
1112+
ZoneId: awssdk.String("usw2-az1"),
1113+
ZoneType: awssdk.String("availability-zone"),
1114+
},
1115+
},
1116+
},
1117+
{
1118+
availabilityZoneIDs: []string{"usw2-az2"},
1119+
azInfoByAZID: map[string]ec2types.AvailabilityZone{
1120+
"usw2-az2": {
1121+
ZoneId: awssdk.String("usw2-az2"),
1122+
ZoneType: awssdk.String("availability-zone"),
1123+
},
1124+
},
1125+
},
1126+
},
1127+
},
1128+
args: args{
1129+
opts: []SubnetsResolveOption{
1130+
WithSubnetsResolveLBType(elbv2model.LoadBalancerTypeApplication),
1131+
WithSubnetsResolveLBScheme(elbv2model.LoadBalancerSchemeInternetFacing),
1132+
},
1133+
},
1134+
want: []ec2types.Subnet{
1135+
{
1136+
SubnetId: awssdk.String("subnet-2"),
1137+
AvailabilityZone: awssdk.String("us-west-2a"),
1138+
AvailabilityZoneId: awssdk.String("usw2-az1"),
1139+
AvailableIpAddressCount: awssdk.Int32(8),
1140+
VpcId: awssdk.String("vpc-dummy"),
1141+
Tags: []ec2types.Tag{
1142+
{
1143+
Key: awssdk.String("kubernetes.io/role/elb"),
1144+
Value: awssdk.String("1"),
1145+
},
1146+
{
1147+
Key: awssdk.String("kubernetes.io/cluster/cluster-dummy"),
1148+
Value: awssdk.String("owned"),
1149+
},
1150+
},
1151+
},
1152+
{
1153+
SubnetId: awssdk.String("subnet-3"),
1154+
AvailabilityZone: awssdk.String("us-west-2b"),
1155+
AvailabilityZoneId: awssdk.String("usw2-az2"),
1156+
AvailableIpAddressCount: awssdk.Int32(8),
1157+
VpcId: awssdk.String("vpc-dummy"),
1158+
Tags: []ec2types.Tag{
1159+
{
1160+
Key: awssdk.String("kubernetes.io/role/elb"),
1161+
Value: awssdk.String("1"),
1162+
},
1163+
},
1164+
},
1165+
},
1166+
},
10271167
{
10281168
name: "fallback to reachability were disabled",
10291169
fields: fields{
@@ -2353,6 +2493,13 @@ func Test_defaultSubnetsResolver_chooseSubnetsPerAZ(t *testing.T) {
23532493
AvailableIpAddressCount: awssdk.Int32(8),
23542494
VpcId: awssdk.String("vpc-dummy"),
23552495
},
2496+
{
2497+
SubnetId: awssdk.String("subnet-4"),
2498+
AvailabilityZone: awssdk.String("us-west-2b"),
2499+
AvailabilityZoneId: awssdk.String("usw2-az2"),
2500+
AvailableIpAddressCount: awssdk.Int32(8),
2501+
VpcId: awssdk.String("vpc-dummy"),
2502+
},
23562503
},
23572504
want: []ec2types.Subnet{
23582505
{
@@ -2401,6 +2548,13 @@ func Test_defaultSubnetsResolver_chooseSubnetsPerAZ(t *testing.T) {
24012548
AvailableIpAddressCount: awssdk.Int32(8),
24022549
VpcId: awssdk.String("vpc-dummy"),
24032550
},
2551+
{
2552+
SubnetId: awssdk.String("subnet-4"),
2553+
AvailabilityZone: awssdk.String("us-west-2b"),
2554+
AvailabilityZoneId: awssdk.String("usw2-az2"),
2555+
AvailableIpAddressCount: awssdk.Int32(8),
2556+
VpcId: awssdk.String("vpc-dummy"),
2557+
},
24042558
},
24052559
want: []ec2types.Subnet{
24062560
{

0 commit comments

Comments
 (0)