Skip to content

Commit d48958c

Browse files
committed
🐛 fix: unit tests for ELBv2 health check HTTP and HTTPS
1 parent c8dbbab commit d48958c

File tree

1 file changed

+301
-32
lines changed

1 file changed

+301
-32
lines changed

pkg/cloud/services/elb/loadbalancer_test.go

Lines changed: 301 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,17 @@ import (
4343
"sigs.k8s.io/cluster-api/util/conditions"
4444
)
4545

46+
var stubInfraV1TargetGroupSpecAPI = infrav1.TargetGroupSpec{
47+
Name: "name",
48+
Port: infrav1.DefaultAPIServerPort,
49+
Protocol: "TCP",
50+
HealthCheck: &infrav1.TargetGroupHealthCheck{
51+
IntervalSeconds: aws.Int64(10),
52+
TimeoutSeconds: aws.Int64(5),
53+
ThresholdCount: aws.Int64(5),
54+
},
55+
}
56+
4657
func TestELBName(t *testing.T) {
4758
tests := []struct {
4859
name string
@@ -842,7 +853,7 @@ func TestRegisterInstanceWithAPIServerNLB(t *testing.T) {
842853
TargetGroups: []*elbv2.TargetGroup{
843854
{
844855
HealthCheckEnabled: aws.Bool(true),
845-
HealthCheckPort: aws.String("infrav1.DefaultAPIServerPort"),
856+
HealthCheckPort: aws.String(infrav1.DefaultAPIServerPortString),
846857
HealthCheckProtocol: aws.String("TCP"),
847858
LoadBalancerArns: aws.StringSlice([]string{elbArn}),
848859
Port: aws.Int64(infrav1.DefaultAPIServerPort),
@@ -945,7 +956,7 @@ func TestRegisterInstanceWithAPIServerNLB(t *testing.T) {
945956
TargetGroups: []*elbv2.TargetGroup{
946957
{
947958
HealthCheckEnabled: aws.Bool(true),
948-
HealthCheckPort: aws.String("infrav1.DefaultAPIServerPort"),
959+
HealthCheckPort: aws.String(infrav1.DefaultAPIServerPortString),
949960
HealthCheckProtocol: aws.String("TCP"),
950961
LoadBalancerArns: aws.StringSlice([]string{elbArn}),
951962
Port: aws.Int64(infrav1.DefaultAPIServerPort),
@@ -1189,13 +1200,14 @@ func TestCreateNLB(t *testing.T) {
11891200
},
11901201
}, nil)
11911202
m.CreateTargetGroup(gomock.Eq(&elbv2.CreateTargetGroupInput{
1192-
HealthCheckEnabled: aws.Bool(true),
1193-
HealthCheckPort: aws.String("infrav1.DefaultAPIServerPort"),
1194-
HealthCheckProtocol: aws.String("tcp"),
1195-
Name: aws.String("name"),
1196-
Port: aws.Int64(infrav1.DefaultAPIServerPort),
1197-
Protocol: aws.String("TCP"),
1198-
VpcId: aws.String(vpcID),
1203+
HealthCheckEnabled: aws.Bool(true),
1204+
HealthCheckPort: aws.String(infrav1.DefaultAPIServerPortString),
1205+
HealthCheckProtocol: aws.String("tcp"),
1206+
UnhealthyThresholdCount: aws.Int64(infrav1.DefaultAPIServerUnhealthThresholdCount),
1207+
Name: aws.String("name"),
1208+
Port: aws.Int64(infrav1.DefaultAPIServerPort),
1209+
Protocol: aws.String("TCP"),
1210+
VpcId: aws.String(vpcID),
11991211
Tags: []*elbv2.Tag{
12001212
{
12011213
Key: aws.String("test"),
@@ -1291,14 +1303,15 @@ func TestCreateNLB(t *testing.T) {
12911303
},
12921304
}, nil)
12931305
m.CreateTargetGroup(gomock.Eq(&elbv2.CreateTargetGroupInput{
1294-
HealthCheckEnabled: aws.Bool(true),
1295-
HealthCheckPort: aws.String("infrav1.DefaultAPIServerPort"),
1296-
HealthCheckProtocol: aws.String("tcp"),
1297-
Name: aws.String("name"),
1298-
Port: aws.Int64(infrav1.DefaultAPIServerPort),
1299-
Protocol: aws.String("TCP"),
1300-
VpcId: aws.String(vpcID),
1301-
IpAddressType: aws.String("ipv6"),
1306+
HealthCheckEnabled: aws.Bool(true),
1307+
HealthCheckPort: aws.String(infrav1.DefaultAPIServerPortString),
1308+
HealthCheckProtocol: aws.String("tcp"),
1309+
UnhealthyThresholdCount: aws.Int64(infrav1.DefaultAPIServerUnhealthThresholdCount),
1310+
Name: aws.String("name"),
1311+
Port: aws.Int64(infrav1.DefaultAPIServerPort),
1312+
Protocol: aws.String("TCP"),
1313+
VpcId: aws.String(vpcID),
1314+
IpAddressType: aws.String("ipv6"),
13021315
Tags: []*elbv2.Tag{
13031316
{
13041317
Key: aws.String("test"),
@@ -1529,13 +1542,14 @@ func TestCreateNLB(t *testing.T) {
15291542
},
15301543
}, nil)
15311544
m.CreateTargetGroup(gomock.Eq(&elbv2.CreateTargetGroupInput{
1532-
HealthCheckEnabled: aws.Bool(true),
1533-
HealthCheckPort: aws.String("infrav1.DefaultAPIServerPort"),
1534-
HealthCheckProtocol: aws.String("tcp"),
1535-
Name: aws.String("name"),
1536-
Port: aws.Int64(infrav1.DefaultAPIServerPort),
1537-
Protocol: aws.String("TCP"),
1538-
VpcId: aws.String(vpcID),
1545+
HealthCheckEnabled: aws.Bool(true),
1546+
HealthCheckPort: aws.String(infrav1.DefaultAPIServerPortString),
1547+
HealthCheckProtocol: aws.String("tcp"),
1548+
UnhealthyThresholdCount: aws.Int64(infrav1.DefaultAPIServerUnhealthThresholdCount),
1549+
Name: aws.String("name"),
1550+
Port: aws.Int64(infrav1.DefaultAPIServerPort),
1551+
Protocol: aws.String("TCP"),
1552+
VpcId: aws.String(vpcID),
15391553
Tags: []*elbv2.Tag{
15401554
{
15411555
Key: aws.String("test"),
@@ -1619,13 +1633,14 @@ func TestCreateNLB(t *testing.T) {
16191633
},
16201634
}, nil)
16211635
m.CreateTargetGroup(gomock.Eq(&elbv2.CreateTargetGroupInput{
1622-
HealthCheckEnabled: aws.Bool(true),
1623-
HealthCheckPort: aws.String("infrav1.DefaultAPIServerPort"),
1624-
HealthCheckProtocol: aws.String("tcp"),
1625-
Name: aws.String("name"),
1626-
Port: aws.Int64(infrav1.DefaultAPIServerPort),
1627-
Protocol: aws.String("TCP"),
1628-
VpcId: aws.String(vpcID),
1636+
HealthCheckEnabled: aws.Bool(true),
1637+
HealthCheckPort: aws.String(infrav1.DefaultAPIServerPortString),
1638+
HealthCheckProtocol: aws.String("tcp"),
1639+
UnhealthyThresholdCount: aws.Int64(infrav1.DefaultAPIServerUnhealthThresholdCount),
1640+
Name: aws.String("name"),
1641+
Port: aws.Int64(infrav1.DefaultAPIServerPort),
1642+
Protocol: aws.String("TCP"),
1643+
VpcId: aws.String(vpcID),
16291644
Tags: []*elbv2.Tag{
16301645
{
16311646
Key: aws.String("test"),
@@ -1684,6 +1699,260 @@ func TestCreateNLB(t *testing.T) {
16841699
}
16851700
},
16861701
},
1702+
{
1703+
name: "NLB with HTTP health check",
1704+
awsCluster: func(acl infrav1.AWSCluster) infrav1.AWSCluster {
1705+
acl.Spec.ControlPlaneLoadBalancer.Scheme = &infrav1.ELBSchemeInternetFacing
1706+
acl.Spec.ControlPlaneLoadBalancer.LoadBalancerType = infrav1.LoadBalancerTypeNLB
1707+
acl.Spec.ControlPlaneLoadBalancer.HealthCheckProtocol = &infrav1.ELBProtocolHTTP
1708+
return acl
1709+
},
1710+
spec: func(spec infrav1.LoadBalancer) infrav1.LoadBalancer {
1711+
tg := stubInfraV1TargetGroupSpecAPI
1712+
tg.VpcID = vpcID
1713+
tg.HealthCheck.Protocol = aws.String("HTTP")
1714+
tg.HealthCheck.Port = aws.String(infrav1.DefaultAPIServerPortString)
1715+
tg.HealthCheck.Path = aws.String("/readyz")
1716+
spec.ELBListeners = []infrav1.Listener{
1717+
{
1718+
Protocol: "TCP",
1719+
Port: infrav1.DefaultAPIServerPort,
1720+
TargetGroup: tg,
1721+
},
1722+
}
1723+
return spec
1724+
},
1725+
elbV2APIMocks: func(m *mocks.MockELBV2APIMockRecorder) {
1726+
m.CreateLoadBalancer(gomock.Eq(&elbv2.CreateLoadBalancerInput{
1727+
Name: aws.String(elbName),
1728+
Scheme: aws.String("internet-facing"),
1729+
SecurityGroups: aws.StringSlice([]string{}),
1730+
Type: aws.String("network"),
1731+
Subnets: aws.StringSlice([]string{clusterSubnetID}),
1732+
Tags: []*elbv2.Tag{
1733+
{
1734+
Key: aws.String("test"),
1735+
Value: aws.String("tag"),
1736+
},
1737+
},
1738+
})).Return(&elbv2.CreateLoadBalancerOutput{
1739+
LoadBalancers: []*elbv2.LoadBalancer{
1740+
{
1741+
LoadBalancerArn: aws.String(elbArn),
1742+
LoadBalancerName: aws.String(elbName),
1743+
Scheme: aws.String(string(infrav1.ELBSchemeInternetFacing)),
1744+
DNSName: aws.String(dns),
1745+
},
1746+
},
1747+
}, nil)
1748+
m.CreateTargetGroup(gomock.Eq(&elbv2.CreateTargetGroupInput{
1749+
Name: aws.String("name"),
1750+
Port: aws.Int64(infrav1.DefaultAPIServerPort),
1751+
Protocol: aws.String("TCP"),
1752+
VpcId: aws.String(vpcID),
1753+
HealthCheckEnabled: aws.Bool(true),
1754+
HealthCheckPort: aws.String(infrav1.DefaultAPIServerPortString),
1755+
HealthCheckProtocol: aws.String("HTTP"),
1756+
HealthCheckPath: aws.String("/readyz"),
1757+
HealthCheckIntervalSeconds: aws.Int64(10),
1758+
HealthCheckTimeoutSeconds: aws.Int64(5),
1759+
HealthyThresholdCount: aws.Int64(5),
1760+
UnhealthyThresholdCount: aws.Int64(3),
1761+
Tags: []*elbv2.Tag{
1762+
{
1763+
Key: aws.String("test"),
1764+
Value: aws.String("tag"),
1765+
},
1766+
},
1767+
})).Return(&elbv2.CreateTargetGroupOutput{
1768+
TargetGroups: []*elbv2.TargetGroup{
1769+
{
1770+
TargetGroupArn: aws.String("target-group::arn"),
1771+
TargetGroupName: aws.String("name"),
1772+
VpcId: aws.String(vpcID),
1773+
HealthCheckEnabled: aws.Bool(true),
1774+
HealthCheckPort: aws.String(infrav1.DefaultAPIServerPortString),
1775+
HealthCheckProtocol: aws.String("http"),
1776+
HealthCheckPath: aws.String("/readyz"),
1777+
HealthCheckIntervalSeconds: aws.Int64(10),
1778+
HealthCheckTimeoutSeconds: aws.Int64(5),
1779+
HealthyThresholdCount: aws.Int64(5),
1780+
UnhealthyThresholdCount: aws.Int64(3),
1781+
},
1782+
},
1783+
}, nil)
1784+
m.CreateListener(gomock.Eq(&elbv2.CreateListenerInput{
1785+
DefaultActions: []*elbv2.Action{
1786+
{
1787+
TargetGroupArn: aws.String("target-group::arn"),
1788+
Type: aws.String(elbv2.ActionTypeEnumForward),
1789+
},
1790+
},
1791+
LoadBalancerArn: aws.String(elbArn),
1792+
Port: aws.Int64(infrav1.DefaultAPIServerPort),
1793+
Protocol: aws.String("TCP"),
1794+
Tags: []*elbv2.Tag{
1795+
{
1796+
Key: aws.String("test"),
1797+
Value: aws.String("tag"),
1798+
},
1799+
},
1800+
})).Return(&elbv2.CreateListenerOutput{
1801+
Listeners: []*elbv2.Listener{
1802+
{
1803+
ListenerArn: aws.String("listener::arn"),
1804+
},
1805+
},
1806+
}, nil)
1807+
m.ModifyTargetGroupAttributes(gomock.Eq(&elbv2.ModifyTargetGroupAttributesInput{
1808+
TargetGroupArn: aws.String("target-group::arn"),
1809+
Attributes: []*elbv2.TargetGroupAttribute{
1810+
{
1811+
Key: aws.String(infrav1.TargetGroupAttributeEnablePreserveClientIP),
1812+
Value: aws.String("false"),
1813+
},
1814+
},
1815+
})).Return(nil, nil)
1816+
},
1817+
check: func(t *testing.T, lb *infrav1.LoadBalancer, err error) {
1818+
t.Helper()
1819+
if err != nil {
1820+
t.Fatalf("did not expect error: %v", err)
1821+
}
1822+
got := *lb.ELBListeners[0].TargetGroup.HealthCheck.Protocol
1823+
want := "HTTP"
1824+
if got != want {
1825+
t.Fatalf("Health Check protocol for the API Target group did not equal expected value: %s; was: '%s'", want, got)
1826+
}
1827+
},
1828+
},
1829+
{
1830+
name: "NLB with HTTPS health check",
1831+
awsCluster: func(acl infrav1.AWSCluster) infrav1.AWSCluster {
1832+
acl.Spec.ControlPlaneLoadBalancer.Scheme = &infrav1.ELBSchemeInternetFacing
1833+
acl.Spec.ControlPlaneLoadBalancer.LoadBalancerType = infrav1.LoadBalancerTypeNLB
1834+
acl.Spec.ControlPlaneLoadBalancer.HealthCheckProtocol = &infrav1.ELBProtocolHTTPS
1835+
return acl
1836+
},
1837+
spec: func(spec infrav1.LoadBalancer) infrav1.LoadBalancer {
1838+
tg := stubInfraV1TargetGroupSpecAPI
1839+
tg.VpcID = vpcID
1840+
tg.HealthCheck.Protocol = aws.String("HTTPS")
1841+
tg.HealthCheck.Port = aws.String(infrav1.DefaultAPIServerPortString)
1842+
tg.HealthCheck.Path = aws.String("/readyz")
1843+
spec.ELBListeners = []infrav1.Listener{
1844+
{
1845+
Protocol: "TCP",
1846+
Port: infrav1.DefaultAPIServerPort,
1847+
TargetGroup: tg,
1848+
},
1849+
}
1850+
return spec
1851+
},
1852+
elbV2APIMocks: func(m *mocks.MockELBV2APIMockRecorder) {
1853+
m.CreateLoadBalancer(gomock.Eq(&elbv2.CreateLoadBalancerInput{
1854+
Name: aws.String(elbName),
1855+
Scheme: aws.String("internet-facing"),
1856+
SecurityGroups: aws.StringSlice([]string{}),
1857+
Type: aws.String("network"),
1858+
Subnets: aws.StringSlice([]string{clusterSubnetID}),
1859+
Tags: []*elbv2.Tag{
1860+
{
1861+
Key: aws.String("test"),
1862+
Value: aws.String("tag"),
1863+
},
1864+
},
1865+
})).Return(&elbv2.CreateLoadBalancerOutput{
1866+
LoadBalancers: []*elbv2.LoadBalancer{
1867+
{
1868+
LoadBalancerArn: aws.String(elbArn),
1869+
LoadBalancerName: aws.String(elbName),
1870+
Scheme: aws.String(string(infrav1.ELBSchemeInternetFacing)),
1871+
DNSName: aws.String(dns),
1872+
},
1873+
},
1874+
}, nil)
1875+
m.CreateTargetGroup(gomock.Eq(&elbv2.CreateTargetGroupInput{
1876+
Name: aws.String("name"),
1877+
Port: aws.Int64(infrav1.DefaultAPIServerPort),
1878+
Protocol: aws.String("TCP"),
1879+
VpcId: aws.String(vpcID),
1880+
HealthCheckEnabled: aws.Bool(true),
1881+
HealthCheckPort: aws.String(infrav1.DefaultAPIServerPortString),
1882+
HealthCheckProtocol: aws.String("HTTPS"),
1883+
HealthCheckPath: aws.String("/readyz"),
1884+
HealthCheckIntervalSeconds: aws.Int64(10),
1885+
HealthCheckTimeoutSeconds: aws.Int64(5),
1886+
HealthyThresholdCount: aws.Int64(5),
1887+
UnhealthyThresholdCount: aws.Int64(3),
1888+
Tags: []*elbv2.Tag{
1889+
{
1890+
Key: aws.String("test"),
1891+
Value: aws.String("tag"),
1892+
},
1893+
},
1894+
})).Return(&elbv2.CreateTargetGroupOutput{
1895+
TargetGroups: []*elbv2.TargetGroup{
1896+
{
1897+
TargetGroupArn: aws.String("target-group::arn"),
1898+
TargetGroupName: aws.String("name"),
1899+
VpcId: aws.String(vpcID),
1900+
HealthCheckEnabled: aws.Bool(true),
1901+
HealthCheckPort: aws.String(infrav1.DefaultAPIServerPortString),
1902+
HealthCheckProtocol: aws.String("HTTPS"),
1903+
HealthCheckPath: aws.String("/readyz"),
1904+
HealthCheckIntervalSeconds: aws.Int64(10),
1905+
HealthCheckTimeoutSeconds: aws.Int64(5),
1906+
HealthyThresholdCount: aws.Int64(5),
1907+
UnhealthyThresholdCount: aws.Int64(3),
1908+
},
1909+
},
1910+
}, nil)
1911+
m.CreateListener(gomock.Eq(&elbv2.CreateListenerInput{
1912+
DefaultActions: []*elbv2.Action{
1913+
{
1914+
TargetGroupArn: aws.String("target-group::arn"),
1915+
Type: aws.String(elbv2.ActionTypeEnumForward),
1916+
},
1917+
},
1918+
LoadBalancerArn: aws.String(elbArn),
1919+
Port: aws.Int64(infrav1.DefaultAPIServerPort),
1920+
Protocol: aws.String("TCP"),
1921+
Tags: []*elbv2.Tag{
1922+
{
1923+
Key: aws.String("test"),
1924+
Value: aws.String("tag"),
1925+
},
1926+
},
1927+
})).Return(&elbv2.CreateListenerOutput{
1928+
Listeners: []*elbv2.Listener{
1929+
{
1930+
ListenerArn: aws.String("listener::arn"),
1931+
},
1932+
},
1933+
}, nil)
1934+
m.ModifyTargetGroupAttributes(gomock.Eq(&elbv2.ModifyTargetGroupAttributesInput{
1935+
TargetGroupArn: aws.String("target-group::arn"),
1936+
Attributes: []*elbv2.TargetGroupAttribute{
1937+
{
1938+
Key: aws.String(infrav1.TargetGroupAttributeEnablePreserveClientIP),
1939+
Value: aws.String("false"),
1940+
},
1941+
},
1942+
})).Return(nil, nil)
1943+
},
1944+
check: func(t *testing.T, lb *infrav1.LoadBalancer, err error) {
1945+
t.Helper()
1946+
if err != nil {
1947+
t.Fatalf("did not expect error: %v", err)
1948+
}
1949+
got := *lb.ELBListeners[0].TargetGroup.HealthCheck.Protocol
1950+
want := "HTTPS"
1951+
if got != want {
1952+
t.Fatalf("Health Check protocol for the API Target group did not equal expected value: %s; was: '%s'", want, got)
1953+
}
1954+
},
1955+
},
16871956
}
16881957

16891958
for _, tc := range tests {
@@ -1751,7 +2020,7 @@ func TestCreateNLB(t *testing.T) {
17512020
VpcID: vpcID,
17522021
HealthCheck: &infrav1.TargetGroupHealthCheck{
17532022
Protocol: aws.String("tcp"),
1754-
Port: aws.String("infrav1.DefaultAPIServerPort"),
2023+
Port: aws.String(infrav1.DefaultAPIServerPortString),
17552024
},
17562025
},
17572026
},

0 commit comments

Comments
 (0)