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  }