Skip to content

Commit f9d702f

Browse files
committed
wip: secrets manager sdk v2 changes
Signed-off-by: Richard Case <[email protected]>
1 parent 8d4c7f2 commit f9d702f

File tree

11 files changed

+366
-1343
lines changed

11 files changed

+366
-1343
lines changed

pkg/cloud/converters/tags.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import (
2424
elbtypes "github.com/aws/aws-sdk-go-v2/service/elasticloadbalancing/types"
2525
elbv2types "github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2/types"
2626
iamtypes "github.com/aws/aws-sdk-go-v2/service/iam/types"
27+
secretsmanagertypes "github.com/aws/aws-sdk-go-v2/service/secretsmanager/types"
2728
ssmtypes "github.com/aws/aws-sdk-go-v2/service/ssm/types"
2829
"github.com/aws/aws-sdk-go/aws"
2930
"github.com/aws/aws-sdk-go/service/ec2"
@@ -168,6 +169,20 @@ func MapToSecretsManagerTags(src infrav1.Tags) []*secretsmanager.Tag {
168169
return tags
169170
}
170171

172+
// MapToSecretsManagerTagsV2 converts infrav1.Tags (a map of string key-value pairs) to a slice of Secrets Manager Tag objects for SDK v2.
173+
func MapToSecretsManagerTagsV2(tags infrav1.Tags) []secretsmanagertypes.Tag {
174+
result := make([]secretsmanagertypes.Tag, 0, len(tags))
175+
for k, v := range tags {
176+
key := k
177+
value := v
178+
result = append(result, secretsmanagertypes.Tag{
179+
Key: &key,
180+
Value: &value,
181+
})
182+
}
183+
return result
184+
}
185+
171186
// MapToIAMTags converts a infrav1.Tags to a []*iam.Tag.
172187
func MapToIAMTags(src infrav1.Tags) []iamtypes.Tag {
173188
tags := make([]iamtypes.Tag, 0, len(src))

pkg/cloud/endpointsv2/endpoints.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import (
3030
"github.com/aws/aws-sdk-go-v2/service/eventbridge"
3131
rgapi "github.com/aws/aws-sdk-go-v2/service/resourcegroupstaggingapi"
3232
"github.com/aws/aws-sdk-go-v2/service/s3"
33+
"github.com/aws/aws-sdk-go-v2/service/secretsmanager"
3334
"github.com/aws/aws-sdk-go-v2/service/sqs"
3435
"github.com/aws/aws-sdk-go-v2/service/ssm"
3536
smithyendpoints "github.com/aws/smithy-go/endpoints"
@@ -303,3 +304,25 @@ func (s *SSMEndpointResolver) ResolveEndpoint(ctx context.Context, params ssm.En
303304
params.Region = &endpoint.SigningRegion
304305
return ssm.NewDefaultEndpointResolverV2().ResolveEndpoint(ctx, params)
305306
}
307+
308+
// SecretsManagerEndpointResolver implements EndpointResolverV2 interface for Secrets Manager.
309+
type SecretsManagerEndpointResolver struct {
310+
*MultiServiceEndpointResolver
311+
}
312+
313+
// ResolveEndpoint for Secrets Manager.
314+
func (s *SecretsManagerEndpointResolver) ResolveEndpoint(ctx context.Context, params secretsmanager.EndpointParameters) (smithyendpoints.Endpoint, error) {
315+
// If custom endpoint not found, return default endpoint for the service
316+
log := logger.FromContext(ctx)
317+
endpoint, ok := s.endpoints[secretsmanager.ServiceID]
318+
319+
if !ok {
320+
log.Debug("Custom endpoint not found, using default endpoint")
321+
return secretsmanager.NewDefaultEndpointResolverV2().ResolveEndpoint(ctx, params)
322+
}
323+
324+
log.Debug("Custom endpoint found, using custom endpoint", "endpoint", endpoint.URL)
325+
params.Endpoint = &endpoint.URL
326+
params.Region = &endpoint.SigningRegion
327+
return secretsmanager.NewDefaultEndpointResolverV2().ResolveEndpoint(ctx, params)
328+
}

pkg/cloud/scope/clients.go

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,14 @@ import (
2828
"github.com/aws/aws-sdk-go-v2/service/iam"
2929
rgapi "github.com/aws/aws-sdk-go-v2/service/resourcegroupstaggingapi"
3030
"github.com/aws/aws-sdk-go-v2/service/s3"
31+
secretsmanagerv2 "github.com/aws/aws-sdk-go-v2/service/secretsmanager"
3132
"github.com/aws/aws-sdk-go-v2/service/sqs"
3233
"github.com/aws/aws-sdk-go-v2/service/ssm"
3334
"github.com/aws/aws-sdk-go/aws"
3435
"github.com/aws/aws-sdk-go/aws/awserr"
3536
"github.com/aws/aws-sdk-go/aws/request"
3637
"github.com/aws/aws-sdk-go/service/ec2"
3738
"github.com/aws/aws-sdk-go/service/ec2/ec2iface"
38-
"github.com/aws/aws-sdk-go/service/secretsmanager"
3939
"github.com/aws/aws-sdk-go/service/secretsmanager/secretsmanageriface"
4040
"github.com/aws/aws-sdk-go/service/sts"
4141
"github.com/aws/aws-sdk-go/service/sts/stsiface"
@@ -224,16 +224,26 @@ func NewResourgeTaggingClient(scopeUser cloud.ScopeUsage, session cloud.Session,
224224
return rgapi.NewFromConfig(cfg, opts...)
225225
}
226226

227-
// NewSecretsManagerClient creates a new Secrets API client for a given session..
228-
func NewSecretsManagerClient(scopeUser cloud.ScopeUsage, session cloud.Session, logger logger.Wrapper, target runtime.Object) secretsmanageriface.SecretsManagerAPI {
229-
secretsClient := secretsmanager.New(session.Session(), aws.NewConfig().WithLogLevel(awslogs.GetAWSLogLevel(logger.GetLogger())).WithLogger(awslogs.NewWrapLogr(logger.GetLogger())))
230-
secretsClient.Handlers.Build.PushFrontNamed(getUserAgentHandler())
231-
secretsClient.Handlers.Sign.PushFront(session.ServiceLimiter(secretsClient.ServiceID).LimitRequest)
232-
secretsClient.Handlers.CompleteAttempt.PushFront(awsmetrics.CaptureRequestMetrics(scopeUser.ControllerName()))
233-
secretsClient.Handlers.CompleteAttempt.PushFront(session.ServiceLimiter(secretsClient.ServiceID).ReviewResponse)
234-
secretsClient.Handlers.Complete.PushBack(recordAWSPermissionsIssue(target))
227+
// NewSecretsManagerClientV2 creates a new Secrets Manager API client for a given session using AWS SDK v2.
228+
func NewSecretsManagerClientV2(scopeUser cloud.ScopeUsage, session cloud.Session, logger logger.Wrapper, target runtime.Object) *secretsmanagerv2.Client {
229+
cfg := session.SessionV2()
230+
multiSvcEndpointResolver := endpointsv2.NewMultiServiceEndpointResolver()
231+
secretsManagerEndpointResolver := &endpointsv2.SecretsManagerEndpointResolver{
232+
MultiServiceEndpointResolver: multiSvcEndpointResolver,
233+
}
234+
secretsManagerOpts := []func(*secretsmanagerv2.Options){
235+
func(o *secretsmanagerv2.Options) {
236+
o.Logger = logger.GetAWSLogger()
237+
o.ClientLogMode = awslogs.GetAWSLogLevelV2(logger.GetLogger())
238+
o.EndpointResolverV2 = secretsManagerEndpointResolver
239+
},
240+
secretsmanagerv2.WithAPIOptions(
241+
awsmetricsv2.WithMiddlewares(scopeUser.ControllerName(), target),
242+
awsmetricsv2.WithCAPAUserAgentMiddleware(),
243+
),
244+
}
235245

236-
return secretsClient
246+
return secretsmanagerv2.NewFromConfig(cfg, secretsManagerOpts...)
237247
}
238248

239249
// NewEKSClient creates a new EKS API client for a given session.

pkg/cloud/services/secretsmanager/mock_secretsmanageriface/doc.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,6 @@ limitations under the License.
1717
// Package mock_secretsmanageriface provides a mock interface for the SecretsManager API client.
1818
// Run go generate to regenerate this mock.
1919
//
20-
//go:generate ../../../../../hack/tools/bin/mockgen -destination secretsmanagerapi_mock.go -package mock_secretsmanageriface github.com/aws/aws-sdk-go/service/secretsmanager/secretsmanageriface SecretsManagerAPI
20+
//go:generate ../../../../../hack/tools/bin/mockgen -destination secretsmanagerapi_mock.go -package mock_secretsmanageriface sigs.k8s.io/cluster-api-provider-aws/v2/pkg/cloud/services/secretsmanager SecretsManagerAPI
2121
//go:generate /usr/bin/env bash -c "cat ../../../../../hack/boilerplate/boilerplate.generatego.txt secretsmanagerapi_mock.go > _secretsmanagerapi_mock.go && mv _secretsmanagerapi_mock.go secretsmanagerapi_mock.go"
2222
package mock_secretsmanageriface //nolint:stylecheck

0 commit comments

Comments
 (0)