Skip to content

Commit fe3ed4f

Browse files
richardcaseLiangquanLi930
authored andcommitted
secrets manager sdk v2 changes
1 parent 8e80745 commit fe3ed4f

File tree

6 files changed

+57
-26
lines changed

6 files changed

+57
-26
lines changed

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
"github.com/aws/aws-sdk-go-v2/service/sts"
@@ -326,3 +327,25 @@ func (s *STSEndpointResolver) ResolveEndpoint(ctx context.Context, params sts.En
326327
params.Region = &endpoint.SigningRegion
327328
return sts.NewDefaultEndpointResolverV2().ResolveEndpoint(ctx, params)
328329
}
330+
331+
// SecretsManagerEndpointResolver implements EndpointResolverV2 interface for Secrets Manager.
332+
type SecretsManagerEndpointResolver struct {
333+
*MultiServiceEndpointResolver
334+
}
335+
336+
// ResolveEndpoint for Secrets Manager.
337+
func (s *SecretsManagerEndpointResolver) ResolveEndpoint(ctx context.Context, params secretsmanager.EndpointParameters) (smithyendpoints.Endpoint, error) {
338+
// If custom endpoint not found, return default endpoint for the service
339+
log := logger.FromContext(ctx)
340+
endpoint, ok := s.endpoints[secretsmanager.ServiceID]
341+
342+
if !ok {
343+
log.Debug("Custom endpoint not found, using default endpoint")
344+
return secretsmanager.NewDefaultEndpointResolverV2().ResolveEndpoint(ctx, params)
345+
}
346+
347+
log.Debug("Custom endpoint found, using custom endpoint", "endpoint", endpoint.URL)
348+
params.Endpoint = &endpoint.URL
349+
params.Region = &endpoint.SigningRegion
350+
return secretsmanager.NewDefaultEndpointResolverV2().ResolveEndpoint(ctx, params)
351+
}

