sigs.k8s.io/cluster-api-provider-aws@v1.5.5/controllers/helpers_test.go (about) 1 /* 2 Copyright 2022 The Kubernetes Authors. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 package controllers 17 18 import ( 19 "sort" 20 "testing" 21 22 "github.com/aws/aws-sdk-go/aws" 23 "github.com/aws/aws-sdk-go/service/elb" 24 "github.com/golang/mock/gomock" 25 "github.com/google/go-cmp/cmp" 26 . "github.com/onsi/gomega" 27 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 28 29 infrav1 "sigs.k8s.io/cluster-api-provider-aws/api/v1beta1" 30 "sigs.k8s.io/cluster-api-provider-aws/pkg/cloud/scope" 31 "sigs.k8s.io/cluster-api-provider-aws/test/mocks" 32 clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" 33 "sigs.k8s.io/cluster-api/util/conditions" 34 ) 35 36 const DNSName = "www.google.com" 37 38 var ( 39 lbName = aws.String("test-cluster-apiserver") 40 describeLBInput = &elb.DescribeLoadBalancersInput{ 41 LoadBalancerNames: aws.StringSlice([]string{"test-cluster-apiserver"}), 42 } 43 describeLBAttributesInput = &elb.DescribeLoadBalancerAttributesInput{ 44 LoadBalancerName: lbName, 45 } 46 describeLBOutput = &elb.DescribeLoadBalancersOutput{ 47 LoadBalancerDescriptions: []*elb.LoadBalancerDescription{ 48 { 49 Scheme: aws.String(string(infrav1.ClassicELBSchemeInternetFacing)), 50 Subnets: []*string{aws.String("subnet-1")}, 51 AvailabilityZones: []*string{aws.String("us-east-1a")}, 52 VPCId: aws.String("vpc-exists"), 53 }, 54 }, 55 } 56 describeLBAttributesOutput = &elb.DescribeLoadBalancerAttributesOutput{ 57 LoadBalancerAttributes: &elb.LoadBalancerAttributes{ 58 CrossZoneLoadBalancing: &elb.CrossZoneLoadBalancing{ 59 Enabled: aws.Bool(false), 60 }, 61 }, 62 } 63 expectedTags = []*elb.Tag{ 64 { 65 Key: aws.String("Name"), 66 Value: lbName, 67 }, 68 { 69 Key: aws.String("sigs.k8s.io/cluster-api-provider-aws/cluster/test-cluster"), 70 Value: aws.String("owned"), 71 }, 72 { 73 Key: aws.String("sigs.k8s.io/cluster-api-provider-aws/role"), 74 Value: aws.String("apiserver"), 75 }, 76 } 77 ) 78 79 func expectAWSClusterConditions(g *WithT, m *infrav1.AWSCluster, expected []conditionAssertion) { 80 g.Expect(len(m.Status.Conditions)).To(BeNumerically(">=", len(expected)), "number of conditions") 81 for _, c := range expected { 82 actual := conditions.Get(m, c.conditionType) 83 g.Expect(actual).To(Not(BeNil())) 84 g.Expect(actual.Type).To(Equal(c.conditionType)) 85 g.Expect(actual.Status).To(Equal(c.status)) 86 g.Expect(actual.Severity).To(Equal(c.severity)) 87 g.Expect(actual.Reason).To(Equal(c.reason)) 88 } 89 } 90 91 func getAWSCluster(name, namespace string) infrav1.AWSCluster { 92 return infrav1.AWSCluster{ 93 ObjectMeta: metav1.ObjectMeta{ 94 Name: name, 95 Namespace: namespace, 96 }, 97 Spec: infrav1.AWSClusterSpec{ 98 Region: "us-east-1", 99 NetworkSpec: infrav1.NetworkSpec{ 100 VPC: infrav1.VPCSpec{ 101 ID: "vpc-exists", 102 CidrBlock: "10.0.0.0/8", 103 }, 104 Subnets: infrav1.Subnets{ 105 { 106 ID: "subnet-1", 107 AvailabilityZone: "us-east-1a", 108 CidrBlock: "10.0.10.0/24", 109 IsPublic: false, 110 }, 111 { 112 ID: "subnet-2", 113 AvailabilityZone: "us-east-1c", 114 CidrBlock: "10.0.11.0/24", 115 IsPublic: true, 116 }, 117 }, 118 SecurityGroupOverrides: map[infrav1.SecurityGroupRole]string{}, 119 }, 120 Bastion: infrav1.Bastion{Enabled: true}, 121 }, 122 } 123 } 124 125 func getClusterScope(awsCluster infrav1.AWSCluster) (*scope.ClusterScope, error) { 126 return scope.NewClusterScope( 127 scope.ClusterScopeParams{ 128 Client: testEnv.Client, 129 Cluster: &clusterv1.Cluster{ 130 ObjectMeta: metav1.ObjectMeta{ 131 Name: "test-cluster", 132 }, 133 }, 134 AWSCluster: &awsCluster, 135 }, 136 ) 137 } 138 139 func mockedCreateLBCalls(t *testing.T, m *mocks.MockELBAPIMockRecorder) { 140 t.Helper() 141 m.DescribeLoadBalancers(gomock.Eq(describeLBInput)). 142 Return(describeLBOutput, nil).MinTimes(1) 143 m.DescribeLoadBalancerAttributes(gomock.Eq(describeLBAttributesInput)). 144 Return(describeLBAttributesOutput, nil) 145 m.DescribeTags(&elb.DescribeTagsInput{LoadBalancerNames: aws.StringSlice([]string{*lbName})}).Return( 146 &elb.DescribeTagsOutput{ 147 TagDescriptions: []*elb.TagDescription{ 148 { 149 LoadBalancerName: lbName, 150 Tags: []*elb.Tag{{ 151 Key: aws.String(infrav1.ClusterTagKey("test-cluster-apiserver")), 152 Value: aws.String(string(infrav1.ResourceLifecycleOwned)), 153 }}, 154 }, 155 }, 156 }, nil) 157 m.ModifyLoadBalancerAttributes(gomock.Eq(&elb.ModifyLoadBalancerAttributesInput{ 158 LoadBalancerAttributes: &elb.LoadBalancerAttributes{ 159 ConnectionSettings: &elb.ConnectionSettings{IdleTimeout: aws.Int64(600)}, 160 CrossZoneLoadBalancing: &elb.CrossZoneLoadBalancing{Enabled: aws.Bool(false)}, 161 }, 162 LoadBalancerName: aws.String(""), 163 })).MaxTimes(1) 164 165 m.AddTags(gomock.AssignableToTypeOf(&elb.AddTagsInput{})).Return(&elb.AddTagsOutput{}, nil).Do( 166 func(actual *elb.AddTagsInput) { 167 sortTagsByKey := func(tags []*elb.Tag) { 168 sort.Slice(tags, func(i, j int) bool { 169 return *(tags[i].Key) < *(tags[j].Key) 170 }) 171 } 172 173 sortTagsByKey(actual.Tags) 174 if !cmp.Equal(expectedTags, actual.Tags) { 175 t.Fatalf("Actual AddTagsInput did not match expected, Actual : %v, Expected: %v", actual.Tags, expectedTags) 176 } 177 }).AnyTimes() 178 m.RemoveTags(gomock.Eq(&elb.RemoveTagsInput{ 179 LoadBalancerNames: aws.StringSlice([]string{""}), 180 Tags: []*elb.TagKeyOnly{ 181 { 182 Key: aws.String("sigs.k8s.io/cluster-api-provider-aws/cluster/test-cluster-apiserver"), 183 }, 184 }, 185 })).MaxTimes(1) 186 m.ApplySecurityGroupsToLoadBalancer(gomock.Eq(&elb.ApplySecurityGroupsToLoadBalancerInput{ 187 LoadBalancerName: aws.String(""), 188 SecurityGroups: aws.StringSlice([]string{"sg-apiserver-lb"}), 189 })).MaxTimes(1) 190 m.RegisterInstancesWithLoadBalancer(gomock.Eq(&elb.RegisterInstancesWithLoadBalancerInput{Instances: []*elb.Instance{{InstanceId: aws.String("two")}}, LoadBalancerName: lbName})).MaxTimes(1) 191 } 192 193 func mockedDeleteLBCalls(m *mocks.MockELBAPIMockRecorder) { 194 m.DescribeLoadBalancers(gomock.Eq(describeLBInput)). 195 Return(describeLBOutput, nil) 196 m.DescribeLoadBalancers(gomock.Eq(describeLBInput)). 197 Return(&elb.DescribeLoadBalancersOutput{}, nil).AnyTimes() 198 m.DescribeTags(&elb.DescribeTagsInput{LoadBalancerNames: aws.StringSlice([]string{*lbName})}).Return( 199 &elb.DescribeTagsOutput{ 200 TagDescriptions: []*elb.TagDescription{ 201 { 202 LoadBalancerName: lbName, 203 }, 204 }, 205 }, nil).MaxTimes(1) 206 m.DescribeLoadBalancerAttributes(gomock.Eq(describeLBAttributesInput)). 207 Return(describeLBAttributesOutput, nil).MaxTimes(1) 208 m.DeleteLoadBalancer(gomock.Eq(&elb.DeleteLoadBalancerInput{LoadBalancerName: lbName})). 209 Return(&elb.DeleteLoadBalancerOutput{}, nil).MaxTimes(1) 210 m.DescribeLoadBalancersPages(gomock.Any(), gomock.Any()).Return(nil).AnyTimes() 211 }