Skip to content

Commit 46e6fb1

Browse files
authored
Merge pull request #4498 from k8s-infra-cherrypick-robot/cherry-pick-4449-to-release-2.2
[release-2.2] Set availability zones in status.networkStatus.apiServerElb when using BYO NLB
2 parents 764e47e + 50fd444 commit 46e6fb1

File tree

2 files changed

+140
-2
lines changed

2 files changed

+140
-2
lines changed

pkg/cloud/services/elb/loadbalancer.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1467,17 +1467,20 @@ func fromSDKTypeToClassicELB(v *elb.LoadBalancerDescription, attrs *elb.LoadBala
14671467

14681468
func fromSDKTypeToLB(v *elbv2.LoadBalancer, attrs []*elbv2.LoadBalancerAttribute, tags []*elbv2.Tag) *infrav1.LoadBalancer {
14691469
subnetIds := make([]*string, len(v.AvailabilityZones))
1470+
availabilityZones := make([]*string, len(v.AvailabilityZones))
14701471
for i, az := range v.AvailabilityZones {
14711472
subnetIds[i] = az.SubnetId
1473+
availabilityZones[i] = az.ZoneName
14721474
}
14731475
res := &infrav1.LoadBalancer{
14741476
ARN: aws.StringValue(v.LoadBalancerArn),
14751477
Name: aws.StringValue(v.LoadBalancerName),
14761478
Scheme: infrav1.ELBScheme(aws.StringValue(v.Scheme)),
14771479
SubnetIDs: aws.StringValueSlice(subnetIds),
14781480
// SecurityGroupIDs: aws.StringValueSlice(v.SecurityGroups),
1479-
DNSName: aws.StringValue(v.DNSName),
1480-
Tags: converters.V2TagsToMap(tags),
1481+
AvailabilityZones: aws.StringValueSlice(availabilityZones),
1482+
DNSName: aws.StringValue(v.DNSName),
1483+
Tags: converters.V2TagsToMap(tags),
14811484
}
14821485

14831486
infraAttrs := make(map[string]*string, len(attrs))

pkg/cloud/services/elb/loadbalancer_test.go

Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1584,6 +1584,141 @@ func TestCreateNLB(t *testing.T) {
15841584
}
15851585
}
15861586

1587+
func TestReconcileV2LB(t *testing.T) {
1588+
const (
1589+
namespace = "foo"
1590+
clusterName = "bar"
1591+
clusterSubnetID = "subnet-1"
1592+
elbName = "bar-apiserver"
1593+
elbArn = "arn::apiserver"
1594+
vpcID = "vpc-id"
1595+
az = "us-west-1a"
1596+
)
1597+
1598+
tests := []struct {
1599+
name string
1600+
elbV2APIMocks func(m *mocks.MockELBV2APIMockRecorder)
1601+
check func(t *testing.T, lb *infrav1.LoadBalancer, err error)
1602+
awsCluster func(acl infrav1.AWSCluster) infrav1.AWSCluster
1603+
spec func(spec infrav1.LoadBalancer) infrav1.LoadBalancer
1604+
}{
1605+
{
1606+
name: "ensure status populated with BYO NLB",
1607+
spec: func(spec infrav1.LoadBalancer) infrav1.LoadBalancer {
1608+
return spec
1609+
},
1610+
awsCluster: func(acl infrav1.AWSCluster) infrav1.AWSCluster {
1611+
acl.Spec.ControlPlaneLoadBalancer.Name = aws.String(elbName)
1612+
return acl
1613+
},
1614+
elbV2APIMocks: func(m *mocks.MockELBV2APIMockRecorder) {
1615+
m.DescribeLoadBalancers(gomock.Eq(&elbv2.DescribeLoadBalancersInput{
1616+
Names: aws.StringSlice([]string{elbName}),
1617+
})).
1618+
Return(&elbv2.DescribeLoadBalancersOutput{
1619+
LoadBalancers: []*elbv2.LoadBalancer{
1620+
{
1621+
LoadBalancerArn: aws.String(elbArn),
1622+
LoadBalancerName: aws.String(elbName),
1623+
Scheme: aws.String(string(infrav1.ELBSchemeInternetFacing)),
1624+
AvailabilityZones: []*elbv2.AvailabilityZone{
1625+
{
1626+
SubnetId: aws.String(clusterSubnetID),
1627+
ZoneName: aws.String(az),
1628+
},
1629+
},
1630+
VpcId: aws.String(vpcID),
1631+
},
1632+
},
1633+
}, nil)
1634+
m.DescribeLoadBalancerAttributes(&elbv2.DescribeLoadBalancerAttributesInput{LoadBalancerArn: aws.String(elbArn)}).Return(
1635+
&elbv2.DescribeLoadBalancerAttributesOutput{
1636+
Attributes: []*elbv2.LoadBalancerAttribute{
1637+
{
1638+
Key: aws.String("load_balancing.cross_zone.enabled"),
1639+
Value: aws.String("false"),
1640+
},
1641+
},
1642+
},
1643+
nil,
1644+
)
1645+
m.DescribeTags(&elbv2.DescribeTagsInput{ResourceArns: []*string{aws.String(elbArn)}}).Return(
1646+
&elbv2.DescribeTagsOutput{
1647+
TagDescriptions: []*elbv2.TagDescription{
1648+
{
1649+
ResourceArn: aws.String(elbArn),
1650+
Tags: []*elbv2.Tag{},
1651+
},
1652+
},
1653+
},
1654+
nil,
1655+
)
1656+
},
1657+
check: func(t *testing.T, lb *infrav1.LoadBalancer, err error) {
1658+
t.Helper()
1659+
if err != nil {
1660+
t.Fatalf("did not expect error: %v", err)
1661+
}
1662+
if len(lb.AvailabilityZones) != 1 {
1663+
t.Errorf("Expected LB to contain 1 availability zone, got %v", len(lb.AvailabilityZones))
1664+
}
1665+
},
1666+
},
1667+
}
1668+
1669+
for _, tc := range tests {
1670+
t.Run(tc.name, func(t *testing.T) {
1671+
mockCtrl := gomock.NewController(t)
1672+
defer mockCtrl.Finish()
1673+
elbV2APIMocks := mocks.NewMockELBV2API(mockCtrl)
1674+
1675+
scheme, err := setupScheme()
1676+
if err != nil {
1677+
t.Fatal(err)
1678+
}
1679+
awsCluster := &infrav1.AWSCluster{
1680+
ObjectMeta: metav1.ObjectMeta{Name: clusterName},
1681+
Spec: infrav1.AWSClusterSpec{
1682+
ControlPlaneLoadBalancer: &infrav1.AWSLoadBalancerSpec{
1683+
Name: aws.String(elbName),
1684+
LoadBalancerType: infrav1.LoadBalancerTypeNLB,
1685+
},
1686+
NetworkSpec: infrav1.NetworkSpec{
1687+
VPC: infrav1.VPCSpec{
1688+
ID: vpcID,
1689+
},
1690+
},
1691+
},
1692+
}
1693+
client := fake.NewClientBuilder().WithScheme(scheme).Build()
1694+
cluster := tc.awsCluster(*awsCluster)
1695+
clusterScope, err := scope.NewClusterScope(scope.ClusterScopeParams{
1696+
Client: client,
1697+
Cluster: &clusterv1.Cluster{
1698+
ObjectMeta: metav1.ObjectMeta{
1699+
Namespace: namespace,
1700+
Name: clusterName,
1701+
},
1702+
},
1703+
AWSCluster: &cluster,
1704+
})
1705+
if err != nil {
1706+
t.Fatal(err)
1707+
}
1708+
1709+
tc.elbV2APIMocks(elbV2APIMocks.EXPECT())
1710+
1711+
s := &Service{
1712+
scope: clusterScope,
1713+
ELBV2Client: elbV2APIMocks,
1714+
}
1715+
err = s.reconcileV2LB()
1716+
lb := s.scope.Network().APIServerELB
1717+
tc.check(t, &lb, err)
1718+
})
1719+
}
1720+
}
1721+
15871722
func TestDeleteAPIServerELB(t *testing.T) {
15881723
clusterName := "bar" //nolint:goconst // does not need to be a package-level const
15891724
elbName := "bar-apiserver"

0 commit comments

Comments
 (0)