pkg/cloud/scope/clients.go

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -217,20 +217,23 @@ func NewResourgeTaggingClient(scopeUser cloud.ScopeUsage, session cloud.Session,
217217
// NewSecretsManagerClient creates a new Secrets API client for a given session..
218218
func NewSecretsManagerClient(scopeUser cloud.ScopeUsage, session cloud.Session, logger logger.Wrapper, target runtime.Object) *secretsmanager.Client {
219219
cfg := session.Session()
220-
221-
secretsOpts := []func(*secretsmanager.Options){
220+
multiSvcEndpointResolver := endpointsv2.NewMultiServiceEndpointResolver()
221+
secretsManagerEndpointResolver := &endpointsv2.SecretsManagerEndpointResolver{
222+
MultiServiceEndpointResolver: multiSvcEndpointResolver,
223+
}
224+
secretsManagerOpts := []func(*secretsmanager.Options){
222225
func(o *secretsmanager.Options) {
223226
o.Logger = logger.GetAWSLogger()
224227
o.ClientLogMode = awslogs.GetAWSLogLevelV2(logger.GetLogger())
228+
o.EndpointResolverV2 = secretsManagerEndpointResolver
225229
},
226230
secretsmanager.WithAPIOptions(
227231
awsmetricsv2.WithMiddlewares(scopeUser.ControllerName(), target),
228232
awsmetricsv2.WithCAPAUserAgentMiddleware(),
229-
throttle.WithServiceLimiterMiddleware(session.ServiceLimiter(secretsmanager.ServiceID)),
230233
),
231234
}
232235

233-
return secretsmanager.NewFromConfig(cfg, secretsOpts...)
236+
return secretsmanager.NewFromConfig(cfg, secretsManagerOpts...)
234237
}
235238

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

pkg/cloud/services/secretsmanager/secret.go

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,17 @@ package secretsmanager
1818

1919
import (
2020
"context"
21+
"errors"
2122
"fmt"
2223
"path"
2324

2425
"github.com/aws/aws-sdk-go-v2/aws"
2526
"github.com/aws/aws-sdk-go-v2/service/secretsmanager"
27+
"github.com/aws/smithy-go"
2628
kerrors "k8s.io/apimachinery/pkg/util/errors"
2729
"k8s.io/apimachinery/pkg/util/uuid"
2830

2931
infrav1 "sigs.k8s.io/cluster-api-provider-aws/v2/api/v1beta2"
30-
"sigs.k8s.io/cluster-api-provider-aws/v2/pkg/cloud/awserrors"
3132
"sigs.k8s.io/cluster-api-provider-aws/v2/pkg/cloud/convertersv2"
3233
"sigs.k8s.io/cluster-api-provider-aws/v2/pkg/cloud/scope"
3334
"sigs.k8s.io/cluster-api-provider-aws/v2/pkg/cloud/services/wait"
@@ -93,11 +94,11 @@ func (s *Service) retryableCreateSecret(name string, chunk []byte, tags infrav1.
9394
Tags: convertersv2.MapToSecretsManagerTags(tags),
9495
})
9596
// If the secret already exists, delete it, return request to retry, as deletes are eventually consistent
96-
smithyErr := awserrors.ParseSmithyError(err)
97-
if smithyErr != nil && smithyErr.ErrorCode() == "ResourceExistsException" {
98-
return false, s.forceDeleteSecretEntry(name)
99-
}
10097
if err != nil {
98+
var aerr smithy.APIError
99+
if errors.As(err, &aerr) && aerr.ErrorCode() == "ResourceExistsException" {
100+
return false, s.forceDeleteSecretEntry(name)
101+
}
101102
return false, err
102103
}
103104
return true, err
@@ -109,9 +110,11 @@ func (s *Service) forceDeleteSecretEntry(name string) error {
109110
SecretId: aws.String(name),
110111
ForceDeleteWithoutRecovery: aws.Bool(true),
111112
})
112-
smithyErr := awserrors.ParseSmithyError(err)
113-
if smithyErr != nil && smithyErr.ErrorCode() == "ResourceNotFoundException" {
114-
return nil
113+
if err != nil {
114+
var aerr smithy.APIError
115+
if errors.As(err, &aerr) && aerr.ErrorCode() == "ResourceNotFoundException" {
116+
return nil
117+
}
115118
}
116119
return err
117120
}

pkg/cloud/services/secretsmanager/secret_test.go

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ import (
3434

3535
infrav1 "sigs.k8s.io/cluster-api-provider-aws/v2/api/v1beta2"
3636
"sigs.k8s.io/cluster-api-provider-aws/v2/pkg/cloud/scope"
37-
"sigs.k8s.io/cluster-api-provider-aws/v2/pkg/cloud/services/secretsmanager/mock_secretsmanageriface"
37+
"sigs.k8s.io/cluster-api-provider-aws/v2/test/mocks"
3838
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
3939
)
4040

@@ -89,15 +89,15 @@ func TestServiceCreate(t *testing.T) {
8989
secretPrefix string
9090
expectedPrefix string
9191
wantErr bool
92-
expect func(g *WithT, m *mock_secretsmanageriface.MockSecretsManagerAPIMockRecorder)
92+
expect func(g *WithT, m *mocks.MockSecretsManagerAPIMockRecorder)
9393
}{
9494
{
9595
name: "Should not store data in secret manager if data is having zero bytes",
9696
bytesCount: 0,
9797
secretPrefix: "/awsprefix",
9898
expectedPrefix: "/awsprefix",
9999
wantErr: false,
100-
expect: func(g *WithT, m *mock_secretsmanageriface.MockSecretsManagerAPIMockRecorder) {
100+
expect: func(g *WithT, m *mocks.MockSecretsManagerAPIMockRecorder) {
101101
m.CreateSecret(gomock.Any(), gomock.AssignableToTypeOf(&secretsmanager.CreateSecretInput{})).Times(0)
102102
},
103103
},
@@ -107,7 +107,7 @@ func TestServiceCreate(t *testing.T) {
107107
secretPrefix: "prefix",
108108
expectedPrefix: "prefix",
109109
wantErr: false,
110-
expect: func(g *WithT, m *mock_secretsmanageriface.MockSecretsManagerAPIMockRecorder) {
110+
expect: func(g *WithT, m *mocks.MockSecretsManagerAPIMockRecorder) {
111111
m.CreateSecret(gomock.Any(), gomock.AssignableToTypeOf(&secretsmanager.CreateSecretInput{})).MinTimes(1).Return(&secretsmanager.CreateSecretOutput{}, nil).Do(
112112
func(ctx context.Context, createSecretInput *secretsmanager.CreateSecretInput, optFns ...func(*secretsmanager.Options)) {
113113
g.Expect(*(createSecretInput.Name)).To(HavePrefix("prefix-"))
@@ -123,7 +123,7 @@ func TestServiceCreate(t *testing.T) {
123123
secretPrefix: "/prefix",
124124
expectedPrefix: "/prefix",
125125
wantErr: true,
126-
expect: func(g *WithT, m *mock_secretsmanageriface.MockSecretsManagerAPIMockRecorder) {
126+
expect: func(g *WithT, m *mocks.MockSecretsManagerAPIMockRecorder) {
127127
m.CreateSecret(gomock.Any(), gomock.AssignableToTypeOf(&secretsmanager.CreateSecretInput{})).Return(nil, &types.InternalServiceError{}).Do(
128128
func(ctx context.Context, createSecretInput *secretsmanager.CreateSecretInput, optFns ...func(*secretsmanager.Options)) {
129129
g.Expect(*(createSecretInput.Name)).To(HavePrefix("/prefix-"))
@@ -139,7 +139,7 @@ func TestServiceCreate(t *testing.T) {
139139
secretPrefix: "",
140140
expectedPrefix: "aws.cluster.x-k8s.io",
141141
wantErr: false,
142-
expect: func(g *WithT, m *mock_secretsmanageriface.MockSecretsManagerAPIMockRecorder) {
142+
expect: func(g *WithT, m *mocks.MockSecretsManagerAPIMockRecorder) {
143143
m.CreateSecret(gomock.Any(), gomock.AssignableToTypeOf(&secretsmanager.CreateSecretInput{})).Return(nil, &types.InvalidRequestException{})
144144
m.CreateSecret(gomock.Any(), gomock.AssignableToTypeOf(&secretsmanager.CreateSecretInput{})).Return(nil, &types.ResourceNotFoundException{})
145145
m.CreateSecret(gomock.Any(), gomock.AssignableToTypeOf(&secretsmanager.CreateSecretInput{})).Return(&secretsmanager.CreateSecretOutput{}, nil)
@@ -151,7 +151,7 @@ func TestServiceCreate(t *testing.T) {
151151
secretPrefix: "",
152152
expectedPrefix: "aws.cluster.x-k8s.io",
153153
wantErr: false,
154-
expect: func(g *WithT, m *mock_secretsmanageriface.MockSecretsManagerAPIMockRecorder) {
154+
expect: func(g *WithT, m *mocks.MockSecretsManagerAPIMockRecorder) {
155155
m.CreateSecret(gomock.Any(), gomock.AssignableToTypeOf(&secretsmanager.CreateSecretInput{})).Return(nil, &types.ResourceExistsException{})
156156
m.DeleteSecret(gomock.Any(), gomock.AssignableToTypeOf(&secretsmanager.DeleteSecretInput{})).Return(&secretsmanager.DeleteSecretOutput{}, nil)
157157
m.CreateSecret(gomock.Any(), gomock.AssignableToTypeOf(&secretsmanager.CreateSecretInput{})).Return(&secretsmanager.CreateSecretOutput{}, nil)
@@ -167,7 +167,7 @@ func TestServiceCreate(t *testing.T) {
167167
clusterScope, err := getClusterScope(client)
168168
g.Expect(err).NotTo(HaveOccurred())
169169

170-
secretManagerClientMock := mock_secretsmanageriface.NewMockSecretsManagerAPI(mockCtrl)
170+
secretManagerClientMock := mocks.NewMockSecretsManagerAPI(mockCtrl)
171171
tt.expect(g, secretManagerClientMock.EXPECT())
172172
s := NewService(clusterScope)
173173
s.SecretsManagerClient = secretManagerClientMock
@@ -189,7 +189,7 @@ func TestServiceDelete(t *testing.T) {
189189
tests := []struct {
190190
name string
191191
secretCount int32
192-
expect func(m *mock_secretsmanageriface.MockSecretsManagerAPIMockRecorder)
192+
expect func(m *mocks.MockSecretsManagerAPIMockRecorder)
193193
check func(*WithT, error)
194194
}{
195195
{
@@ -202,7 +202,7 @@ func TestServiceDelete(t *testing.T) {
202202
{
203203
name: "Should not return error when delete is successful",
204204
secretCount: 1,
205-
expect: func(m *mock_secretsmanageriface.MockSecretsManagerAPIMockRecorder) {
205+
expect: func(m *mocks.MockSecretsManagerAPIMockRecorder) {
206206
m.DeleteSecret(gomock.Any(), gomock.Eq(&secretsmanager.DeleteSecretInput{
207207
SecretId: aws.String("prefix-0"),
208208
ForceDeleteWithoutRecovery: aws.Bool(true),
@@ -215,7 +215,7 @@ func TestServiceDelete(t *testing.T) {
215215
{
216216
name: "Should return all errors except not found errors",
217217
secretCount: 3,
218-
expect: func(m *mock_secretsmanageriface.MockSecretsManagerAPIMockRecorder) {
218+
expect: func(m *mocks.MockSecretsManagerAPIMockRecorder) {
219219
m.DeleteSecret(gomock.Any(), gomock.Eq(&secretsmanager.DeleteSecretInput{
220220
SecretId: aws.String("prefix-0"),
221221
ForceDeleteWithoutRecovery: aws.Bool(true),
@@ -242,7 +242,7 @@ func TestServiceDelete(t *testing.T) {
242242
clusterScope, err := getClusterScope(client)
243243
g.Expect(err).NotTo(HaveOccurred())
244244

245-
secretManagerClientMock := mock_secretsmanageriface.NewMockSecretsManagerAPI(mockCtrl)
245+
secretManagerClientMock := mocks.NewMockSecretsManagerAPI(mockCtrl)
246246
if tt.expect != nil {
247247
tt.expect(secretManagerClientMock.EXPECT())
248248
}
Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/mocks/generate_aws.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,6 @@ limitations under the License.
2424
//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"
2525
//go:generate ../../hack/tools/bin/mockgen -destination aws_ec2api_mock.go -package mocks sigs.k8s.io/cluster-api-provider-aws/v2/pkg/cloud/services/common EC2API
2626
//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"
27+
//go:generate ../../hack/tools/bin/mockgen -destination aws_secretsmanager_mock.go -package mocks sigs.k8s.io/cluster-api-provider-aws/v2/pkg/cloud/services/secretsmanager SecretsManagerAPI
28+
//go:generate /usr/bin/env bash -c "cat ../../hack/boilerplate/boilerplate.generatego.txt aws_secretsmanager_mock.go > _aws_secretsmanager_mock.go && mv _aws_secretsmanager_mock.go aws_secretsmanager_mock.go"
2729
package mocks

0 commit comments

Comments
 (0)