diff --git a/cloudmock/aws/mockeventbridge/api.go b/cloudmock/aws/mockeventbridge/api.go index 12d9d13f90..49575ac18a 100644 --- a/cloudmock/aws/mockeventbridge/api.go +++ b/cloudmock/aws/mockeventbridge/api.go @@ -17,39 +17,41 @@ limitations under the License. package mockeventbridge import ( + "context" "sync" - "github.com/aws/aws-sdk-go/service/eventbridge" - "github.com/aws/aws-sdk-go/service/eventbridge/eventbridgeiface" + "github.com/aws/aws-sdk-go-v2/service/eventbridge" + eventbridgetypes "github.com/aws/aws-sdk-go-v2/service/eventbridge/types" + "k8s.io/kops/util/pkg/awsinterfaces" ) type MockEventBridge struct { - eventbridgeiface.EventBridgeAPI + awsinterfaces.EventBridgeAPI mutex sync.Mutex - Rules map[string]*eventbridge.Rule - TagsByArn map[string][]*eventbridge.Tag - TargetsByRule map[string][]*eventbridge.Target + Rules map[string]*eventbridgetypes.Rule + TagsByArn map[string][]eventbridgetypes.Tag + TargetsByRule map[string][]eventbridgetypes.Target } -var _ eventbridgeiface.EventBridgeAPI = &MockEventBridge{} +var _ awsinterfaces.EventBridgeAPI = &MockEventBridge{} -func (m *MockEventBridge) PutRule(input *eventbridge.PutRuleInput) (*eventbridge.PutRuleOutput, error) { +func (m *MockEventBridge) PutRule(ctx context.Context, input *eventbridge.PutRuleInput, optFns ...func(*eventbridge.Options)) (*eventbridge.PutRuleOutput, error) { m.mutex.Lock() defer m.mutex.Unlock() name := *input.Name arn := "arn:aws-test:events:us-east-1:012345678901:rule/" + name - rule := &eventbridge.Rule{ + rule := &eventbridgetypes.Rule{ Arn: &arn, EventPattern: input.EventPattern, } if m.Rules == nil { - m.Rules = make(map[string]*eventbridge.Rule) + m.Rules = make(map[string]*eventbridgetypes.Rule) } if m.TagsByArn == nil { - m.TagsByArn = make(map[string][]*eventbridge.Tag) + m.TagsByArn = make(map[string][]eventbridgetypes.Tag) } m.Rules[name] = rule m.TagsByArn[arn] = input.Tags @@ -60,7 +62,7 @@ func (m *MockEventBridge) PutRule(input *eventbridge.PutRuleInput) (*eventbridge return response, nil } -func (m *MockEventBridge) ListRules(input *eventbridge.ListRulesInput) (*eventbridge.ListRulesOutput, error) { +func (m *MockEventBridge) ListRules(ctx context.Context, input *eventbridge.ListRulesInput, optFns ...func(*eventbridge.Options)) (*eventbridge.ListRulesOutput, error) { m.mutex.Lock() defer m.mutex.Unlock() @@ -70,15 +72,15 @@ func (m *MockEventBridge) ListRules(input *eventbridge.ListRulesInput) (*eventbr if rule == nil { return response, nil } - response.Rules = []*eventbridge.Rule{rule} + response.Rules = []eventbridgetypes.Rule{*rule} return response, nil } -func (m *MockEventBridge) DeleteRule(*eventbridge.DeleteRuleInput) (*eventbridge.DeleteRuleOutput, error) { +func (m *MockEventBridge) DeleteRule(ctx context.Context, input *eventbridge.DeleteRuleInput, optFns ...func(*eventbridge.Options)) (*eventbridge.DeleteRuleOutput, error) { panic("Not implemented") } -func (m *MockEventBridge) ListTagsForResource(input *eventbridge.ListTagsForResourceInput) (*eventbridge.ListTagsForResourceOutput, error) { +func (m *MockEventBridge) ListTagsForResource(ctx context.Context, input *eventbridge.ListTagsForResourceInput, optFns ...func(*eventbridge.Options)) (*eventbridge.ListTagsForResourceOutput, error) { m.mutex.Lock() defer m.mutex.Unlock() @@ -88,19 +90,19 @@ func (m *MockEventBridge) ListTagsForResource(input *eventbridge.ListTagsForReso return response, nil } -func (m *MockEventBridge) PutTargets(input *eventbridge.PutTargetsInput) (*eventbridge.PutTargetsOutput, error) { +func (m *MockEventBridge) PutTargets(ctx context.Context, input *eventbridge.PutTargetsInput, optFns ...func(*eventbridge.Options)) (*eventbridge.PutTargetsOutput, error) { m.mutex.Lock() defer m.mutex.Unlock() if m.TargetsByRule == nil { - m.TargetsByRule = make(map[string][]*eventbridge.Target) + m.TargetsByRule = make(map[string][]eventbridgetypes.Target) } m.TargetsByRule[*input.Rule] = input.Targets return &eventbridge.PutTargetsOutput{}, nil } -func (m *MockEventBridge) ListTargetsByRule(input *eventbridge.ListTargetsByRuleInput) (*eventbridge.ListTargetsByRuleOutput, error) { +func (m *MockEventBridge) ListTargetsByRule(ctx context.Context, input *eventbridge.ListTargetsByRuleInput, optFns ...func(*eventbridge.Options)) (*eventbridge.ListTargetsByRuleOutput, error) { m.mutex.Lock() defer m.mutex.Unlock() @@ -110,6 +112,6 @@ func (m *MockEventBridge) ListTargetsByRule(input *eventbridge.ListTargetsByRule return response, nil } -func (m *MockEventBridge) RemoveTargets(*eventbridge.RemoveTargetsInput) (*eventbridge.RemoveTargetsOutput, error) { +func (m *MockEventBridge) RemoveTargets(ctx context.Context, input *eventbridge.RemoveTargetsInput, optFns ...func(*eventbridge.Options)) (*eventbridge.RemoveTargetsOutput, error) { panic("Not implemented") } diff --git a/pkg/model/awsmodel/nodeterminationhandler.go b/pkg/model/awsmodel/nodeterminationhandler.go index a450b71fd7..20bf812400 100644 --- a/pkg/model/awsmodel/nodeterminationhandler.go +++ b/pkg/model/awsmodel/nodeterminationhandler.go @@ -19,9 +19,9 @@ package awsmodel import ( "fmt" + "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/aws/arn" - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/service/eventbridge" + "github.com/aws/aws-sdk-go-v2/service/eventbridge" "k8s.io/kops/pkg/apis/kops" "k8s.io/kops/pkg/model" "k8s.io/kops/pkg/model/iam" @@ -200,7 +200,7 @@ func (b *NodeTerminationHandlerBuilder) FindDeletions(c *fi.CloudupModelBuilderC request := &eventbridge.ListRulesInput{ NamePrefix: ruleName, } - response, err := eventBridge.ListRules(request) + response, err := eventBridge.ListRules(c.Context(), request) if err != nil { return fmt.Errorf("listing EventBridge rules: %w", err) } @@ -213,7 +213,7 @@ func (b *NodeTerminationHandlerBuilder) FindDeletions(c *fi.CloudupModelBuilderC rule := response.Rules[0] - tagResponse, err := eventBridge.ListTagsForResource(&eventbridge.ListTagsForResourceInput{ResourceARN: rule.Arn}) + tagResponse, err := eventBridge.ListTagsForResource(c.Context(), &eventbridge.ListTagsForResourceInput{ResourceARN: rule.Arn}) if err != nil { return fmt.Errorf("listing tags for EventBridge rule: %w", err) } diff --git a/pkg/resources/aws/eventbridge.go b/pkg/resources/aws/eventbridge.go index 244624755d..38fbf56fca 100644 --- a/pkg/resources/aws/eventbridge.go +++ b/pkg/resources/aws/eventbridge.go @@ -17,10 +17,11 @@ limitations under the License. package aws import ( + "context" "fmt" - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/service/eventbridge" + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/service/eventbridge" "k8s.io/klog/v2" "k8s.io/kops/pkg/resources" @@ -44,22 +45,22 @@ func EventBridgeRuleDeleter(cloud fi.Cloud, r *resources.Resource) error { } func DeleteEventBridgeRule(cloud fi.Cloud, ruleName string) error { - + ctx := context.TODO() c := cloud.(awsup.AWSCloud) - targets, err := c.EventBridge().ListTargetsByRule(&eventbridge.ListTargetsByRuleInput{ + targets, err := c.EventBridge().ListTargetsByRule(ctx, &eventbridge.ListTargetsByRuleInput{ Rule: aws.String(ruleName), }) if err != nil { return fmt.Errorf("listing targets for EventBridge rule %q: %w", ruleName, err) } if len(targets.Targets) > 0 { - var ids []*string + var ids []string for _, target := range targets.Targets { - ids = append(ids, target.Id) + ids = append(ids, aws.ToString(target.Id)) } klog.V(2).Infof("Removing EventBridge Targets for rule %q", ruleName) - _, err = c.EventBridge().RemoveTargets(&eventbridge.RemoveTargetsInput{ + _, err = c.EventBridge().RemoveTargets(ctx, &eventbridge.RemoveTargetsInput{ Ids: ids, Rule: aws.String(ruleName), }) @@ -72,7 +73,7 @@ func DeleteEventBridgeRule(cloud fi.Cloud, ruleName string) error { request := &eventbridge.DeleteRuleInput{ Name: aws.String(ruleName), } - _, err = c.EventBridge().DeleteRule(request) + _, err = c.EventBridge().DeleteRule(ctx, request) if err != nil { return fmt.Errorf("deleting EventBridge rule %q: %w", ruleName, err) } @@ -80,6 +81,7 @@ func DeleteEventBridgeRule(cloud fi.Cloud, ruleName string) error { } func ListEventBridgeRules(cloud fi.Cloud, vpcID, clusterName string) ([]*resources.Resource, error) { + ctx := context.TODO() c := cloud.(awsup.AWSCloud) klog.V(2).Infof("Listing EventBridge rules") @@ -91,7 +93,7 @@ func ListEventBridgeRules(cloud fi.Cloud, vpcID, clusterName string) ([]*resourc Limit: nil, NamePrefix: aws.String(clusterNamePrefix), } - response, err := c.EventBridge().ListRules(request) + response, err := c.EventBridge().ListRules(ctx, request) if err != nil { return nil, fmt.Errorf("error listing Eventbridge rules: %v", err) } diff --git a/upup/pkg/fi/cloudup/awstasks/eventbridgerule.go b/upup/pkg/fi/cloudup/awstasks/eventbridgerule.go index 26b5645042..8e91251245 100644 --- a/upup/pkg/fi/cloudup/awstasks/eventbridgerule.go +++ b/upup/pkg/fi/cloudup/awstasks/eventbridgerule.go @@ -17,10 +17,12 @@ limitations under the License. package awstasks import ( + "context" "fmt" - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/service/eventbridge" + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/service/eventbridge" + eventbridgetypes "github.com/aws/aws-sdk-go-v2/service/eventbridge/types" "k8s.io/apimachinery/pkg/util/validation/field" awsResources "k8s.io/kops/pkg/resources/aws" "k8s.io/kops/upup/pkg/fi" @@ -57,7 +59,7 @@ func (eb *EventBridgeRule) Find(c *fi.CloudupContext) (*EventBridgeRule, error) request := &eventbridge.ListRulesInput{ NamePrefix: eb.Name, } - response, err := cloud.EventBridge().ListRules(request) + response, err := cloud.EventBridge().ListRules(c.Context(), request) if err != nil { return nil, fmt.Errorf("error listing EventBridge rules: %v", err) } @@ -70,7 +72,7 @@ func (eb *EventBridgeRule) Find(c *fi.CloudupContext) (*EventBridgeRule, error) rule := response.Rules[0] - tagResponse, err := cloud.EventBridge().ListTagsForResource(&eventbridge.ListTagsForResourceInput{ResourceARN: rule.Arn}) + tagResponse, err := cloud.EventBridge().ListTagsForResource(c.Context(), &eventbridge.ListTagsForResourceInput{ResourceARN: rule.Arn}) if err != nil { return nil, fmt.Errorf("error listing tags for EventBridge rule: %v", err) } @@ -106,9 +108,9 @@ func (eb *EventBridgeRule) RenderAWS(t *awsup.AWSAPITarget, a, e, changes *Event } if a == nil { - var tags []*eventbridge.Tag + var tags []eventbridgetypes.Tag for k, v := range eb.Tags { - tags = append(tags, &eventbridge.Tag{ + tags = append(tags, eventbridgetypes.Tag{ Key: aws.String(k), Value: aws.String(v), }) @@ -120,7 +122,7 @@ func (eb *EventBridgeRule) RenderAWS(t *awsup.AWSAPITarget, a, e, changes *Event Tags: tags, } - _, err := t.Cloud.EventBridge().PutRule(request) + _, err := t.Cloud.EventBridge().PutRule(context.TODO(), request) if err != nil { return fmt.Errorf("error creating EventBridge rule: %v", err) } diff --git a/upup/pkg/fi/cloudup/awstasks/eventbridgetarget.go b/upup/pkg/fi/cloudup/awstasks/eventbridgetarget.go index c73116cde7..ff73a07d89 100644 --- a/upup/pkg/fi/cloudup/awstasks/eventbridgetarget.go +++ b/upup/pkg/fi/cloudup/awstasks/eventbridgetarget.go @@ -17,13 +17,15 @@ limitations under the License. package awstasks import ( + "context" "fmt" "k8s.io/apimachinery/pkg/util/validation/field" "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter" - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/service/eventbridge" + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/service/eventbridge" + eventbridgetypes "github.com/aws/aws-sdk-go-v2/service/eventbridge/types" "k8s.io/kops/upup/pkg/fi" "k8s.io/kops/upup/pkg/fi/cloudup/awsup" "k8s.io/kops/upup/pkg/fi/cloudup/terraform" @@ -65,7 +67,7 @@ func (eb *EventBridgeTarget) Find(c *fi.CloudupContext) (*EventBridgeTarget, err Rule: eb.Rule.Name, } - response, err := cloud.EventBridge().ListTargetsByRule(request) + response, err := cloud.EventBridge().ListTargetsByRule(c.Context(), request) if err != nil { return nil, fmt.Errorf("error listing EventBridge targets: %v", err) } @@ -107,17 +109,17 @@ func (_ *EventBridgeTarget) CheckChanges(a, e, changes *EventBridgeTarget) error func (eb *EventBridgeTarget) RenderAWS(t *awsup.AWSAPITarget, a, e, changes *EventBridgeTarget) error { if a == nil { - target := &eventbridge.Target{ + target := eventbridgetypes.Target{ Arn: eb.SQSQueue.ARN, Id: aws.String("1"), } request := &eventbridge.PutTargetsInput{ Rule: eb.Rule.Name, - Targets: []*eventbridge.Target{target}, + Targets: []eventbridgetypes.Target{target}, } - _, err := t.Cloud.EventBridge().PutTargets(request) + _, err := t.Cloud.EventBridge().PutTargets(context.TODO(), request) if err != nil { return fmt.Errorf("error creating EventBridge target: %v", err) } diff --git a/upup/pkg/fi/cloudup/awstasks/tags.go b/upup/pkg/fi/cloudup/awstasks/tags.go index e75d2c8826..5bc1ddc09c 100644 --- a/upup/pkg/fi/cloudup/awstasks/tags.go +++ b/upup/pkg/fi/cloudup/awstasks/tags.go @@ -19,9 +19,9 @@ package awstasks import ( "strings" + eventbridgetypes "github.com/aws/aws-sdk-go-v2/service/eventbridge/types" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/service/ec2" - "github.com/aws/aws-sdk-go/service/eventbridge" "github.com/aws/aws-sdk-go/service/iam" ) @@ -67,7 +67,7 @@ func mapToIAMTags(tags map[string]string) []*iam.Tag { return m } -func mapEventBridgeTagsToMap(tags []*eventbridge.Tag) map[string]string { +func mapEventBridgeTagsToMap(tags []eventbridgetypes.Tag) map[string]string { if tags == nil { return nil } diff --git a/upup/pkg/fi/cloudup/awsup/mock_aws_cloud.go b/upup/pkg/fi/cloudup/awsup/mock_aws_cloud.go index 3de8737553..0477a7479e 100644 --- a/upup/pkg/fi/cloudup/awsup/mock_aws_cloud.go +++ b/upup/pkg/fi/cloudup/awsup/mock_aws_cloud.go @@ -30,7 +30,6 @@ import ( "github.com/aws/aws-sdk-go/service/elb/elbiface" "github.com/aws/aws-sdk-go/service/elbv2" "github.com/aws/aws-sdk-go/service/elbv2/elbv2iface" - "github.com/aws/aws-sdk-go/service/eventbridge/eventbridgeiface" "github.com/aws/aws-sdk-go/service/iam/iamiface" "github.com/aws/aws-sdk-go/service/route53/route53iface" "github.com/aws/aws-sdk-go/service/sqs/sqsiface" @@ -43,6 +42,7 @@ import ( "k8s.io/kops/pkg/cloudinstances" "k8s.io/kops/pkg/resources/spotinst" "k8s.io/kops/upup/pkg/fi" + "k8s.io/kops/util/pkg/awsinterfaces" ) type MockAWSCloud struct { @@ -87,7 +87,7 @@ type MockCloud struct { MockELBV2 elbv2iface.ELBV2API MockSpotinst spotinst.Cloud MockSQS sqsiface.SQSAPI - MockEventBridge eventbridgeiface.EventBridgeAPI + MockEventBridge awsinterfaces.EventBridgeAPI MockSSM ssmiface.SSMAPI } @@ -295,7 +295,7 @@ func (c *MockAWSCloud) SQS() sqsiface.SQSAPI { return c.MockSQS } -func (c *MockAWSCloud) EventBridge() eventbridgeiface.EventBridgeAPI { +func (c *MockAWSCloud) EventBridge() awsinterfaces.EventBridgeAPI { if c.MockEventBridge == nil { klog.Fatalf("MockEventBridgess not set") } diff --git a/util/pkg/awsinterfaces/eventbridge.go b/util/pkg/awsinterfaces/eventbridge.go new file mode 100644 index 0000000000..6cf7bbb169 --- /dev/null +++ b/util/pkg/awsinterfaces/eventbridge.go @@ -0,0 +1,33 @@ +/* +Copyright 2024 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 awsinterfaces + +import ( + "context" + + "github.com/aws/aws-sdk-go-v2/service/eventbridge" +) + +type EventBridgeAPI interface { + ListTargetsByRule(ctx context.Context, params *eventbridge.ListTargetsByRuleInput, optFns ...func(*eventbridge.Options)) (*eventbridge.ListTargetsByRuleOutput, error) + PutTargets(ctx context.Context, params *eventbridge.PutTargetsInput, optFns ...func(*eventbridge.Options)) (*eventbridge.PutTargetsOutput, error) + ListRules(ctx context.Context, params *eventbridge.ListRulesInput, optFns ...func(*eventbridge.Options)) (*eventbridge.ListRulesOutput, error) + PutRule(ctx context.Context, params *eventbridge.PutRuleInput, optFns ...func(*eventbridge.Options)) (*eventbridge.PutRuleOutput, error) + ListTagsForResource(ctx context.Context, params *eventbridge.ListTagsForResourceInput, optFns ...func(*eventbridge.Options)) (*eventbridge.ListTagsForResourceOutput, error) + DeleteRule(ctx context.Context, params *eventbridge.DeleteRuleInput, optFns ...func(*eventbridge.Options)) (*eventbridge.DeleteRuleOutput, error) + RemoveTargets(ctx context.Context, params *eventbridge.RemoveTargetsInput, optFns ...func(*eventbridge.Options)) (*eventbridge.RemoveTargetsOutput, error) +}