diff --git a/Makefile b/Makefile index 84e7b00d8f..07bf590963 100644 --- a/Makefile +++ b/Makefile @@ -606,7 +606,7 @@ promote-images: $(KPROMO) $(YQ) .PHONY: release-binaries release-binaries: $(GORELEASER) ## Builds only the binaries, not a release. - $(GORELEASER) build --config $(GORELEASER_CONFIG) --snapshot --clean + GOMAXPROCS=2 $(GORELEASER) build --config $(GORELEASER_CONFIG) --snapshot --clean .PHONY: release-staging release-staging: ## Builds and push container images and manifests to the staging bucket. diff --git a/go.mod b/go.mod index 493d8e7f61..230c1d9df7 100644 --- a/go.mod +++ b/go.mod @@ -7,14 +7,20 @@ require ( github.com/apparentlymart/go-cidr v1.1.0 github.com/aws/amazon-vpc-cni-k8s v1.15.5 github.com/aws/aws-lambda-go v1.41.0 - github.com/aws/aws-sdk-go v1.55.5 + github.com/aws/aws-sdk-go v1.55.7 github.com/aws/aws-sdk-go-v2 v1.36.5 github.com/aws/aws-sdk-go-v2/config v1.27.11 github.com/aws/aws-sdk-go-v2/credentials v1.17.11 github.com/aws/aws-sdk-go-v2/service/autoscaling v1.52.4 + github.com/aws/aws-sdk-go-v2/service/ec2 v1.159.0 github.com/aws/aws-sdk-go-v2/service/eks v1.64.0 + github.com/aws/aws-sdk-go-v2/service/elasticloadbalancing v1.29.3 + github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.45.2 github.com/aws/aws-sdk-go-v2/service/iam v1.32.0 + github.com/aws/aws-sdk-go-v2/service/resourcegroupstaggingapi v1.26.3 github.com/aws/aws-sdk-go-v2/service/s3 v1.53.1 + github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.28.6 + github.com/aws/aws-sdk-go-v2/service/ssm v1.59.0 github.com/aws/aws-sdk-go-v2/service/sts v1.28.6 github.com/aws/smithy-go v1.22.4 github.com/awslabs/goformation/v4 v4.19.5 @@ -85,14 +91,12 @@ require ( github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 // indirect github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.36 // indirect github.com/aws/aws-sdk-go-v2/service/cloudformation v1.50.0 // indirect - github.com/aws/aws-sdk-go-v2/service/ec2 v1.159.0 // indirect github.com/aws/aws-sdk-go-v2/service/eventbridge v1.39.3 github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 // indirect github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.7 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.7 // indirect github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.5 // indirect github.com/aws/aws-sdk-go-v2/service/organizations v1.27.3 // indirect - github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.28.6 // indirect github.com/aws/aws-sdk-go-v2/service/servicequotas v1.21.4 // indirect github.com/aws/aws-sdk-go-v2/service/sqs v1.38.8 github.com/aws/aws-sdk-go-v2/service/sso v1.20.5 // indirect diff --git a/go.sum b/go.sum index 9a00918d68..b286659c1c 100644 --- a/go.sum +++ b/go.sum @@ -46,8 +46,8 @@ github.com/aws/amazon-vpc-cni-k8s v1.15.5 h1:/mqTXB4HoGYg4CiU4Gco9iEvZ+V/309Na4H github.com/aws/amazon-vpc-cni-k8s v1.15.5/go.mod h1:jV4wNtmgT2Ra1/oZU99DPOFsCUKnf0mYfIyzDyAUVAY= github.com/aws/aws-lambda-go v1.41.0 h1:l/5fyVb6Ud9uYd411xdHZzSf2n86TakxzpvIoz7l+3Y= github.com/aws/aws-lambda-go v1.41.0/go.mod h1:jwFe2KmMsHmffA1X2R09hH6lFzJQxzI8qK17ewzbQMM= -github.com/aws/aws-sdk-go v1.55.5 h1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU= -github.com/aws/aws-sdk-go v1.55.5/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= +github.com/aws/aws-sdk-go v1.55.7 h1:UJrkFq7es5CShfBwlWAC8DA077vp8PyVbQd3lqLiztE= +github.com/aws/aws-sdk-go v1.55.7/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= github.com/aws/aws-sdk-go-v2 v1.36.5 h1:0OF9RiEMEdDdZEMqF9MRjevyxAQcf6gY+E7vwBILFj0= github.com/aws/aws-sdk-go-v2 v1.36.5/go.mod h1:EYrzvCCN9CMUTa5+6lf6MM4tq3Zjp8UhSGR/cBsjai0= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2 h1:x6xsQXGSmW6frevwDA+vi/wqhp1ct18mVXYN08/93to= @@ -74,6 +74,10 @@ github.com/aws/aws-sdk-go-v2/service/ec2 v1.159.0 h1:DmmVmiLPlcntOcjWMRwDPMNx/wi github.com/aws/aws-sdk-go-v2/service/ec2 v1.159.0/go.mod h1:xejKuuRDjz6z5OqyeLsz01MlOqqW7CqpAB4PabNvpu8= github.com/aws/aws-sdk-go-v2/service/eks v1.64.0 h1:EYeOThTRysemFtC6J6h6b7dNg3jN03QuO5cg92ojIQE= github.com/aws/aws-sdk-go-v2/service/eks v1.64.0/go.mod h1:v1xXy6ea0PHtWkjFUvAUh6B/5wv7UF909Nru0dOIJDk= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancing v1.29.3 h1:DpyV8LeDf0y7iDaGZ3h1Y+Nh5IaBOR+xj44vVgEEegY= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancing v1.29.3/go.mod h1:H232HdqVlSUoqy0cMJYW1TKjcxvGFGFZ20xQG8fOAPw= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.45.2 h1:vX70Z4lNSr7XsioU0uJq5yvxgI50sB66MvD+V/3buS4= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.45.2/go.mod h1:xnCC3vFBfOKpU6PcsCKL2ktgBTZfOwTGxj6V8/X3IS4= github.com/aws/aws-sdk-go-v2/service/eventbridge v1.39.3 h1:T6L7fsONflMeXuvsT8qZ247hA8ShBB0jF9yUEhW4JqI= github.com/aws/aws-sdk-go-v2/service/eventbridge v1.39.3/go.mod h1:sIrUII6Z+hAVAgcpmsc2e9HvEr++m/v8aBPT7s4ZYUk= github.com/aws/aws-sdk-go-v2/service/iam v1.32.0 h1:ZNlfPdw849gBo/lvLFbEEvpTJMij0LXqiNWZ+lIamlU= @@ -88,6 +92,8 @@ github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.5 h1:f9RyWNtS8oH7cZ github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.5/go.mod h1:h5CoMZV2VF297/VLhRhO1WF+XYWOzXo+4HsObA4HjBQ= github.com/aws/aws-sdk-go-v2/service/organizations v1.27.3 h1:CnPWlONzFX9/yO6IGuKg9sWUE8WhKztYRFbhmOHXjJI= github.com/aws/aws-sdk-go-v2/service/organizations v1.27.3/go.mod h1:hUHSXe9HFEmLfHrXndAX5e69rv0nBsg22VuNQYl0JLM= +github.com/aws/aws-sdk-go-v2/service/resourcegroupstaggingapi v1.26.3 h1:P87jejqS8WvQvRWyXlHUylt99VXt0y/WUIFuU6gBU7A= +github.com/aws/aws-sdk-go-v2/service/resourcegroupstaggingapi v1.26.3/go.mod h1:cgPfPTC/V3JqwCKed7Q6d0FrgarV7ltz4Bz6S4Q+Dqk= github.com/aws/aws-sdk-go-v2/service/s3 v1.53.1 h1:6cnno47Me9bRykw9AEv9zkXE+5or7jz8TsskTTccbgc= github.com/aws/aws-sdk-go-v2/service/s3 v1.53.1/go.mod h1:qmdkIIAC+GCLASF7R2whgNrJADz0QZPX+Seiw/i4S3o= github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.28.6 h1:TIOEjw0i2yyhmhRry3Oeu9YtiiHWISZ6j/irS1W3gX4= @@ -96,6 +102,8 @@ github.com/aws/aws-sdk-go-v2/service/servicequotas v1.21.4 h1:SSDkZRAO8Ok5SoQ4BJ github.com/aws/aws-sdk-go-v2/service/servicequotas v1.21.4/go.mod h1:plXue/Zg49kU3uU6WwfCWgRR5SRINNiJf03Y/UhYOhU= github.com/aws/aws-sdk-go-v2/service/sqs v1.38.8 h1:80dpSqWMwx2dAm30Ib7J6ucz1ZHfiv5OCRwN/EnCOXQ= github.com/aws/aws-sdk-go-v2/service/sqs v1.38.8/go.mod h1:IzNt/udsXlETCdvBOL0nmyMe2t9cGmXmZgsdoZGYYhI= +github.com/aws/aws-sdk-go-v2/service/ssm v1.59.0 h1:KWArCwA/WkuHWKfygkNz0B6YS6OvdgoJUaJHX0Qby1s= +github.com/aws/aws-sdk-go-v2/service/ssm v1.59.0/go.mod h1:PUWUl5MDiYNQkUHN9Pyd9kgtA/YhbxnSnHP+yQqzrM8= github.com/aws/aws-sdk-go-v2/service/sso v1.20.5 h1:vN8hEbpRnL7+Hopy9dzmRle1xmDc7o8tmY0klsr175w= github.com/aws/aws-sdk-go-v2/service/sso v1.20.5/go.mod h1:qGzynb/msuZIE8I75DVRCUXw3o3ZyBmUvMwQ2t/BrGM= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.4 h1:Jux+gDDyi1Lruk+KHF91tK2KCuY61kzoCpvtvJJBtOE= diff --git a/pkg/cloud/convertersv2/tags.go b/pkg/cloud/convertersv2/tags.go new file mode 100644 index 0000000000..69d2ae3f68 --- /dev/null +++ b/pkg/cloud/convertersv2/tags.go @@ -0,0 +1,202 @@ +/* +Copyright 2025 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Package convertersv2 provides conversion functions for AWS SDK V2 types to CAPA types. +package convertersv2 + +import ( + "sort" + + "github.com/aws/aws-sdk-go-v2/aws" + autoscalingtypes "github.com/aws/aws-sdk-go-v2/service/autoscaling/types" + v2ec2types "github.com/aws/aws-sdk-go-v2/service/ec2/types" + elbv1types "github.com/aws/aws-sdk-go-v2/service/elasticloadbalancing/types" + elbv2types "github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2/types" + iamtypes "github.com/aws/aws-sdk-go-v2/service/iam/types" + secretsmanagertypes "github.com/aws/aws-sdk-go-v2/service/secretsmanager/types" + ssmtypes "github.com/aws/aws-sdk-go-v2/service/ssm/types" + + infrav1 "sigs.k8s.io/cluster-api-provider-aws/v2/api/v1beta2" +) + +// TagsToMap converts a []v2ec2types.Tag into a infrav1.Tags. +func TagsToMap(src []v2ec2types.Tag) infrav1.Tags { + tags := make(infrav1.Tags, len(src)) + + for _, t := range src { + tags[*t.Key] = *t.Value + } + + return tags +} + +// MapPtrToMap converts a [string]*string into a infrav1.Tags. +func MapPtrToMap(src map[string]*string) infrav1.Tags { + tags := make(infrav1.Tags, len(src)) + + for k, v := range src { + tags[k] = *v + } + + return tags +} + +// MapToTags converts a infrav1.Tags to a []v2ec2types.Tag. +func MapToTags(src infrav1.Tags) []v2ec2types.Tag { + tags := make([]v2ec2types.Tag, 0, len(src)) + + for k, v := range src { + tag := v2ec2types.Tag{ + Key: aws.String(k), + Value: aws.String(v), + } + + tags = append(tags, tag) + } + + // Sort so that unit tests can expect a stable order + sort.Slice(tags, func(i, j int) bool { return *tags[i].Key < *tags[j].Key }) + + return tags +} + +// ELBTagsToMap converts a []elbv1types.Tag into a infrav1.Tags. +func ELBTagsToMap(src []elbv1types.Tag) infrav1.Tags { + tags := make(infrav1.Tags, len(src)) + + for _, t := range src { + tags[*t.Key] = *t.Value + } + + return tags +} + +// V2TagsToMap converts a []elbv2types.Tag into a infrav1.Tags. +func V2TagsToMap(src []elbv2types.Tag) infrav1.Tags { + tags := make(infrav1.Tags, len(src)) + + for _, t := range src { + tags[*t.Key] = *t.Value + } + + return tags +} + +// MapToELBTags converts a infrav1.Tags to a []elbv1types.Tag. +func MapToELBTags(src infrav1.Tags) []elbv1types.Tag { + tags := make([]elbv1types.Tag, 0, len(src)) + + for k, v := range src { + tag := elbv1types.Tag{ + Key: aws.String(k), + Value: aws.String(v), + } + + tags = append(tags, tag) + } + + // Sort so that unit tests can expect a stable order + sort.Slice(tags, func(i, j int) bool { return *tags[i].Key < *tags[j].Key }) + + return tags +} + +// MapToV2Tags converts a infrav1.Tags to a []elbv2types.Tag. +func MapToV2Tags(src infrav1.Tags) []elbv2types.Tag { + tags := make([]elbv2types.Tag, 0, len(src)) + + for k, v := range src { + tag := elbv2types.Tag{ + Key: aws.String(k), + Value: aws.String(v), + } + + tags = append(tags, tag) + } + + // Sort so that unit tests can expect a stable order + sort.Slice(tags, func(i, j int) bool { return *tags[i].Key < *tags[j].Key }) + + return tags +} + +// MapToSecretsManagerTags converts a infrav1.Tags to a []secretsmanagertypes.Tag. +func MapToSecretsManagerTags(src infrav1.Tags) []secretsmanagertypes.Tag { + tags := make([]secretsmanagertypes.Tag, 0, len(src)) + + for k, v := range src { + tag := secretsmanagertypes.Tag{ + Key: aws.String(k), + Value: aws.String(v), + } + + tags = append(tags, tag) + } + + // Sort so that unit tests can expect a stable order + sort.Slice(tags, func(i, j int) bool { return *tags[i].Key < *tags[j].Key }) + + return tags +} + +// MapToSSMTags converts a infrav1.Tags to a []ssm.Tag. +func MapToSSMTags(src infrav1.Tags) []ssmtypes.Tag { + tags := make([]ssmtypes.Tag, 0, len(src)) + + for k, v := range src { + tag := ssmtypes.Tag{ + Key: aws.String(k), + Value: aws.String(v), + } + + tags = append(tags, tag) + } + + // Sort so that unit tests can expect a stable order + sort.Slice(tags, func(i, j int) bool { return *tags[i].Key < *tags[j].Key }) + + return tags +} + +// MapToIAMTags converts a infrav1.Tags to a []iamtypes.Tag. +func MapToIAMTags(src infrav1.Tags) []iamtypes.Tag { + tags := make([]iamtypes.Tag, 0, len(src)) + + for k, v := range src { + tag := iamtypes.Tag{ + Key: aws.String(k), + Value: aws.String(v), + } + + tags = append(tags, tag) + } + + // Sort so that unit tests can expect a stable order + sort.Slice(tags, func(i, j int) bool { return *tags[i].Key < *tags[j].Key }) + + return tags +} + +// ASGTagsToMap converts a []autoscalingtypes.TagDescription into a infrav1.Tags. +func ASGTagsToMap(src []autoscalingtypes.TagDescription) infrav1.Tags { + tags := make(infrav1.Tags, len(src)) + + for _, t := range src { + tags[*t.Key] = *t.Value + } + + return tags +} diff --git a/pkg/cloud/filterv2/ec2.go b/pkg/cloud/filterv2/ec2.go new file mode 100644 index 0000000000..ef87eabd4a --- /dev/null +++ b/pkg/cloud/filterv2/ec2.go @@ -0,0 +1,176 @@ +/* +Copyright 2025 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Package filterv2 contains the ec2 sdk related filters. +package filterv2 + +import ( + "fmt" + + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/service/ec2/types" + + infrav1 "sigs.k8s.io/cluster-api-provider-aws/v2/api/v1beta2" +) + +const ( + filterNameTagKey = "tag-key" + filterNameVpcID = "vpc-id" + filterNameState = "state" + filterNameVpcAttachment = "attachment.vpc-id" + filterAvailabilityZone = "availability-zone" + filterNameIPAMPoolID = "ipam-pool-id" +) + +// EC2 exposes the ec2 sdk related filters. +var EC2 = new(ec2Filters) + +type ec2Filters struct{} + +// Cluster returns a filter based on the cluster name. +func (ec2Filters) Cluster(clusterName string) *types.Filter { + return &types.Filter{ + Name: aws.String(filterNameTagKey), + Values: []string{infrav1.ClusterTagKey(clusterName)}, + } +} + +// Name returns a filter based on the resource name. +func (ec2Filters) Name(name string) *types.Filter { + return &types.Filter{ + Name: aws.String("tag:Name"), + Values: []string{name}, + } +} + +// ClusterOwned returns a filter using the Cluster API per-cluster tag where +// the resource is owned. +func (ec2Filters) ClusterOwned(clusterName string) *types.Filter { + return &types.Filter{ + Name: aws.String(fmt.Sprintf("tag:%s", infrav1.ClusterTagKey(clusterName))), + Values: []string{string(infrav1.ResourceLifecycleOwned)}, + } +} + +// ClusterShared returns a filter using the Cluster API per-cluster tag where +// the resource is shared. +func (ec2Filters) ClusterShared(clusterName string) *types.Filter { + return &types.Filter{ + Name: aws.String(fmt.Sprintf("tag:%s", infrav1.ClusterTagKey(clusterName))), + Values: []string{string(infrav1.ResourceLifecycleShared)}, + } +} + +// ProviderRole returns a filter using cluster-api-provider-aws role tag. +func (ec2Filters) ProviderRole(role string) *types.Filter { + return &types.Filter{ + Name: aws.String(fmt.Sprintf("tag:%s", infrav1.NameAWSClusterAPIRole)), + Values: []string{role}, + } +} + +// ProviderOwned returns a filter using the cloud provider tag where the resource is owned. +func (ec2Filters) ProviderOwned(clusterName string) *types.Filter { + return &types.Filter{ + Name: aws.String(fmt.Sprintf("tag:%s", infrav1.ClusterAWSCloudProviderTagKey(clusterName))), + Values: []string{string(infrav1.ResourceLifecycleOwned)}, + } +} + +// IPAM returns a filter based on the id of the IPAM Pool. +func (ec2Filters) IPAM(ipamPoolID string) *types.Filter { + return &types.Filter{ + Name: aws.String(filterNameIPAMPoolID), + Values: []string{ipamPoolID}, + } +} + +// VPC returns a filter based on the id of the VPC. +func (ec2Filters) VPC(vpcID string) *types.Filter { + return &types.Filter{ + Name: aws.String(filterNameVpcID), + Values: []string{vpcID}, + } +} + +// VPCAttachment returns a filter based on the vpc id attached to the resource. +func (ec2Filters) VPCAttachment(vpcID string) *types.Filter { + return &types.Filter{ + Name: aws.String(filterNameVpcAttachment), + Values: []string{vpcID}, + } +} + +// Available returns a filter based on the state being available. +func (ec2Filters) Available() *types.Filter { + return &types.Filter{ + Name: aws.String(filterNameState), + Values: []string{"available"}, + } +} + +// NATGatewayStates returns a filter based on the list of states passed in. +func (ec2Filters) NATGatewayStates(states ...string) *types.Filter { + return &types.Filter{ + Name: aws.String("state"), + Values: states, + } +} + +// InstanceStates returns a filter based on the list of states passed in. +func (ec2Filters) InstanceStates(states ...string) *types.Filter { + return &types.Filter{ + Name: aws.String("instance-state-name"), + Values: states, + } +} + +// VPCStates returns a filter based on the list of states passed in. +func (ec2Filters) VPCStates(states ...string) *types.Filter { + return &types.Filter{ + Name: aws.String("state"), + Values: states, + } +} + +// SubnetStates returns a filter based on the list of states passed in. +func (ec2Filters) SubnetStates(states ...string) *types.Filter { + return &types.Filter{ + Name: aws.String("state"), + Values: states, + } +} + +func (ec2Filters) AvailabilityZone(zone string) *types.Filter { + return &types.Filter{ + Name: aws.String(filterAvailabilityZone), + Values: []string{zone}, + } +} + +func (ec2Filters) IgnoreLocalZones() *types.Filter { + return &types.Filter{ + Name: aws.String("opt-in-status"), + Values: []string{"opt-in-not-required"}, + } +} + +func (ec2Filters) SecurityGroupName(name string) *types.Filter { + return &types.Filter{ + Name: aws.String("group-name"), + Values: []string{name}, + } +} diff --git a/pkg/cloud/scope/clients.go b/pkg/cloud/scope/clients.go index b84b490cef..ba24c0c8d2 100644 --- a/pkg/cloud/scope/clients.go +++ b/pkg/cloud/scope/clients.go @@ -17,10 +17,16 @@ limitations under the License. package scope import ( + "context" + "github.com/aws/aws-sdk-go-v2/service/autoscaling" + ec2v2 "github.com/aws/aws-sdk-go-v2/service/ec2" "github.com/aws/aws-sdk-go-v2/service/eks" + elasticloadbalancing "github.com/aws/aws-sdk-go-v2/service/elasticloadbalancing" + elasticloadbalancingv2 "github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2" "github.com/aws/aws-sdk-go-v2/service/eventbridge" "github.com/aws/aws-sdk-go-v2/service/iam" + resourcegroupstaggingapiv2 "github.com/aws/aws-sdk-go-v2/service/resourcegroupstaggingapi" "github.com/aws/aws-sdk-go-v2/service/s3" "github.com/aws/aws-sdk-go-v2/service/sqs" "github.com/aws/aws-sdk-go/aws" @@ -52,6 +58,37 @@ import ( "sigs.k8s.io/cluster-api-provider-aws/v2/version" ) +// ResourceGroupsTaggingAPIAPI is a compatibility layer for the v1 resourcegroupstaggingapiiface.ResourceGroupsTaggingAPIAPI interface. +// It is used to provide a consistent interface for the GetResources method. +type ResourceGroupsTaggingAPIAPI interface { + resourcegroupstaggingapiv2.GetResourcesAPIClient +} + +// ELBV2API is a compatibility layer for the v2 elasticloadbalancingv2.Client interface. +type ELBV2API interface { + DescribeLoadBalancers(ctx context.Context, params *elasticloadbalancingv2.DescribeLoadBalancersInput, optFns ...func(*elasticloadbalancingv2.Options)) (*elasticloadbalancingv2.DescribeLoadBalancersOutput, error) + DescribeTargetGroups(ctx context.Context, params *elasticloadbalancingv2.DescribeTargetGroupsInput, optFns ...func(*elasticloadbalancingv2.Options)) (*elasticloadbalancingv2.DescribeTargetGroupsOutput, error) + DescribeListeners(ctx context.Context, params *elasticloadbalancingv2.DescribeListenersInput, optFns ...func(*elasticloadbalancingv2.Options)) (*elasticloadbalancingv2.DescribeListenersOutput, error) + DescribeTags(ctx context.Context, params *elasticloadbalancingv2.DescribeTagsInput, optFns ...func(*elasticloadbalancingv2.Options)) (*elasticloadbalancingv2.DescribeTagsOutput, error) + DeleteLoadBalancer(ctx context.Context, params *elasticloadbalancingv2.DeleteLoadBalancerInput, optFns ...func(*elasticloadbalancingv2.Options)) (*elasticloadbalancingv2.DeleteLoadBalancerOutput, error) + DeleteTargetGroup(ctx context.Context, params *elasticloadbalancingv2.DeleteTargetGroupInput, optFns ...func(*elasticloadbalancingv2.Options)) (*elasticloadbalancingv2.DeleteTargetGroupOutput, error) + DeleteListener(ctx context.Context, params *elasticloadbalancingv2.DeleteListenerInput, optFns ...func(*elasticloadbalancingv2.Options)) (*elasticloadbalancingv2.DeleteListenerOutput, error) +} + +// EC2API is a compatibility layer for the v1 ec2iface.EC2API interface. +// It is used to provide a consistent interface for the DeleteSecurityGroup method. +type EC2API interface { + DeleteSecurityGroup(context.Context, *ec2v2.DeleteSecurityGroupInput, ...func(*ec2v2.Options)) (*ec2v2.DeleteSecurityGroupOutput, error) + ec2v2.DescribeSecurityGroupsAPIClient +} + +// ELBAPI is a compatibility layer for the v2 elasticloadbalancing.Client interface. +type ELBAPI interface { + DeleteLoadBalancer(ctx context.Context, params *elasticloadbalancing.DeleteLoadBalancerInput, optFns ...func(*elasticloadbalancing.Options)) (*elasticloadbalancing.DeleteLoadBalancerOutput, error) + DescribeLoadBalancers(ctx context.Context, params *elasticloadbalancing.DescribeLoadBalancersInput, optFns ...func(*elasticloadbalancing.Options)) (*elasticloadbalancing.DescribeLoadBalancersOutput, error) + DescribeTags(ctx context.Context, params *elasticloadbalancing.DescribeTagsInput, optFns ...func(*elasticloadbalancing.Options)) (*elasticloadbalancing.DescribeTagsOutput, error) +} + // NewASGClient creates a new ASG API client for a given session. func NewASGClient(scopeUser cloud.ScopeUsage, session cloud.Session, logger logger.Wrapper, target runtime.Object) *autoscaling.Client { cfg := session.SessionV2() @@ -232,6 +269,19 @@ func NewSSMClient(scopeUser cloud.ScopeUsage, session cloud.Session, logger logg return ssmClient } +// NewResourceTaggingClientV2 creates a new Resource Tagging API client for a given session using AWS SDK v2. +func NewResourceTaggingClientV2(scopeUser cloud.ScopeUsage, session cloud.Session, logger logger.Wrapper, target runtime.Object) ResourceGroupsTaggingAPIAPI { + cfg := session.SessionV2() + resourceTaggingOpts := []func(*resourcegroupstaggingapiv2.Options){ + func(o *resourcegroupstaggingapiv2.Options) { + o.Logger = logger.GetAWSLogger() + o.ClientLogMode = awslogs.GetAWSLogLevelV2(logger.GetLogger()) + }, + resourcegroupstaggingapiv2.WithAPIOptions(awsmetricsv2.WithMiddlewares(scopeUser.ControllerName(), target), awsmetricsv2.WithCAPAUserAgentMiddleware()), + } + return resourcegroupstaggingapiv2.NewFromConfig(cfg, resourceTaggingOpts...) +} + // NewS3Client creates a new S3 API client for a given session. func NewS3Client(scopeUser cloud.ScopeUsage, session cloud.Session, logger logger.Wrapper, target runtime.Object) *s3.Client { cfg := session.SessionV2() @@ -250,6 +300,45 @@ func NewS3Client(scopeUser cloud.ScopeUsage, session cloud.Session, logger logge return s3.NewFromConfig(cfg, s3Opts...) } +// NewEC2ClientV2 creates a new EC2 API client for a given session using AWS SDK v2. +func NewEC2ClientV2(scopeUser cloud.ScopeUsage, session cloud.Session, logger logger.Wrapper, target runtime.Object) EC2API { + cfg := session.SessionV2() + ec2Opts := []func(*ec2v2.Options){ + func(o *ec2v2.Options) { + o.Logger = logger.GetAWSLogger() + o.ClientLogMode = awslogs.GetAWSLogLevelV2(logger.GetLogger()) + }, + ec2v2.WithAPIOptions(awsmetricsv2.WithMiddlewares(scopeUser.ControllerName(), target), awsmetricsv2.WithCAPAUserAgentMiddleware()), + } + return ec2v2.NewFromConfig(cfg, ec2Opts...) +} + +// NewELBV2ClientV2 creates a new ELBV2 API client for a given session using AWS SDK v2. +func NewELBV2ClientV2(scopeUser cloud.ScopeUsage, session cloud.Session, logger logger.Wrapper, target runtime.Object) ELBV2API { + cfg := session.SessionV2() + elbOpts := []func(*elasticloadbalancingv2.Options){ + func(o *elasticloadbalancingv2.Options) { + o.Logger = logger.GetAWSLogger() + o.ClientLogMode = awslogs.GetAWSLogLevelV2(logger.GetLogger()) + }, + elasticloadbalancingv2.WithAPIOptions(awsmetricsv2.WithMiddlewares(scopeUser.ControllerName(), target), awsmetricsv2.WithCAPAUserAgentMiddleware()), + } + return elasticloadbalancingv2.NewFromConfig(cfg, elbOpts...) +} + +// NewELBClientV2 creates a new ELB API client for a given session using AWS SDK v2. +func NewELBClientV2(scopeUser cloud.ScopeUsage, session cloud.Session, logger logger.Wrapper, target runtime.Object) ELBAPI { + cfg := session.SessionV2() + elbOpts := []func(*elasticloadbalancing.Options){ + func(o *elasticloadbalancing.Options) { + o.Logger = logger.GetAWSLogger() + o.ClientLogMode = awslogs.GetAWSLogLevelV2(logger.GetLogger()) + }, + elasticloadbalancing.WithAPIOptions(awsmetricsv2.WithMiddlewares(scopeUser.ControllerName(), target), awsmetricsv2.WithCAPAUserAgentMiddleware()), + } + return elasticloadbalancing.NewFromConfig(cfg, elbOpts...) +} + func recordAWSPermissionsIssue(target runtime.Object) func(r *request.Request) { return func(r *request.Request) { if awsErr, ok := r.Error.(awserr.Error); ok { @@ -270,9 +359,12 @@ func getUserAgentHandler() request.NamedHandler { // AWSClients contains all the aws clients used by the scopes. type AWSClients struct { - ASG autoscaling.Client - EC2 ec2iface.EC2API - ELB elbiface.ELBAPI - SecretsManager secretsmanageriface.SecretsManagerAPI - ResourceTagging resourcegroupstaggingapiiface.ResourceGroupsTaggingAPIAPI + ASG autoscaling.Client + EC2 ec2iface.EC2API + EC2V2 *ec2v2.Client + ELB elbiface.ELBAPI + ELBV2 *elbv2.ELBV2 + SecretsManager secretsmanageriface.SecretsManagerAPI + ResourceTagging resourcegroupstaggingapiiface.ResourceGroupsTaggingAPIAPI + ResourceTaggingV2 *resourcegroupstaggingapiv2.Client } diff --git a/pkg/cloud/services/gc/cleanup.go b/pkg/cloud/services/gc/cleanup.go index 27fe88600f..42242026c0 100644 --- a/pkg/cloud/services/gc/cleanup.go +++ b/pkg/cloud/services/gc/cleanup.go @@ -22,9 +22,10 @@ import ( "strconv" "strings" - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/arn" - rgapi "github.com/aws/aws-sdk-go/service/resourcegroupstaggingapi" + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/aws/arn" + rgapi "github.com/aws/aws-sdk-go-v2/service/resourcegroupstaggingapi" + rgapit "github.com/aws/aws-sdk-go-v2/service/resourcegroupstaggingapi/types" infrav1 "sigs.k8s.io/cluster-api-provider-aws/v2/api/v1beta2" "sigs.k8s.io/cluster-api-provider-aws/v2/pkg/annotations" @@ -100,15 +101,15 @@ func (s *Service) defaultGetResources(ctx context.Context) ([]*AWSResource, erro awsInput := rgapi.GetResourcesInput{ ResourceTypeFilters: nil, - TagFilters: []*rgapi.TagFilter{ + TagFilters: []rgapit.TagFilter{ { Key: aws.String(serviceTag), - Values: []*string{aws.String(string(infrav1.ResourceLifecycleOwned))}, + Values: []string{string(infrav1.ResourceLifecycleOwned)}, }, }, } - awsOutput, err := s.resourceTaggingClient.GetResourcesWithContext(ctx, &awsInput) + awsOutput, err := s.resourceTaggingClient.GetResources(ctx, &awsInput) if err != nil { return nil, fmt.Errorf("getting tagged resources: %w", err) } diff --git a/pkg/cloud/services/gc/cleanup_test.go b/pkg/cloud/services/gc/cleanup_test.go index 6416c51a69..65511e1d56 100644 --- a/pkg/cloud/services/gc/cleanup_test.go +++ b/pkg/cloud/services/gc/cleanup_test.go @@ -20,12 +20,13 @@ import ( "context" "testing" + v2ec2 "github.com/aws/aws-sdk-go-v2/service/ec2" + v2elb "github.com/aws/aws-sdk-go-v2/service/elasticloadbalancing" + v2elbv2 "github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2" + rgapiv2 "github.com/aws/aws-sdk-go-v2/service/resourcegroupstaggingapi" + rgapit "github.com/aws/aws-sdk-go-v2/service/resourcegroupstaggingapi/types" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/request" - "github.com/aws/aws-sdk-go/service/ec2" - "github.com/aws/aws-sdk-go/service/elb" - "github.com/aws/aws-sdk-go/service/elbv2" - rgapi "github.com/aws/aws-sdk-go/service/resourcegroupstaggingapi" "github.com/golang/mock/gomock" . "github.com/onsi/gomega" corev1 "k8s.io/api/core/v1" @@ -38,7 +39,7 @@ import ( ekscontrolplanev1 "sigs.k8s.io/cluster-api-provider-aws/v2/controlplane/eks/api/v1beta2" "sigs.k8s.io/cluster-api-provider-aws/v2/pkg/cloud" "sigs.k8s.io/cluster-api-provider-aws/v2/pkg/cloud/scope" - "sigs.k8s.io/cluster-api-provider-aws/v2/test/mocks" + "sigs.k8s.io/cluster-api-provider-aws/v2/test/mocks/v2" clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" ) @@ -65,16 +66,16 @@ func TestReconcileDelete(t *testing.T) { name: "eks with no Service load balancers", clusterScope: createManageScope(t, "", ""), rgAPIMocks: func(m *mocks.MockResourceGroupsTaggingAPIAPIMockRecorder) { - m.GetResourcesWithContext(gomock.Any(), &rgapi.GetResourcesInput{ - TagFilters: []*rgapi.TagFilter{ + m.GetResources(gomock.Any(), &rgapiv2.GetResourcesInput{ + TagFilters: []rgapit.TagFilter{ { Key: aws.String("kubernetes.io/cluster/eks-test-cluster"), - Values: []*string{aws.String("owned")}, + Values: []string{"owned"}, }, }, - }).DoAndReturn(func(awsCtx context.Context, input *rgapi.GetResourcesInput, opts ...request.Option) (*rgapi.GetResourcesOutput, error) { - return &rgapi.GetResourcesOutput{ - ResourceTagMappingList: []*rgapi.ResourceTagMapping{}, + }).DoAndReturn(func(awsCtx context.Context, input *rgapiv2.GetResourcesInput, opts ...request.Option) (*rgapiv2.GetResourcesOutput, error) { + return &rgapiv2.GetResourcesOutput{ + ResourceTagMappingList: []rgapit.ResourceTagMapping{}, }, nil }) }, @@ -87,16 +88,16 @@ func TestReconcileDelete(t *testing.T) { name: "eks with no Service load balancers and explicit opt-in", clusterScope: createManageScope(t, "true", ""), rgAPIMocks: func(m *mocks.MockResourceGroupsTaggingAPIAPIMockRecorder) { - m.GetResourcesWithContext(gomock.Any(), &rgapi.GetResourcesInput{ - TagFilters: []*rgapi.TagFilter{ + m.GetResources(gomock.Any(), &rgapiv2.GetResourcesInput{ + TagFilters: []rgapit.TagFilter{ { Key: aws.String("kubernetes.io/cluster/eks-test-cluster"), - Values: []*string{aws.String("owned")}, + Values: []string{"owned"}, }, }, - }).DoAndReturn(func(awsCtx context.Context, input *rgapi.GetResourcesInput, opts ...request.Option) (*rgapi.GetResourcesOutput, error) { - return &rgapi.GetResourcesOutput{ - ResourceTagMappingList: []*rgapi.ResourceTagMapping{}, + }).DoAndReturn(func(awsCtx context.Context, input *rgapiv2.GetResourcesInput, opts ...request.Option) (*rgapiv2.GetResourcesOutput, error) { + return &rgapiv2.GetResourcesOutput{ + ResourceTagMappingList: []rgapit.ResourceTagMapping{}, }, nil }) }, @@ -109,16 +110,16 @@ func TestReconcileDelete(t *testing.T) { name: "ec2 cluster with no Service load balancers", clusterScope: createUnManageScope(t, "", ""), rgAPIMocks: func(m *mocks.MockResourceGroupsTaggingAPIAPIMockRecorder) { - m.GetResourcesWithContext(gomock.Any(), &rgapi.GetResourcesInput{ - TagFilters: []*rgapi.TagFilter{ + m.GetResources(gomock.Any(), &rgapiv2.GetResourcesInput{ + TagFilters: []rgapit.TagFilter{ { Key: aws.String("kubernetes.io/cluster/cluster1"), - Values: []*string{aws.String("owned")}, + Values: []string{"owned"}, }, }, - }).DoAndReturn(func(awsCtx context.Context, input *rgapi.GetResourcesInput, opts ...request.Option) (*rgapi.GetResourcesOutput, error) { - return &rgapi.GetResourcesOutput{ - ResourceTagMappingList: []*rgapi.ResourceTagMapping{}, + }).DoAndReturn(func(awsCtx context.Context, input *rgapiv2.GetResourcesInput, opts ...request.Option) (*rgapiv2.GetResourcesOutput, error) { + return &rgapiv2.GetResourcesOutput{ + ResourceTagMappingList: []rgapit.ResourceTagMapping{}, }, nil }) }, @@ -131,19 +132,19 @@ func TestReconcileDelete(t *testing.T) { name: "eks with non-Service load balancer", clusterScope: createManageScope(t, "", ""), rgAPIMocks: func(m *mocks.MockResourceGroupsTaggingAPIAPIMockRecorder) { - m.GetResourcesWithContext(gomock.Any(), &rgapi.GetResourcesInput{ - TagFilters: []*rgapi.TagFilter{ + m.GetResources(gomock.Any(), &rgapiv2.GetResourcesInput{ + TagFilters: []rgapit.TagFilter{ { Key: aws.String("kubernetes.io/cluster/eks-test-cluster"), - Values: []*string{aws.String("owned")}, + Values: []string{"owned"}, }, }, - }).DoAndReturn(func(awsCtx context.Context, input *rgapi.GetResourcesInput, opts ...request.Option) (*rgapi.GetResourcesOutput, error) { - return &rgapi.GetResourcesOutput{ - ResourceTagMappingList: []*rgapi.ResourceTagMapping{ + }).DoAndReturn(func(awsCtx context.Context, input *rgapiv2.GetResourcesInput, opts ...request.Option) (*rgapiv2.GetResourcesOutput, error) { + return &rgapiv2.GetResourcesOutput{ + ResourceTagMappingList: []rgapit.ResourceTagMapping{ { ResourceARN: aws.String("arn:aws:elasticloadbalancing:eu-west-2:1234567890:loadbalancer/aec24434cd2ce4630bd14a955413ee37"), - Tags: []*rgapi.Tag{ + Tags: []rgapit.Tag{ { Key: aws.String("kubernetes.io/cluster/eks-test-cluster"), Value: aws.String("owned"), @@ -163,19 +164,19 @@ func TestReconcileDelete(t *testing.T) { name: "ec2 cluster with non-Service load balancer", clusterScope: createUnManageScope(t, "", ""), rgAPIMocks: func(m *mocks.MockResourceGroupsTaggingAPIAPIMockRecorder) { - m.GetResourcesWithContext(gomock.Any(), &rgapi.GetResourcesInput{ - TagFilters: []*rgapi.TagFilter{ + m.GetResources(gomock.Any(), &rgapiv2.GetResourcesInput{ + TagFilters: []rgapit.TagFilter{ { Key: aws.String("kubernetes.io/cluster/cluster1"), - Values: []*string{aws.String("owned")}, + Values: []string{"owned"}, }, }, - }).DoAndReturn(func(awsCtx context.Context, input *rgapi.GetResourcesInput, opts ...request.Option) (*rgapi.GetResourcesOutput, error) { - return &rgapi.GetResourcesOutput{ - ResourceTagMappingList: []*rgapi.ResourceTagMapping{ + }).DoAndReturn(func(awsCtx context.Context, input *rgapiv2.GetResourcesInput, opts ...request.Option) (*rgapiv2.GetResourcesOutput, error) { + return &rgapiv2.GetResourcesOutput{ + ResourceTagMappingList: []rgapit.ResourceTagMapping{ { ResourceARN: aws.String("arn:aws:elasticloadbalancing:eu-west-2:1234567890:loadbalancer/aec24434cd2ce4630bd14a955413ee37"), - Tags: []*rgapi.Tag{ + Tags: []rgapit.Tag{ { Key: aws.String("kubernetes.io/cluster/cluster1"), Value: aws.String("owned"), @@ -195,19 +196,19 @@ func TestReconcileDelete(t *testing.T) { name: "eks with ELB Service load balancer", clusterScope: createManageScope(t, "", ""), rgAPIMocks: func(m *mocks.MockResourceGroupsTaggingAPIAPIMockRecorder) { - m.GetResourcesWithContext(gomock.Any(), &rgapi.GetResourcesInput{ - TagFilters: []*rgapi.TagFilter{ + m.GetResources(gomock.Any(), &rgapiv2.GetResourcesInput{ + TagFilters: []rgapit.TagFilter{ { Key: aws.String("kubernetes.io/cluster/eks-test-cluster"), - Values: []*string{aws.String("owned")}, + Values: []string{"owned"}, }, }, - }).DoAndReturn(func(awsCtx context.Context, input *rgapi.GetResourcesInput, opts ...request.Option) (*rgapi.GetResourcesOutput, error) { - return &rgapi.GetResourcesOutput{ - ResourceTagMappingList: []*rgapi.ResourceTagMapping{ + }).DoAndReturn(func(awsCtx context.Context, input *rgapiv2.GetResourcesInput, opts ...request.Option) (*rgapiv2.GetResourcesOutput, error) { + return &rgapiv2.GetResourcesOutput{ + ResourceTagMappingList: []rgapit.ResourceTagMapping{ { ResourceARN: aws.String("arn:aws:elasticloadbalancing:eu-west-2:1234567890:loadbalancer/aec24434cd2ce4630bd14a955413ee37"), - Tags: []*rgapi.Tag{ + Tags: []rgapit.Tag{ { Key: aws.String("kubernetes.io/cluster/eks-test-cluster"), Value: aws.String("owned"), @@ -223,9 +224,9 @@ func TestReconcileDelete(t *testing.T) { }) }, elbMocks: func(m *mocks.MockELBAPIMockRecorder) { - m.DeleteLoadBalancerWithContext(gomock.Any(), &elb.DeleteLoadBalancerInput{ + m.DeleteLoadBalancer(gomock.Any(), &v2elb.DeleteLoadBalancerInput{ LoadBalancerName: aws.String("aec24434cd2ce4630bd14a955413ee37"), - }).Return(&elb.DeleteLoadBalancerOutput{}, nil) + }).Return(&v2elb.DeleteLoadBalancerOutput{}, nil) }, elbv2Mocks: func(m *mocks.MockELBV2APIMockRecorder) {}, ec2Mocks: func(m *mocks.MockEC2APIMockRecorder) {}, @@ -235,19 +236,19 @@ func TestReconcileDelete(t *testing.T) { name: "ec2 cluster with ELB Service load balancer", clusterScope: createUnManageScope(t, "", ""), rgAPIMocks: func(m *mocks.MockResourceGroupsTaggingAPIAPIMockRecorder) { - m.GetResourcesWithContext(gomock.Any(), &rgapi.GetResourcesInput{ - TagFilters: []*rgapi.TagFilter{ + m.GetResources(gomock.Any(), &rgapiv2.GetResourcesInput{ + TagFilters: []rgapit.TagFilter{ { Key: aws.String("kubernetes.io/cluster/cluster1"), - Values: []*string{aws.String("owned")}, + Values: []string{"owned"}, }, }, - }).DoAndReturn(func(awsCtx context.Context, input *rgapi.GetResourcesInput, opts ...request.Option) (*rgapi.GetResourcesOutput, error) { - return &rgapi.GetResourcesOutput{ - ResourceTagMappingList: []*rgapi.ResourceTagMapping{ + }).DoAndReturn(func(awsCtx context.Context, input *rgapiv2.GetResourcesInput, opts ...request.Option) (*rgapiv2.GetResourcesOutput, error) { + return &rgapiv2.GetResourcesOutput{ + ResourceTagMappingList: []rgapit.ResourceTagMapping{ { ResourceARN: aws.String("arn:aws:elasticloadbalancing:eu-west-2:1234567890:loadbalancer/aec24434cd2ce4630bd14a955413ee37"), - Tags: []*rgapi.Tag{ + Tags: []rgapit.Tag{ { Key: aws.String("kubernetes.io/cluster/cluster1"), Value: aws.String("owned"), @@ -263,9 +264,9 @@ func TestReconcileDelete(t *testing.T) { }) }, elbMocks: func(m *mocks.MockELBAPIMockRecorder) { - m.DeleteLoadBalancerWithContext(gomock.Any(), &elb.DeleteLoadBalancerInput{ + m.DeleteLoadBalancer(gomock.Any(), &v2elb.DeleteLoadBalancerInput{ LoadBalancerName: aws.String("aec24434cd2ce4630bd14a955413ee37"), - }).Return(&elb.DeleteLoadBalancerOutput{}, nil) + }).Return(&v2elb.DeleteLoadBalancerOutput{}, nil) }, elbv2Mocks: func(m *mocks.MockELBV2APIMockRecorder) {}, ec2Mocks: func(m *mocks.MockEC2APIMockRecorder) {}, @@ -275,19 +276,19 @@ func TestReconcileDelete(t *testing.T) { name: "eks with NLB Service load balancer", clusterScope: createManageScope(t, "", ""), rgAPIMocks: func(m *mocks.MockResourceGroupsTaggingAPIAPIMockRecorder) { - m.GetResourcesWithContext(gomock.Any(), &rgapi.GetResourcesInput{ - TagFilters: []*rgapi.TagFilter{ + m.GetResources(gomock.Any(), &rgapiv2.GetResourcesInput{ + TagFilters: []rgapit.TagFilter{ { Key: aws.String("kubernetes.io/cluster/eks-test-cluster"), - Values: []*string{aws.String("owned")}, + Values: []string{"owned"}, }, }, - }).DoAndReturn(func(awsCtx context.Context, input *rgapi.GetResourcesInput, opts ...request.Option) (*rgapi.GetResourcesOutput, error) { - return &rgapi.GetResourcesOutput{ - ResourceTagMappingList: []*rgapi.ResourceTagMapping{ + }).DoAndReturn(func(awsCtx context.Context, input *rgapiv2.GetResourcesInput, opts ...request.Option) (*rgapiv2.GetResourcesOutput, error) { + return &rgapiv2.GetResourcesOutput{ + ResourceTagMappingList: []rgapit.ResourceTagMapping{ { ResourceARN: aws.String("arn:aws:elasticloadbalancing:eu-west-2:1234567890:loadbalancer/net/aec24434cd2ce4630bd14a955413ee37"), - Tags: []*rgapi.Tag{ + Tags: []rgapit.Tag{ { Key: aws.String("kubernetes.io/cluster/eks-test-cluster"), Value: aws.String("owned"), @@ -304,9 +305,9 @@ func TestReconcileDelete(t *testing.T) { }, elbMocks: func(m *mocks.MockELBAPIMockRecorder) {}, elbv2Mocks: func(m *mocks.MockELBV2APIMockRecorder) { - m.DeleteLoadBalancerWithContext(gomock.Any(), &elbv2.DeleteLoadBalancerInput{ + m.DeleteLoadBalancer(gomock.Any(), &v2elbv2.DeleteLoadBalancerInput{ LoadBalancerArn: aws.String("arn:aws:elasticloadbalancing:eu-west-2:1234567890:loadbalancer/net/aec24434cd2ce4630bd14a955413ee37"), - }).Return(&elbv2.DeleteLoadBalancerOutput{}, nil) + }).Return(&v2elbv2.DeleteLoadBalancerOutput{}, nil) }, ec2Mocks: func(m *mocks.MockEC2APIMockRecorder) {}, expectErr: false, @@ -315,19 +316,19 @@ func TestReconcileDelete(t *testing.T) { name: "ec2 cluster with NLB Service load balancer", clusterScope: createUnManageScope(t, "", ""), rgAPIMocks: func(m *mocks.MockResourceGroupsTaggingAPIAPIMockRecorder) { - m.GetResourcesWithContext(gomock.Any(), &rgapi.GetResourcesInput{ - TagFilters: []*rgapi.TagFilter{ + m.GetResources(gomock.Any(), &rgapiv2.GetResourcesInput{ + TagFilters: []rgapit.TagFilter{ { Key: aws.String("kubernetes.io/cluster/cluster1"), - Values: []*string{aws.String("owned")}, + Values: []string{"owned"}, }, }, - }).DoAndReturn(func(awsCtx context.Context, input *rgapi.GetResourcesInput, opts ...request.Option) (*rgapi.GetResourcesOutput, error) { - return &rgapi.GetResourcesOutput{ - ResourceTagMappingList: []*rgapi.ResourceTagMapping{ + }).DoAndReturn(func(awsCtx context.Context, input *rgapiv2.GetResourcesInput, opts ...request.Option) (*rgapiv2.GetResourcesOutput, error) { + return &rgapiv2.GetResourcesOutput{ + ResourceTagMappingList: []rgapit.ResourceTagMapping{ { ResourceARN: aws.String("arn:aws:elasticloadbalancing:eu-west-2:1234567890:loadbalancer/net/aec24434cd2ce4630bd14a955413ee37"), - Tags: []*rgapi.Tag{ + Tags: []rgapit.Tag{ { Key: aws.String("kubernetes.io/cluster/cluster1"), Value: aws.String("owned"), @@ -344,9 +345,9 @@ func TestReconcileDelete(t *testing.T) { }, elbMocks: func(m *mocks.MockELBAPIMockRecorder) {}, elbv2Mocks: func(m *mocks.MockELBV2APIMockRecorder) { - m.DeleteLoadBalancerWithContext(gomock.Any(), &elbv2.DeleteLoadBalancerInput{ + m.DeleteLoadBalancer(gomock.Any(), &v2elbv2.DeleteLoadBalancerInput{ LoadBalancerArn: aws.String("arn:aws:elasticloadbalancing:eu-west-2:1234567890:loadbalancer/net/aec24434cd2ce4630bd14a955413ee37"), - }).Return(&elbv2.DeleteLoadBalancerOutput{}, nil) + }).Return(&v2elbv2.DeleteLoadBalancerOutput{}, nil) }, ec2Mocks: func(m *mocks.MockEC2APIMockRecorder) {}, expectErr: false, @@ -355,19 +356,19 @@ func TestReconcileDelete(t *testing.T) { name: "eks with ALB Service load balancer", clusterScope: createManageScope(t, "", ""), rgAPIMocks: func(m *mocks.MockResourceGroupsTaggingAPIAPIMockRecorder) { - m.GetResourcesWithContext(gomock.Any(), &rgapi.GetResourcesInput{ - TagFilters: []*rgapi.TagFilter{ + m.GetResources(gomock.Any(), &rgapiv2.GetResourcesInput{ + TagFilters: []rgapit.TagFilter{ { Key: aws.String("kubernetes.io/cluster/eks-test-cluster"), - Values: []*string{aws.String("owned")}, + Values: []string{"owned"}, }, }, - }).DoAndReturn(func(awsCtx context.Context, input *rgapi.GetResourcesInput, opts ...request.Option) (*rgapi.GetResourcesOutput, error) { - return &rgapi.GetResourcesOutput{ - ResourceTagMappingList: []*rgapi.ResourceTagMapping{ + }).DoAndReturn(func(awsCtx context.Context, input *rgapiv2.GetResourcesInput, opts ...request.Option) (*rgapiv2.GetResourcesOutput, error) { + return &rgapiv2.GetResourcesOutput{ + ResourceTagMappingList: []rgapit.ResourceTagMapping{ { ResourceARN: aws.String("arn:aws:elasticloadbalancing:eu-west-2:1234567890:loadbalancer/app/aec24434cd2ce4630bd14a955413ee37"), - Tags: []*rgapi.Tag{ + Tags: []rgapit.Tag{ { Key: aws.String("kubernetes.io/cluster/eks-test-cluster"), Value: aws.String("owned"), @@ -384,9 +385,9 @@ func TestReconcileDelete(t *testing.T) { }, elbMocks: func(m *mocks.MockELBAPIMockRecorder) {}, elbv2Mocks: func(m *mocks.MockELBV2APIMockRecorder) { - m.DeleteLoadBalancerWithContext(gomock.Any(), &elbv2.DeleteLoadBalancerInput{ + m.DeleteLoadBalancer(gomock.Any(), &v2elbv2.DeleteLoadBalancerInput{ LoadBalancerArn: aws.String("arn:aws:elasticloadbalancing:eu-west-2:1234567890:loadbalancer/app/aec24434cd2ce4630bd14a955413ee37"), - }).Return(&elbv2.DeleteLoadBalancerOutput{}, nil) + }).Return(&v2elbv2.DeleteLoadBalancerOutput{}, nil) }, ec2Mocks: func(m *mocks.MockEC2APIMockRecorder) {}, expectErr: false, @@ -395,19 +396,19 @@ func TestReconcileDelete(t *testing.T) { name: "ec2 cluster with ALB Service load balancer", clusterScope: createUnManageScope(t, "", ""), rgAPIMocks: func(m *mocks.MockResourceGroupsTaggingAPIAPIMockRecorder) { - m.GetResourcesWithContext(gomock.Any(), &rgapi.GetResourcesInput{ - TagFilters: []*rgapi.TagFilter{ + m.GetResources(gomock.Any(), &rgapiv2.GetResourcesInput{ + TagFilters: []rgapit.TagFilter{ { Key: aws.String("kubernetes.io/cluster/cluster1"), - Values: []*string{aws.String("owned")}, + Values: []string{"owned"}, }, }, - }).DoAndReturn(func(awsCtx context.Context, input *rgapi.GetResourcesInput, opts ...request.Option) (*rgapi.GetResourcesOutput, error) { - return &rgapi.GetResourcesOutput{ - ResourceTagMappingList: []*rgapi.ResourceTagMapping{ + }).DoAndReturn(func(awsCtx context.Context, input *rgapiv2.GetResourcesInput, opts ...request.Option) (*rgapiv2.GetResourcesOutput, error) { + return &rgapiv2.GetResourcesOutput{ + ResourceTagMappingList: []rgapit.ResourceTagMapping{ { ResourceARN: aws.String("arn:aws:elasticloadbalancing:eu-west-2:1234567890:loadbalancer/app/aec24434cd2ce4630bd14a955413ee37"), - Tags: []*rgapi.Tag{ + Tags: []rgapit.Tag{ { Key: aws.String("kubernetes.io/cluster/cluster1"), Value: aws.String("owned"), @@ -424,9 +425,9 @@ func TestReconcileDelete(t *testing.T) { }, elbMocks: func(m *mocks.MockELBAPIMockRecorder) {}, elbv2Mocks: func(m *mocks.MockELBV2APIMockRecorder) { - m.DeleteLoadBalancerWithContext(gomock.Any(), &elbv2.DeleteLoadBalancerInput{ + m.DeleteLoadBalancer(gomock.Any(), &v2elbv2.DeleteLoadBalancerInput{ LoadBalancerArn: aws.String("arn:aws:elasticloadbalancing:eu-west-2:1234567890:loadbalancer/app/aec24434cd2ce4630bd14a955413ee37"), - }).Return(&elbv2.DeleteLoadBalancerOutput{}, nil) + }).Return(&v2elbv2.DeleteLoadBalancerOutput{}, nil) }, ec2Mocks: func(m *mocks.MockEC2APIMockRecorder) {}, expectErr: false, @@ -435,19 +436,19 @@ func TestReconcileDelete(t *testing.T) { name: "eks cluster with different resource types", clusterScope: createManageScope(t, "", ""), rgAPIMocks: func(m *mocks.MockResourceGroupsTaggingAPIAPIMockRecorder) { - m.GetResourcesWithContext(gomock.Any(), &rgapi.GetResourcesInput{ - TagFilters: []*rgapi.TagFilter{ + m.GetResources(gomock.Any(), &rgapiv2.GetResourcesInput{ + TagFilters: []rgapit.TagFilter{ { Key: aws.String("kubernetes.io/cluster/eks-test-cluster"), - Values: []*string{aws.String("owned")}, + Values: []string{"owned"}, }, }, - }).DoAndReturn(func(awsCtx context.Context, input *rgapi.GetResourcesInput, opts ...request.Option) (*rgapi.GetResourcesOutput, error) { - return &rgapi.GetResourcesOutput{ - ResourceTagMappingList: []*rgapi.ResourceTagMapping{ + }).DoAndReturn(func(awsCtx context.Context, input *rgapiv2.GetResourcesInput, opts ...request.Option) (*rgapiv2.GetResourcesOutput, error) { + return &rgapiv2.GetResourcesOutput{ + ResourceTagMappingList: []rgapit.ResourceTagMapping{ { ResourceARN: aws.String("arn:aws:elasticloadbalancing:eu-west-2:1234567890:targetgroup/k8s-default-podinfo-2c868b281a/e979fe9bd6825433"), - Tags: []*rgapi.Tag{ + Tags: []rgapit.Tag{ { Key: aws.String("kubernetes.io/cluster/cluster1"), Value: aws.String("owned"), @@ -460,7 +461,7 @@ func TestReconcileDelete(t *testing.T) { }, { ResourceARN: aws.String("arn:aws:elasticloadbalancing:eu-west-2:1234567890:loadbalancer/aec24434cd2ce4630bd14a955413ee37"), - Tags: []*rgapi.Tag{ + Tags: []rgapit.Tag{ { Key: aws.String("kubernetes.io/cluster/cluster1"), Value: aws.String("owned"), @@ -473,7 +474,7 @@ func TestReconcileDelete(t *testing.T) { }, { ResourceARN: aws.String("arn:aws:ec2:eu-west-2:1234567890:security-group/sg-123456"), - Tags: []*rgapi.Tag{ + Tags: []rgapit.Tag{ { Key: aws.String("kubernetes.io/cluster/cluster1"), Value: aws.String("owned"), @@ -489,19 +490,19 @@ func TestReconcileDelete(t *testing.T) { }) }, elbMocks: func(m *mocks.MockELBAPIMockRecorder) { - m.DeleteLoadBalancerWithContext(gomock.Any(), &elb.DeleteLoadBalancerInput{ + m.DeleteLoadBalancer(gomock.Any(), &v2elb.DeleteLoadBalancerInput{ LoadBalancerName: aws.String("aec24434cd2ce4630bd14a955413ee37"), - }).Return(&elb.DeleteLoadBalancerOutput{}, nil) + }).Return(&v2elb.DeleteLoadBalancerOutput{}, nil) }, elbv2Mocks: func(m *mocks.MockELBV2APIMockRecorder) { - m.DeleteTargetGroupWithContext(gomock.Any(), &elbv2.DeleteTargetGroupInput{ + m.DeleteTargetGroup(gomock.Any(), &v2elbv2.DeleteTargetGroupInput{ TargetGroupArn: aws.String("arn:aws:elasticloadbalancing:eu-west-2:1234567890:targetgroup/k8s-default-podinfo-2c868b281a/e979fe9bd6825433"), - }) + }).Return(&v2elbv2.DeleteTargetGroupOutput{}, nil) }, ec2Mocks: func(m *mocks.MockEC2APIMockRecorder) { - m.DeleteSecurityGroupWithContext(gomock.Any(), &ec2.DeleteSecurityGroupInput{ + m.DeleteSecurityGroup(gomock.Any(), &v2ec2.DeleteSecurityGroupInput{ GroupId: aws.String("sg-123456"), - }) + }).Return(&v2ec2.DeleteSecurityGroupOutput{}, nil) }, expectErr: false, }, @@ -509,19 +510,19 @@ func TestReconcileDelete(t *testing.T) { name: "eks should ignore unhandled resources", clusterScope: createManageScope(t, "", ""), rgAPIMocks: func(m *mocks.MockResourceGroupsTaggingAPIAPIMockRecorder) { - m.GetResourcesWithContext(gomock.Any(), &rgapi.GetResourcesInput{ - TagFilters: []*rgapi.TagFilter{ + m.GetResources(gomock.Any(), &rgapiv2.GetResourcesInput{ + TagFilters: []rgapit.TagFilter{ { Key: aws.String("kubernetes.io/cluster/eks-test-cluster"), - Values: []*string{aws.String("owned")}, + Values: []string{"owned"}, }, }, - }).DoAndReturn(func(awsCtx context.Context, input *rgapi.GetResourcesInput, opts ...request.Option) (*rgapi.GetResourcesOutput, error) { - return &rgapi.GetResourcesOutput{ - ResourceTagMappingList: []*rgapi.ResourceTagMapping{ + }).DoAndReturn(func(awsCtx context.Context, input *rgapiv2.GetResourcesInput, opts ...request.Option) (*rgapiv2.GetResourcesOutput, error) { + return &rgapiv2.GetResourcesOutput{ + ResourceTagMappingList: []rgapit.ResourceTagMapping{ { ResourceARN: aws.String("arn:aws:ec2:eu-west-2:217426147237:s3/somebucket"), - Tags: []*rgapi.Tag{ + Tags: []rgapit.Tag{ { Key: aws.String("kubernetes.io/cluster/eks-test-cluster"), Value: aws.String("owned"), @@ -549,19 +550,19 @@ func TestReconcileDelete(t *testing.T) { name: "eks with security group created by EKS", clusterScope: createManageScope(t, "", ""), rgAPIMocks: func(m *mocks.MockResourceGroupsTaggingAPIAPIMockRecorder) { - m.GetResourcesWithContext(gomock.Any(), &rgapi.GetResourcesInput{ - TagFilters: []*rgapi.TagFilter{ + m.GetResources(gomock.Any(), &rgapiv2.GetResourcesInput{ + TagFilters: []rgapit.TagFilter{ { Key: aws.String("kubernetes.io/cluster/eks-test-cluster"), - Values: []*string{aws.String("owned")}, + Values: []string{"owned"}, }, }, - }).DoAndReturn(func(awsCtx context.Context, input *rgapi.GetResourcesInput, opts ...request.Option) (*rgapi.GetResourcesOutput, error) { - return &rgapi.GetResourcesOutput{ - ResourceTagMappingList: []*rgapi.ResourceTagMapping{ + }).DoAndReturn(func(awsCtx context.Context, input *rgapiv2.GetResourcesInput, opts ...request.Option) (*rgapiv2.GetResourcesOutput, error) { + return &rgapiv2.GetResourcesOutput{ + ResourceTagMappingList: []rgapit.ResourceTagMapping{ { ResourceARN: aws.String("arn:aws:ec2:eu-west-2:1234567890:security-group/sg-123456"), - Tags: []*rgapi.Tag{ + Tags: []rgapit.Tag{ { Key: aws.String("kubernetes.io/cluster/cluster1"), Value: aws.String("owned"), @@ -589,19 +590,19 @@ func TestReconcileDelete(t *testing.T) { name: "eks cluster with all clean-up funcs explicitly enabled", clusterScope: createManageScope(t, "", "load-balancer,target-group,security-group"), rgAPIMocks: func(m *mocks.MockResourceGroupsTaggingAPIAPIMockRecorder) { - m.GetResourcesWithContext(gomock.Any(), &rgapi.GetResourcesInput{ - TagFilters: []*rgapi.TagFilter{ + m.GetResources(gomock.Any(), &rgapiv2.GetResourcesInput{ + TagFilters: []rgapit.TagFilter{ { Key: aws.String("kubernetes.io/cluster/eks-test-cluster"), - Values: []*string{aws.String("owned")}, + Values: []string{"owned"}, }, }, - }).DoAndReturn(func(awsCtx context.Context, input *rgapi.GetResourcesInput, opts ...request.Option) (*rgapi.GetResourcesOutput, error) { - return &rgapi.GetResourcesOutput{ - ResourceTagMappingList: []*rgapi.ResourceTagMapping{ + }).DoAndReturn(func(awsCtx context.Context, input *rgapiv2.GetResourcesInput, opts ...request.Option) (*rgapiv2.GetResourcesOutput, error) { + return &rgapiv2.GetResourcesOutput{ + ResourceTagMappingList: []rgapit.ResourceTagMapping{ { ResourceARN: aws.String("arn:aws:elasticloadbalancing:eu-west-2:1234567890:targetgroup/k8s-default-podinfo-2c868b281a/e979fe9bd6825433"), - Tags: []*rgapi.Tag{ + Tags: []rgapit.Tag{ { Key: aws.String("kubernetes.io/cluster/cluster1"), Value: aws.String("owned"), @@ -614,7 +615,7 @@ func TestReconcileDelete(t *testing.T) { }, { ResourceARN: aws.String("arn:aws:elasticloadbalancing:eu-west-2:1234567890:loadbalancer/aec24434cd2ce4630bd14a955413ee37"), - Tags: []*rgapi.Tag{ + Tags: []rgapit.Tag{ { Key: aws.String("kubernetes.io/cluster/cluster1"), Value: aws.String("owned"), @@ -627,7 +628,7 @@ func TestReconcileDelete(t *testing.T) { }, { ResourceARN: aws.String("arn:aws:ec2:eu-west-2:1234567890:security-group/sg-123456"), - Tags: []*rgapi.Tag{ + Tags: []rgapit.Tag{ { Key: aws.String("kubernetes.io/cluster/cluster1"), Value: aws.String("owned"), @@ -643,19 +644,19 @@ func TestReconcileDelete(t *testing.T) { }) }, elbMocks: func(m *mocks.MockELBAPIMockRecorder) { - m.DeleteLoadBalancerWithContext(gomock.Any(), &elb.DeleteLoadBalancerInput{ + m.DeleteLoadBalancer(gomock.Any(), &v2elb.DeleteLoadBalancerInput{ LoadBalancerName: aws.String("aec24434cd2ce4630bd14a955413ee37"), - }).Return(&elb.DeleteLoadBalancerOutput{}, nil) + }).Return(&v2elb.DeleteLoadBalancerOutput{}, nil) }, elbv2Mocks: func(m *mocks.MockELBV2APIMockRecorder) { - m.DeleteTargetGroupWithContext(gomock.Any(), &elbv2.DeleteTargetGroupInput{ + m.DeleteTargetGroup(gomock.Any(), &v2elbv2.DeleteTargetGroupInput{ TargetGroupArn: aws.String("arn:aws:elasticloadbalancing:eu-west-2:1234567890:targetgroup/k8s-default-podinfo-2c868b281a/e979fe9bd6825433"), - }) + }).Return(&v2elbv2.DeleteTargetGroupOutput{}, nil) }, ec2Mocks: func(m *mocks.MockEC2APIMockRecorder) { - m.DeleteSecurityGroupWithContext(gomock.Any(), &ec2.DeleteSecurityGroupInput{ + m.DeleteSecurityGroup(gomock.Any(), &v2ec2.DeleteSecurityGroupInput{ GroupId: aws.String("sg-123456"), - }) + }).Return(&v2ec2.DeleteSecurityGroupOutput{}, nil) }, expectErr: false, }, @@ -663,19 +664,19 @@ func TestReconcileDelete(t *testing.T) { name: "eks cluster with skipped security groups clean-up func", clusterScope: createManageScope(t, "", "load-balancer,target-group"), rgAPIMocks: func(m *mocks.MockResourceGroupsTaggingAPIAPIMockRecorder) { - m.GetResourcesWithContext(gomock.Any(), &rgapi.GetResourcesInput{ - TagFilters: []*rgapi.TagFilter{ + m.GetResources(gomock.Any(), &rgapiv2.GetResourcesInput{ + TagFilters: []rgapit.TagFilter{ { Key: aws.String("kubernetes.io/cluster/eks-test-cluster"), - Values: []*string{aws.String("owned")}, + Values: []string{"owned"}, }, }, - }).DoAndReturn(func(awsCtx context.Context, input *rgapi.GetResourcesInput, opts ...request.Option) (*rgapi.GetResourcesOutput, error) { - return &rgapi.GetResourcesOutput{ - ResourceTagMappingList: []*rgapi.ResourceTagMapping{ + }).DoAndReturn(func(awsCtx context.Context, input *rgapiv2.GetResourcesInput, opts ...request.Option) (*rgapiv2.GetResourcesOutput, error) { + return &rgapiv2.GetResourcesOutput{ + ResourceTagMappingList: []rgapit.ResourceTagMapping{ { ResourceARN: aws.String("arn:aws:elasticloadbalancing:eu-west-2:1234567890:targetgroup/k8s-default-podinfo-2c868b281a/e979fe9bd6825433"), - Tags: []*rgapi.Tag{ + Tags: []rgapit.Tag{ { Key: aws.String("kubernetes.io/cluster/cluster1"), Value: aws.String("owned"), @@ -688,7 +689,7 @@ func TestReconcileDelete(t *testing.T) { }, { ResourceARN: aws.String("arn:aws:elasticloadbalancing:eu-west-2:1234567890:loadbalancer/aec24434cd2ce4630bd14a955413ee37"), - Tags: []*rgapi.Tag{ + Tags: []rgapit.Tag{ { Key: aws.String("kubernetes.io/cluster/cluster1"), Value: aws.String("owned"), @@ -701,7 +702,7 @@ func TestReconcileDelete(t *testing.T) { }, { ResourceARN: aws.String("arn:aws:ec2:eu-west-2:1234567890:security-group/sg-123456"), - Tags: []*rgapi.Tag{ + Tags: []rgapit.Tag{ { Key: aws.String("kubernetes.io/cluster/cluster1"), Value: aws.String("owned"), @@ -717,14 +718,14 @@ func TestReconcileDelete(t *testing.T) { }) }, elbMocks: func(m *mocks.MockELBAPIMockRecorder) { - m.DeleteLoadBalancerWithContext(gomock.Any(), &elb.DeleteLoadBalancerInput{ + m.DeleteLoadBalancer(gomock.Any(), &v2elb.DeleteLoadBalancerInput{ LoadBalancerName: aws.String("aec24434cd2ce4630bd14a955413ee37"), - }).Return(&elb.DeleteLoadBalancerOutput{}, nil) + }).Return(&v2elb.DeleteLoadBalancerOutput{}, nil) }, elbv2Mocks: func(m *mocks.MockELBV2APIMockRecorder) { - m.DeleteTargetGroupWithContext(gomock.Any(), &elbv2.DeleteTargetGroupInput{ + m.DeleteTargetGroup(gomock.Any(), &v2elbv2.DeleteTargetGroupInput{ TargetGroupArn: aws.String("arn:aws:elasticloadbalancing:eu-west-2:1234567890:targetgroup/k8s-default-podinfo-2c868b281a/e979fe9bd6825433"), - }) + }).Return(&v2elbv2.DeleteTargetGroupOutput{}, nil) }, ec2Mocks: func(m *mocks.MockEC2APIMockRecorder) {}, expectErr: false, @@ -733,19 +734,19 @@ func TestReconcileDelete(t *testing.T) { name: "eks cluster with skipped security and target groups clean-up funcs", clusterScope: createManageScope(t, "", "load-balancer"), rgAPIMocks: func(m *mocks.MockResourceGroupsTaggingAPIAPIMockRecorder) { - m.GetResourcesWithContext(gomock.Any(), &rgapi.GetResourcesInput{ - TagFilters: []*rgapi.TagFilter{ + m.GetResources(gomock.Any(), &rgapiv2.GetResourcesInput{ + TagFilters: []rgapit.TagFilter{ { Key: aws.String("kubernetes.io/cluster/eks-test-cluster"), - Values: []*string{aws.String("owned")}, + Values: []string{"owned"}, }, }, - }).DoAndReturn(func(awsCtx context.Context, input *rgapi.GetResourcesInput, opts ...request.Option) (*rgapi.GetResourcesOutput, error) { - return &rgapi.GetResourcesOutput{ - ResourceTagMappingList: []*rgapi.ResourceTagMapping{ + }).DoAndReturn(func(awsCtx context.Context, input *rgapiv2.GetResourcesInput, opts ...request.Option) (*rgapiv2.GetResourcesOutput, error) { + return &rgapiv2.GetResourcesOutput{ + ResourceTagMappingList: []rgapit.ResourceTagMapping{ { ResourceARN: aws.String("arn:aws:elasticloadbalancing:eu-west-2:1234567890:targetgroup/k8s-default-podinfo-2c868b281a/e979fe9bd6825433"), - Tags: []*rgapi.Tag{ + Tags: []rgapit.Tag{ { Key: aws.String("kubernetes.io/cluster/cluster1"), Value: aws.String("owned"), @@ -758,7 +759,7 @@ func TestReconcileDelete(t *testing.T) { }, { ResourceARN: aws.String("arn:aws:elasticloadbalancing:eu-west-2:1234567890:loadbalancer/aec24434cd2ce4630bd14a955413ee37"), - Tags: []*rgapi.Tag{ + Tags: []rgapit.Tag{ { Key: aws.String("kubernetes.io/cluster/cluster1"), Value: aws.String("owned"), @@ -771,7 +772,7 @@ func TestReconcileDelete(t *testing.T) { }, { ResourceARN: aws.String("arn:aws:ec2:eu-west-2:1234567890:security-group/sg-123456"), - Tags: []*rgapi.Tag{ + Tags: []rgapit.Tag{ { Key: aws.String("kubernetes.io/cluster/cluster1"), Value: aws.String("owned"), @@ -787,9 +788,9 @@ func TestReconcileDelete(t *testing.T) { }) }, elbMocks: func(m *mocks.MockELBAPIMockRecorder) { - m.DeleteLoadBalancerWithContext(gomock.Any(), &elb.DeleteLoadBalancerInput{ + m.DeleteLoadBalancer(gomock.Any(), &v2elb.DeleteLoadBalancerInput{ LoadBalancerName: aws.String("aec24434cd2ce4630bd14a955413ee37"), - }).Return(&elb.DeleteLoadBalancerOutput{}, nil) + }).Return(&v2elb.DeleteLoadBalancerOutput{}, nil) }, elbv2Mocks: func(m *mocks.MockELBV2APIMockRecorder) {}, ec2Mocks: func(m *mocks.MockEC2APIMockRecorder) {}, diff --git a/pkg/cloud/services/gc/compose.go b/pkg/cloud/services/gc/compose.go index 08e0b59699..f910bef41e 100644 --- a/pkg/cloud/services/gc/compose.go +++ b/pkg/cloud/services/gc/compose.go @@ -19,7 +19,7 @@ package gc import ( "fmt" - "github.com/aws/aws-sdk-go/aws/arn" + "github.com/aws/aws-sdk-go-v2/aws/arn" infrav1 "sigs.k8s.io/cluster-api-provider-aws/v2/api/v1beta2" ) diff --git a/pkg/cloud/services/gc/ec2.go b/pkg/cloud/services/gc/ec2.go index 823163dddc..3b64cb5e36 100644 --- a/pkg/cloud/services/gc/ec2.go +++ b/pkg/cloud/services/gc/ec2.go @@ -21,11 +21,12 @@ import ( "fmt" "strings" - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/service/ec2" + "github.com/aws/aws-sdk-go-v2/aws" + v2ec2 "github.com/aws/aws-sdk-go-v2/service/ec2" + v2ec2types "github.com/aws/aws-sdk-go-v2/service/ec2/types" - "sigs.k8s.io/cluster-api-provider-aws/v2/pkg/cloud/converters" - "sigs.k8s.io/cluster-api-provider-aws/v2/pkg/cloud/filter" + converters "sigs.k8s.io/cluster-api-provider-aws/v2/pkg/cloud/convertersv2" + filter "sigs.k8s.io/cluster-api-provider-aws/v2/pkg/cloud/filterv2" ) func (s *Service) deleteSecurityGroups(ctx context.Context, resources []*AWSResource) error { @@ -46,7 +47,7 @@ func (s *Service) deleteSecurityGroups(ctx context.Context, resources []*AWSReso } func (s *Service) isSecurityGroupToDelete(resource *AWSResource) bool { - if !s.isMatchingResource(resource, ec2.ServiceName, "security-group") { + if !s.isMatchingResource(resource, strings.ToLower(v2ec2.ServiceID), "security-group") { return false } if eksClusterName := resource.Tags[eksClusterNameTag]; eksClusterName != "" { @@ -59,12 +60,12 @@ func (s *Service) isSecurityGroupToDelete(resource *AWSResource) bool { } func (s *Service) deleteSecurityGroup(ctx context.Context, securityGroupID string) error { - input := ec2.DeleteSecurityGroupInput{ + input := v2ec2.DeleteSecurityGroupInput{ GroupId: aws.String(securityGroupID), } s.scope.Debug("Deleting security group", "group_id", securityGroupID) - if _, err := s.ec2Client.DeleteSecurityGroupWithContext(ctx, &input); err != nil { + if _, err := s.ec2Client.DeleteSecurityGroup(ctx, &input); err != nil { return fmt.Errorf("deleting security group: %w", err) } @@ -72,16 +73,22 @@ func (s *Service) deleteSecurityGroup(ctx context.Context, securityGroupID strin } // getProviderOwnedSecurityGroups gets cloud provider created security groups of ELBs for this cluster, filtering by tag: kubernetes.io/cluster/:owned and VPC Id. -func (s *Service) getProviderOwnedSecurityGroups(_ context.Context) ([]*AWSResource, error) { - input := &ec2.DescribeSecurityGroupsInput{ - Filters: []*ec2.Filter{ - filter.EC2.ProviderOwned(s.scope.KubernetesClusterName()), +func (s *Service) getProviderOwnedSecurityGroups(ctx context.Context) ([]*AWSResource, error) { + input := &v2ec2.DescribeSecurityGroupsInput{ + Filters: []v2ec2types.Filter{ + *filter.EC2.ProviderOwned(s.scope.KubernetesClusterName()), }, } var resources []*AWSResource - err := s.ec2Client.DescribeSecurityGroupsPagesWithContext(context.TODO(), input, func(out *ec2.DescribeSecurityGroupsOutput, last bool) bool { - for _, group := range out.SecurityGroups { + paginator := v2ec2.NewDescribeSecurityGroupsPaginator(s.ec2Client, input) + + for paginator.HasMorePages() { + page, err := paginator.NextPage(ctx) + if err != nil { + return nil, fmt.Errorf("failed to get next page of security groups: %w", err) + } + for _, group := range page.SecurityGroups { arn := composeFakeArn(sgService, sgResourcePrefix+*group.GroupId) resource, err := composeAWSResource(arn, converters.TagsToMap(group.Tags)) if err != nil { @@ -90,10 +97,6 @@ func (s *Service) getProviderOwnedSecurityGroups(_ context.Context) ([]*AWSResou } resources = append(resources, resource) } - return true - }) - if err != nil { - return nil, fmt.Errorf("describe security groups error: %w", err) } return resources, nil diff --git a/pkg/cloud/services/gc/loadbalancer.go b/pkg/cloud/services/gc/loadbalancer.go index d649aaa2a6..a446585885 100644 --- a/pkg/cloud/services/gc/loadbalancer.go +++ b/pkg/cloud/services/gc/loadbalancer.go @@ -21,12 +21,12 @@ import ( "fmt" "strings" - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/service/elb" - "github.com/aws/aws-sdk-go/service/elbv2" + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/service/elasticloadbalancing" + elbv2 "github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2" infrav1 "sigs.k8s.io/cluster-api-provider-aws/v2/api/v1beta2" - "sigs.k8s.io/cluster-api-provider-aws/v2/pkg/cloud/converters" + "sigs.k8s.io/cluster-api-provider-aws/v2/pkg/cloud/convertersv2" ) func (s *Service) deleteLoadBalancers(ctx context.Context, resources []*AWSResource) error { @@ -80,7 +80,7 @@ func (s *Service) deleteTargetGroups(ctx context.Context, resources []*AWSResour } func (s *Service) isELBResourceToDelete(resource *AWSResource, resourceName string) bool { - if !s.isMatchingResource(resource, elb.ServiceName, resourceName) { + if !s.isMatchingResource(resource, "elasticloadbalancing", resourceName) { return false } @@ -98,7 +98,7 @@ func (s *Service) deleteLoadBalancerV2(ctx context.Context, lbARN string) error } s.scope.Debug("Deleting v2 load balancer", "arn", lbARN) - if _, err := s.elbv2Client.DeleteLoadBalancerWithContext(ctx, &input); err != nil { + if _, err := s.elbv2Client.DeleteLoadBalancer(ctx, &input); err != nil { return fmt.Errorf("deleting v2 load balancer: %w", err) } @@ -106,12 +106,12 @@ func (s *Service) deleteLoadBalancerV2(ctx context.Context, lbARN string) error } func (s *Service) deleteLoadBalancer(ctx context.Context, name string) error { - input := elb.DeleteLoadBalancerInput{ + input := elasticloadbalancing.DeleteLoadBalancerInput{ LoadBalancerName: aws.String(name), } s.scope.Debug("Deleting classic load balancer", "name", name) - if _, err := s.elbClient.DeleteLoadBalancerWithContext(ctx, &input); err != nil { + if _, err := s.elbClient.DeleteLoadBalancer(ctx, &input); err != nil { return fmt.Errorf("deleting classic load balancer: %w", err) } @@ -124,7 +124,7 @@ func (s *Service) deleteTargetGroup(ctx context.Context, targetGroupARN string) } s.scope.Debug("Deleting target group", "arn", targetGroupARN) - if _, err := s.elbv2Client.DeleteTargetGroupWithContext(ctx, &input); err != nil { + if _, err := s.elbv2Client.DeleteTargetGroup(ctx, &input); err != nil { return fmt.Errorf("deleting target group: %w", err) } @@ -134,14 +134,16 @@ func (s *Service) deleteTargetGroup(ctx context.Context, targetGroupARN string) // describeLoadBalancers gets all elastic LBs. func (s *Service) describeLoadBalancers(ctx context.Context) ([]string, error) { var names []string - err := s.elbClient.DescribeLoadBalancersPagesWithContext(ctx, &elb.DescribeLoadBalancersInput{}, func(r *elb.DescribeLoadBalancersOutput, last bool) bool { - for _, lb := range r.LoadBalancerDescriptions { + + paginator := elasticloadbalancing.NewDescribeLoadBalancersPaginator(s.elbClient, &elasticloadbalancing.DescribeLoadBalancersInput{}) + for paginator.HasMorePages() { + output, err := paginator.NextPage(ctx) + if err != nil { + return nil, fmt.Errorf("describe load balancer error: %w", err) + } + for _, lb := range output.LoadBalancerDescriptions { names = append(names, *lb.LoadBalancerName) } - return true - }) - if err != nil { - return nil, fmt.Errorf("describe load balancer error: %w", err) } return names, nil @@ -150,21 +152,23 @@ func (s *Service) describeLoadBalancers(ctx context.Context) ([]string, error) { // describeLoadBalancersV2 gets all network and application LBs. func (s *Service) describeLoadBalancersV2(ctx context.Context) ([]string, error) { var arns []string - err := s.elbv2Client.DescribeLoadBalancersPagesWithContext(ctx, &elbv2.DescribeLoadBalancersInput{}, func(r *elbv2.DescribeLoadBalancersOutput, last bool) bool { - for _, lb := range r.LoadBalancers { + paginator := elbv2.NewDescribeLoadBalancersPaginator(s.elbv2Client, &elbv2.DescribeLoadBalancersInput{}) + + for paginator.HasMorePages() { + output, err := paginator.NextPage(ctx) + if err != nil { + return nil, fmt.Errorf("describe load balancer v2 error: %w", err) + } + for _, lb := range output.LoadBalancers { arns = append(arns, *lb.LoadBalancerArn) } - return true - }) - if err != nil { - return nil, fmt.Errorf("describe load balancer v2 error: %w", err) } return arns, nil } func (s *Service) describeTargetgroups(ctx context.Context) ([]string, error) { - groups, err := s.elbv2Client.DescribeTargetGroupsWithContext(ctx, &elbv2.DescribeTargetGroupsInput{}) + groups, err := s.elbv2Client.DescribeTargetGroups(ctx, &elbv2.DescribeTargetGroupsInput{}) if err != nil { return nil, fmt.Errorf("describe target groups error: %w", err) } @@ -214,7 +218,7 @@ func (s *Service) filterProviderOwnedLB(ctx context.Context, names []string) ([] var resources []*AWSResource lbChunks := chunkResources(names) for _, chunk := range lbChunks { - output, err := s.elbClient.DescribeTagsWithContext(ctx, &elb.DescribeTagsInput{LoadBalancerNames: aws.StringSlice(chunk)}) + output, err := s.elbClient.DescribeTags(ctx, &elasticloadbalancing.DescribeTagsInput{LoadBalancerNames: chunk}) if err != nil { return nil, fmt.Errorf("describe tags of loadbalancers: %w", err) } @@ -224,7 +228,7 @@ func (s *Service) filterProviderOwnedLB(ctx context.Context, names []string) ([] serviceTag := infrav1.ClusterAWSCloudProviderTagKey(s.scope.KubernetesClusterName()) if *tag.Key == serviceTag && *tag.Value == string(infrav1.ResourceLifecycleOwned) { arn := composeFakeArn(elbService, elbResourcePrefix+*tagDesc.LoadBalancerName) - resource, err := composeAWSResource(arn, converters.ELBTagsToMap(tagDesc.Tags)) + resource, err := composeAWSResource(arn, convertersv2.ELBTagsToMap(tagDesc.Tags)) if err != nil { return nil, fmt.Errorf("error compose aws elb resource %s: %w", arn, err) } @@ -243,7 +247,7 @@ func (s *Service) filterProviderOwnedLBV2(ctx context.Context, arns []string) ([ var resources []*AWSResource lbChunks := chunkResources(arns) for _, chunk := range lbChunks { - output, err := s.elbv2Client.DescribeTagsWithContext(ctx, &elbv2.DescribeTagsInput{ResourceArns: aws.StringSlice(chunk)}) + output, err := s.elbv2Client.DescribeTags(ctx, &elbv2.DescribeTagsInput{ResourceArns: chunk}) if err != nil { return nil, fmt.Errorf("describe tags of v2 loadbalancers: %w", err) } @@ -252,7 +256,7 @@ func (s *Service) filterProviderOwnedLBV2(ctx context.Context, arns []string) ([ for _, tag := range tagDesc.Tags { serviceTag := infrav1.ClusterAWSCloudProviderTagKey(s.scope.KubernetesClusterName()) if *tag.Key == serviceTag && *tag.Value == string(infrav1.ResourceLifecycleOwned) { - resource, err := composeAWSResource(*tagDesc.ResourceArn, converters.V2TagsToMap(tagDesc.Tags)) + resource, err := composeAWSResource(*tagDesc.ResourceArn, convertersv2.V2TagsToMap(tagDesc.Tags)) if err != nil { return nil, fmt.Errorf("error compose aws elbv2 resource %s: %w", *tagDesc.ResourceArn, err) } diff --git a/pkg/cloud/services/gc/options.go b/pkg/cloud/services/gc/options.go index 445977bcd3..07c746eed9 100644 --- a/pkg/cloud/services/gc/options.go +++ b/pkg/cloud/services/gc/options.go @@ -17,38 +17,35 @@ limitations under the License. package gc import ( - "github.com/aws/aws-sdk-go/service/ec2/ec2iface" - "github.com/aws/aws-sdk-go/service/elb/elbiface" - "github.com/aws/aws-sdk-go/service/elbv2/elbv2iface" - "github.com/aws/aws-sdk-go/service/resourcegroupstaggingapi/resourcegroupstaggingapiiface" + "sigs.k8s.io/cluster-api-provider-aws/v2/pkg/cloud/scope" ) // ServiceOption is an option for creating the service. type ServiceOption func(*Service) // withELBClient is an option for specifying a AWS ELB Client. -func withELBClient(client elbiface.ELBAPI) ServiceOption { +func withELBClient(client scope.ELBAPI) ServiceOption { return func(s *Service) { s.elbClient = client } } // withELBv2Client is an option for specifying a AWS ELBv2 Client. -func withELBv2Client(client elbv2iface.ELBV2API) ServiceOption { +func withELBv2Client(client scope.ELBV2API) ServiceOption { return func(s *Service) { s.elbv2Client = client } } // withResourceTaggingClient is an option for specifying a AWS Resource Tagging Client. -func withResourceTaggingClient(client resourcegroupstaggingapiiface.ResourceGroupsTaggingAPIAPI) ServiceOption { +func withResourceTaggingClient(client scope.ResourceGroupsTaggingAPIAPI) ServiceOption { return func(s *Service) { s.resourceTaggingClient = client } } // withEC2Client is an option for specifying a AWS EC2 Client. -func withEC2Client(client ec2iface.EC2API) ServiceOption { +func withEC2Client(client scope.EC2API) ServiceOption { return func(s *Service) { s.ec2Client = client } diff --git a/pkg/cloud/services/gc/service.go b/pkg/cloud/services/gc/service.go index 27b48d653e..2bf7422fd3 100644 --- a/pkg/cloud/services/gc/service.go +++ b/pkg/cloud/services/gc/service.go @@ -20,11 +20,7 @@ package gc import ( "context" - "github.com/aws/aws-sdk-go/aws/arn" - "github.com/aws/aws-sdk-go/service/ec2/ec2iface" - "github.com/aws/aws-sdk-go/service/elb/elbiface" - "github.com/aws/aws-sdk-go/service/elbv2/elbv2iface" - "github.com/aws/aws-sdk-go/service/resourcegroupstaggingapi/resourcegroupstaggingapiiface" + "github.com/aws/aws-sdk-go-v2/aws/arn" "sigs.k8s.io/cluster-api-provider-aws/v2/pkg/cloud" "sigs.k8s.io/cluster-api-provider-aws/v2/pkg/cloud/scope" @@ -33,10 +29,10 @@ import ( // Service is used to perform operations against a tenant/workload/child cluster. type Service struct { scope cloud.ClusterScoper - elbClient elbiface.ELBAPI - elbv2Client elbv2iface.ELBV2API - resourceTaggingClient resourcegroupstaggingapiiface.ResourceGroupsTaggingAPIAPI - ec2Client ec2iface.EC2API + elbClient scope.ELBAPI + elbv2Client scope.ELBV2API + resourceTaggingClient scope.ResourceGroupsTaggingAPIAPI + ec2Client scope.EC2API cleanupFuncs ResourceCleanupFuncs collectFuncs ResourceCollectFuncs } @@ -45,10 +41,10 @@ type Service struct { func NewService(clusterScope cloud.ClusterScoper, opts ...ServiceOption) *Service { svc := &Service{ scope: clusterScope, - elbClient: scope.NewELBClient(clusterScope, clusterScope, clusterScope, clusterScope.InfraCluster()), - elbv2Client: scope.NewELBv2Client(clusterScope, clusterScope, clusterScope, clusterScope.InfraCluster()), - resourceTaggingClient: scope.NewResourgeTaggingClient(clusterScope, clusterScope, clusterScope, clusterScope.InfraCluster()), - ec2Client: scope.NewEC2Client(clusterScope, clusterScope, clusterScope, clusterScope.InfraCluster()), + elbClient: scope.NewELBClientV2(clusterScope, clusterScope, clusterScope, clusterScope.InfraCluster()), + elbv2Client: scope.NewELBV2ClientV2(clusterScope, clusterScope, clusterScope, clusterScope.InfraCluster()), + resourceTaggingClient: scope.NewResourceTaggingClientV2(clusterScope, clusterScope, clusterScope, clusterScope.InfraCluster()), + ec2Client: scope.NewEC2ClientV2(clusterScope, clusterScope, clusterScope, clusterScope.InfraCluster()), cleanupFuncs: ResourceCleanupFuncs{}, collectFuncs: ResourceCollectFuncs{}, } diff --git a/test/mocks/generate_aws.go b/test/mocks/generate_aws.go index f3b08973ec..d2b085bcba 100644 --- a/test/mocks/generate_aws.go +++ b/test/mocks/generate_aws.go @@ -20,8 +20,16 @@ limitations under the License. //go:generate /usr/bin/env bash -c "cat ../../hack/boilerplate/boilerplate.generatego.txt aws_elbv2_mock.go > _aws_elbv2_mock.go && mv _aws_elbv2_mock.go aws_elbv2_mock.go" //go:generate ../../hack/tools/bin/mockgen -destination aws_elb_mock.go -package mocks github.com/aws/aws-sdk-go/service/elb/elbiface ELBAPI //go:generate /usr/bin/env bash -c "cat ../../hack/boilerplate/boilerplate.generatego.txt aws_elb_mock.go > _aws_elb_mock.go && mv _aws_elb_mock.go aws_elb_mock.go" +//go:generate ../../hack/tools/bin/mockgen -destination aws_v2elb_mock.go -package mocks sigs.k8s.io/cluster-api-provider-aws/v2/pkg/cloud/scope ELBAPI +//go:generate /usr/bin/env bash -c "cat ../../hack/boilerplate/boilerplate.generatego.txt aws_v2elb_mock.go > _aws_v2elb_mock.go && mv _aws_v2elb_mock.go v2/aws_elb_mock.go && rm aws_v2elb_mock.go" //go:generate ../../hack/tools/bin/mockgen -destination aws_rgtagging_mock.go -package mocks github.com/aws/aws-sdk-go/service/resourcegroupstaggingapi/resourcegroupstaggingapiiface ResourceGroupsTaggingAPIAPI //go:generate /usr/bin/env bash -c "cat ../../hack/boilerplate/boilerplate.generatego.txt aws_rgtagging_mock.go > _aws_rgtagging_mock.go && mv _aws_rgtagging_mock.go aws_rgtagging_mock.go" +//go:generate ../../hack/tools/bin/mockgen -destination aws_rgtaggingv2_mock.go -package mocks sigs.k8s.io/cluster-api-provider-aws/v2/pkg/cloud/scope ResourceGroupsTaggingAPIAPI +//go:generate /usr/bin/env bash -c "cat ../../hack/boilerplate/boilerplate.generatego.txt aws_rgtaggingv2_mock.go > _aws_rgtaggingv2_mock.go && mv _aws_rgtaggingv2_mock.go v2/aws_rgtagging_mock.go && rm aws_rgtaggingv2_mock.go" //go:generate ../../hack/tools/bin/mockgen -destination aws_ec2api_mock.go -package mocks github.com/aws/aws-sdk-go/service/ec2/ec2iface EC2API //go:generate /usr/bin/env bash -c "cat ../../hack/boilerplate/boilerplate.generatego.txt aws_ec2api_mock.go > _aws_ec2api_mock.go && mv _aws_ec2api_mock.go aws_ec2api_mock.go" +//go:generate ../../hack/tools/bin/mockgen -destination aws_ec2apiv2_mock.go -package mocks sigs.k8s.io/cluster-api-provider-aws/v2/pkg/cloud/scope EC2API +//go:generate /usr/bin/env bash -c "cat ../../hack/boilerplate/boilerplate.generatego.txt aws_ec2apiv2_mock.go > _aws_ec2apiv2_mock.go && mv _aws_ec2apiv2_mock.go v2/aws_ec2api_mock.go && rm aws_ec2apiv2_mock.go" +//go:generate ../../hack/tools/bin/mockgen -destination aws_elbv2v2_mock.go -package mocks sigs.k8s.io/cluster-api-provider-aws/v2/pkg/cloud/scope ELBV2API +//go:generate /usr/bin/env bash -c "cat ../../hack/boilerplate/boilerplate.generatego.txt aws_elbv2v2_mock.go > _aws_elbv2v2_mock.go && mv _aws_elbv2v2_mock.go v2/aws_elbv2_mock.go && rm aws_elbv2v2_mock.go" package mocks diff --git a/test/mocks/v2/aws_ec2api_mock.go b/test/mocks/v2/aws_ec2api_mock.go new file mode 100644 index 0000000000..78ab199a36 --- /dev/null +++ b/test/mocks/v2/aws_ec2api_mock.go @@ -0,0 +1,92 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by MockGen. DO NOT EDIT. +// Source: sigs.k8s.io/cluster-api-provider-aws/v2/pkg/cloud/scope (interfaces: EC2API) + +// Package mocks is a generated GoMock package. +package mocks + +import ( + context "context" + reflect "reflect" + + ec2 "github.com/aws/aws-sdk-go-v2/service/ec2" + gomock "github.com/golang/mock/gomock" +) + +// MockEC2API is a mock of EC2API interface. +type MockEC2API struct { + ctrl *gomock.Controller + recorder *MockEC2APIMockRecorder +} + +// MockEC2APIMockRecorder is the mock recorder for MockEC2API. +type MockEC2APIMockRecorder struct { + mock *MockEC2API +} + +// NewMockEC2API creates a new mock instance. +func NewMockEC2API(ctrl *gomock.Controller) *MockEC2API { + mock := &MockEC2API{ctrl: ctrl} + mock.recorder = &MockEC2APIMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockEC2API) EXPECT() *MockEC2APIMockRecorder { + return m.recorder +} + +// DeleteSecurityGroup mocks base method. +func (m *MockEC2API) DeleteSecurityGroup(arg0 context.Context, arg1 *ec2.DeleteSecurityGroupInput, arg2 ...func(*ec2.Options)) (*ec2.DeleteSecurityGroupOutput, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "DeleteSecurityGroup", varargs...) + ret0, _ := ret[0].(*ec2.DeleteSecurityGroupOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// DeleteSecurityGroup indicates an expected call of DeleteSecurityGroup. +func (mr *MockEC2APIMockRecorder) DeleteSecurityGroup(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{arg0, arg1}, arg2...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteSecurityGroup", reflect.TypeOf((*MockEC2API)(nil).DeleteSecurityGroup), varargs...) +} + +// DescribeSecurityGroups mocks base method. +func (m *MockEC2API) DescribeSecurityGroups(arg0 context.Context, arg1 *ec2.DescribeSecurityGroupsInput, arg2 ...func(*ec2.Options)) (*ec2.DescribeSecurityGroupsOutput, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "DescribeSecurityGroups", varargs...) + ret0, _ := ret[0].(*ec2.DescribeSecurityGroupsOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// DescribeSecurityGroups indicates an expected call of DescribeSecurityGroups. +func (mr *MockEC2APIMockRecorder) DescribeSecurityGroups(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{arg0, arg1}, arg2...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DescribeSecurityGroups", reflect.TypeOf((*MockEC2API)(nil).DescribeSecurityGroups), varargs...) +} diff --git a/test/mocks/v2/aws_elb_mock.go b/test/mocks/v2/aws_elb_mock.go new file mode 100644 index 0000000000..ebfb3449e7 --- /dev/null +++ b/test/mocks/v2/aws_elb_mock.go @@ -0,0 +1,112 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by MockGen. DO NOT EDIT. +// Source: sigs.k8s.io/cluster-api-provider-aws/v2/pkg/cloud/scope (interfaces: ELBAPI) + +// Package mocks is a generated GoMock package. +package mocks + +import ( + context "context" + reflect "reflect" + + elasticloadbalancing "github.com/aws/aws-sdk-go-v2/service/elasticloadbalancing" + gomock "github.com/golang/mock/gomock" +) + +// MockELBAPI is a mock of ELBAPI interface. +type MockELBAPI struct { + ctrl *gomock.Controller + recorder *MockELBAPIMockRecorder +} + +// MockELBAPIMockRecorder is the mock recorder for MockELBAPI. +type MockELBAPIMockRecorder struct { + mock *MockELBAPI +} + +// NewMockELBAPI creates a new mock instance. +func NewMockELBAPI(ctrl *gomock.Controller) *MockELBAPI { + mock := &MockELBAPI{ctrl: ctrl} + mock.recorder = &MockELBAPIMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockELBAPI) EXPECT() *MockELBAPIMockRecorder { + return m.recorder +} + +// DeleteLoadBalancer mocks base method. +func (m *MockELBAPI) DeleteLoadBalancer(arg0 context.Context, arg1 *elasticloadbalancing.DeleteLoadBalancerInput, arg2 ...func(*elasticloadbalancing.Options)) (*elasticloadbalancing.DeleteLoadBalancerOutput, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "DeleteLoadBalancer", varargs...) + ret0, _ := ret[0].(*elasticloadbalancing.DeleteLoadBalancerOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// DeleteLoadBalancer indicates an expected call of DeleteLoadBalancer. +func (mr *MockELBAPIMockRecorder) DeleteLoadBalancer(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{arg0, arg1}, arg2...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteLoadBalancer", reflect.TypeOf((*MockELBAPI)(nil).DeleteLoadBalancer), varargs...) +} + +// DescribeLoadBalancers mocks base method. +func (m *MockELBAPI) DescribeLoadBalancers(arg0 context.Context, arg1 *elasticloadbalancing.DescribeLoadBalancersInput, arg2 ...func(*elasticloadbalancing.Options)) (*elasticloadbalancing.DescribeLoadBalancersOutput, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "DescribeLoadBalancers", varargs...) + ret0, _ := ret[0].(*elasticloadbalancing.DescribeLoadBalancersOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// DescribeLoadBalancers indicates an expected call of DescribeLoadBalancers. +func (mr *MockELBAPIMockRecorder) DescribeLoadBalancers(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{arg0, arg1}, arg2...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DescribeLoadBalancers", reflect.TypeOf((*MockELBAPI)(nil).DescribeLoadBalancers), varargs...) +} + +// DescribeTags mocks base method. +func (m *MockELBAPI) DescribeTags(arg0 context.Context, arg1 *elasticloadbalancing.DescribeTagsInput, arg2 ...func(*elasticloadbalancing.Options)) (*elasticloadbalancing.DescribeTagsOutput, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "DescribeTags", varargs...) + ret0, _ := ret[0].(*elasticloadbalancing.DescribeTagsOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// DescribeTags indicates an expected call of DescribeTags. +func (mr *MockELBAPIMockRecorder) DescribeTags(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{arg0, arg1}, arg2...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DescribeTags", reflect.TypeOf((*MockELBAPI)(nil).DescribeTags), varargs...) +} diff --git a/test/mocks/v2/aws_elbv2_mock.go b/test/mocks/v2/aws_elbv2_mock.go new file mode 100644 index 0000000000..d70eb3355b --- /dev/null +++ b/test/mocks/v2/aws_elbv2_mock.go @@ -0,0 +1,192 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by MockGen. DO NOT EDIT. +// Source: sigs.k8s.io/cluster-api-provider-aws/v2/pkg/cloud/scope (interfaces: ELBV2API) + +// Package mocks is a generated GoMock package. +package mocks + +import ( + context "context" + reflect "reflect" + + elasticloadbalancingv2 "github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2" + gomock "github.com/golang/mock/gomock" +) + +// MockELBV2API is a mock of ELBV2API interface. +type MockELBV2API struct { + ctrl *gomock.Controller + recorder *MockELBV2APIMockRecorder +} + +// MockELBV2APIMockRecorder is the mock recorder for MockELBV2API. +type MockELBV2APIMockRecorder struct { + mock *MockELBV2API +} + +// NewMockELBV2API creates a new mock instance. +func NewMockELBV2API(ctrl *gomock.Controller) *MockELBV2API { + mock := &MockELBV2API{ctrl: ctrl} + mock.recorder = &MockELBV2APIMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockELBV2API) EXPECT() *MockELBV2APIMockRecorder { + return m.recorder +} + +// DeleteListener mocks base method. +func (m *MockELBV2API) DeleteListener(arg0 context.Context, arg1 *elasticloadbalancingv2.DeleteListenerInput, arg2 ...func(*elasticloadbalancingv2.Options)) (*elasticloadbalancingv2.DeleteListenerOutput, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "DeleteListener", varargs...) + ret0, _ := ret[0].(*elasticloadbalancingv2.DeleteListenerOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// DeleteListener indicates an expected call of DeleteListener. +func (mr *MockELBV2APIMockRecorder) DeleteListener(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{arg0, arg1}, arg2...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteListener", reflect.TypeOf((*MockELBV2API)(nil).DeleteListener), varargs...) +} + +// DeleteLoadBalancer mocks base method. +func (m *MockELBV2API) DeleteLoadBalancer(arg0 context.Context, arg1 *elasticloadbalancingv2.DeleteLoadBalancerInput, arg2 ...func(*elasticloadbalancingv2.Options)) (*elasticloadbalancingv2.DeleteLoadBalancerOutput, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "DeleteLoadBalancer", varargs...) + ret0, _ := ret[0].(*elasticloadbalancingv2.DeleteLoadBalancerOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// DeleteLoadBalancer indicates an expected call of DeleteLoadBalancer. +func (mr *MockELBV2APIMockRecorder) DeleteLoadBalancer(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{arg0, arg1}, arg2...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteLoadBalancer", reflect.TypeOf((*MockELBV2API)(nil).DeleteLoadBalancer), varargs...) +} + +// DeleteTargetGroup mocks base method. +func (m *MockELBV2API) DeleteTargetGroup(arg0 context.Context, arg1 *elasticloadbalancingv2.DeleteTargetGroupInput, arg2 ...func(*elasticloadbalancingv2.Options)) (*elasticloadbalancingv2.DeleteTargetGroupOutput, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "DeleteTargetGroup", varargs...) + ret0, _ := ret[0].(*elasticloadbalancingv2.DeleteTargetGroupOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// DeleteTargetGroup indicates an expected call of DeleteTargetGroup. +func (mr *MockELBV2APIMockRecorder) DeleteTargetGroup(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{arg0, arg1}, arg2...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteTargetGroup", reflect.TypeOf((*MockELBV2API)(nil).DeleteTargetGroup), varargs...) +} + +// DescribeListeners mocks base method. +func (m *MockELBV2API) DescribeListeners(arg0 context.Context, arg1 *elasticloadbalancingv2.DescribeListenersInput, arg2 ...func(*elasticloadbalancingv2.Options)) (*elasticloadbalancingv2.DescribeListenersOutput, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "DescribeListeners", varargs...) + ret0, _ := ret[0].(*elasticloadbalancingv2.DescribeListenersOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// DescribeListeners indicates an expected call of DescribeListeners. +func (mr *MockELBV2APIMockRecorder) DescribeListeners(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{arg0, arg1}, arg2...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DescribeListeners", reflect.TypeOf((*MockELBV2API)(nil).DescribeListeners), varargs...) +} + +// DescribeLoadBalancers mocks base method. +func (m *MockELBV2API) DescribeLoadBalancers(arg0 context.Context, arg1 *elasticloadbalancingv2.DescribeLoadBalancersInput, arg2 ...func(*elasticloadbalancingv2.Options)) (*elasticloadbalancingv2.DescribeLoadBalancersOutput, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "DescribeLoadBalancers", varargs...) + ret0, _ := ret[0].(*elasticloadbalancingv2.DescribeLoadBalancersOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// DescribeLoadBalancers indicates an expected call of DescribeLoadBalancers. +func (mr *MockELBV2APIMockRecorder) DescribeLoadBalancers(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{arg0, arg1}, arg2...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DescribeLoadBalancers", reflect.TypeOf((*MockELBV2API)(nil).DescribeLoadBalancers), varargs...) +} + +// DescribeTags mocks base method. +func (m *MockELBV2API) DescribeTags(arg0 context.Context, arg1 *elasticloadbalancingv2.DescribeTagsInput, arg2 ...func(*elasticloadbalancingv2.Options)) (*elasticloadbalancingv2.DescribeTagsOutput, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "DescribeTags", varargs...) + ret0, _ := ret[0].(*elasticloadbalancingv2.DescribeTagsOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// DescribeTags indicates an expected call of DescribeTags. +func (mr *MockELBV2APIMockRecorder) DescribeTags(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{arg0, arg1}, arg2...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DescribeTags", reflect.TypeOf((*MockELBV2API)(nil).DescribeTags), varargs...) +} + +// DescribeTargetGroups mocks base method. +func (m *MockELBV2API) DescribeTargetGroups(arg0 context.Context, arg1 *elasticloadbalancingv2.DescribeTargetGroupsInput, arg2 ...func(*elasticloadbalancingv2.Options)) (*elasticloadbalancingv2.DescribeTargetGroupsOutput, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "DescribeTargetGroups", varargs...) + ret0, _ := ret[0].(*elasticloadbalancingv2.DescribeTargetGroupsOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// DescribeTargetGroups indicates an expected call of DescribeTargetGroups. +func (mr *MockELBV2APIMockRecorder) DescribeTargetGroups(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{arg0, arg1}, arg2...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DescribeTargetGroups", reflect.TypeOf((*MockELBV2API)(nil).DescribeTargetGroups), varargs...) +} diff --git a/test/mocks/v2/aws_rgtagging_mock.go b/test/mocks/v2/aws_rgtagging_mock.go new file mode 100644 index 0000000000..dbf6f269d5 --- /dev/null +++ b/test/mocks/v2/aws_rgtagging_mock.go @@ -0,0 +1,72 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by MockGen. DO NOT EDIT. +// Source: sigs.k8s.io/cluster-api-provider-aws/v2/pkg/cloud/scope (interfaces: ResourceGroupsTaggingAPIAPI) + +// Package mocks is a generated GoMock package. +package mocks + +import ( + context "context" + reflect "reflect" + + resourcegroupstaggingapi "github.com/aws/aws-sdk-go-v2/service/resourcegroupstaggingapi" + gomock "github.com/golang/mock/gomock" +) + +// MockResourceGroupsTaggingAPIAPI is a mock of ResourceGroupsTaggingAPIAPI interface. +type MockResourceGroupsTaggingAPIAPI struct { + ctrl *gomock.Controller + recorder *MockResourceGroupsTaggingAPIAPIMockRecorder +} + +// MockResourceGroupsTaggingAPIAPIMockRecorder is the mock recorder for MockResourceGroupsTaggingAPIAPI. +type MockResourceGroupsTaggingAPIAPIMockRecorder struct { + mock *MockResourceGroupsTaggingAPIAPI +} + +// NewMockResourceGroupsTaggingAPIAPI creates a new mock instance. +func NewMockResourceGroupsTaggingAPIAPI(ctrl *gomock.Controller) *MockResourceGroupsTaggingAPIAPI { + mock := &MockResourceGroupsTaggingAPIAPI{ctrl: ctrl} + mock.recorder = &MockResourceGroupsTaggingAPIAPIMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockResourceGroupsTaggingAPIAPI) EXPECT() *MockResourceGroupsTaggingAPIAPIMockRecorder { + return m.recorder +} + +// GetResources mocks base method. +func (m *MockResourceGroupsTaggingAPIAPI) GetResources(arg0 context.Context, arg1 *resourcegroupstaggingapi.GetResourcesInput, arg2 ...func(*resourcegroupstaggingapi.Options)) (*resourcegroupstaggingapi.GetResourcesOutput, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetResources", varargs...) + ret0, _ := ret[0].(*resourcegroupstaggingapi.GetResourcesOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetResources indicates an expected call of GetResources. +func (mr *MockResourceGroupsTaggingAPIAPIMockRecorder) GetResources(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{arg0, arg1}, arg2...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetResources", reflect.TypeOf((*MockResourceGroupsTaggingAPIAPI)(nil).GetResources), varargs...) +}