@@ -1584,6 +1584,141 @@ func TestCreateNLB(t *testing.T) {
1584
1584
}
1585
1585
}
1586
1586
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
+
1587
1722
func TestDeleteAPIServerELB (t * testing.T ) {
1588
1723
clusterName := "bar" //nolint:goconst // does not need to be a package-level const
1589
1724
elbName := "bar-apiserver"
0 commit comments