@@ -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+
15871722func 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