Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
1ce1571
added env and port overrides
dannyrandall Aug 14, 2023
67b5d5d
Merge branch 'mainline' into chore/run-env-override
dannyrandall Aug 16, 2023
767f330
saving some changes
dannyrandall Aug 16, 2023
95f98dd
move env var logic to `cli`, apply overrides
dannyrandall Aug 16, 2023
d4b5fbe
fix build
dannyrandall Aug 16, 2023
9f4f467
add ssm/secretsmanager tests
dannyrandall Aug 16, 2023
3afcc4c
test just for getting env vars
dannyrandall Aug 16, 2023
e6d2a88
docs, finish tests
dannyrandall Aug 17, 2023
ee93b08
fix port overrides and add tests
dannyrandall Aug 17, 2023
e19fa9a
update var flag
dannyrandall Aug 17, 2023
3044397
merge mainline; reverts #5197 as i resolved the failing tests
dannyrandall Aug 17, 2023
b67af29
fix race in getting secrets, fix staticcheck
dannyrandall Aug 17, 2023
d27be19
add back fix
dannyrandall Aug 17, 2023
a78a0da
remove unnecessary loopvar redef
dannyrandall Aug 18, 2023
c4c7218
fb from @iamhopaul123: fill env vars before overrides
dannyrandall Aug 18, 2023
50e33d3
fb from @iamhopaul123: `portOverride` type
dannyrandall Aug 18, 2023
3fb51ca
don't allow secrets to redefine env vars
dannyrandall Aug 18, 2023
b687c9b
took me WAY to long to find this bug
dannyrandall Aug 18, 2023
0ee513c
move port override parsing logic to flag value
dannyrandall Aug 21, 2023
f390228
Merge branch 'mainline' into chore/run-env-override
dannyrandall Aug 21, 2023
7e83af9
add license
dannyrandall Aug 22, 2023
ce93590
remove commented out code
dannyrandall Aug 22, 2023
cf31861
fb from @Lou1415926: nits
dannyrandall Aug 22, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 17 additions & 10 deletions internal/pkg/aws/secretsmanager/mocks/mock_secretsmanager.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

13 changes: 6 additions & 7 deletions internal/pkg/aws/secretsmanager/secretsmanager.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,24 +5,23 @@
package secretsmanager

import (
"context"
"fmt"
"time"

"github.com/aws/aws-sdk-go/aws/request"
"github.com/aws/aws-sdk-go/aws/session"

"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/awserr"
"github.com/aws/aws-sdk-go/service/secretsmanager"
)

// Namespace represents the AWS Secrets Manager service namespace.
const Namespace = "secretsmanager"

type api interface {
CreateSecret(*secretsmanager.CreateSecretInput) (*secretsmanager.CreateSecretOutput, error)
DeleteSecret(*secretsmanager.DeleteSecretInput) (*secretsmanager.DeleteSecretOutput, error)
DescribeSecret(input *secretsmanager.DescribeSecretInput) (*secretsmanager.DescribeSecretOutput, error)
GetSecretValue(input *secretsmanager.GetSecretValueInput) (*secretsmanager.GetSecretValueOutput, error)
DescribeSecret(*secretsmanager.DescribeSecretInput) (*secretsmanager.DescribeSecretOutput, error)
GetSecretValueWithContext(context.Context, *secretsmanager.GetSecretValueInput, ...request.Option) (*secretsmanager.GetSecretValueOutput, error)
}

// SecretsManager wraps the AWS SecretManager client.
Expand Down Expand Up @@ -120,8 +119,8 @@ func (s *SecretsManager) DescribeSecret(secretName string) (*DescribeSecretOutpu

// GetSecretValue retrieves the value of a secret from AWS Secrets Manager.
// It takes the name of the secret as input and returns the corresponding value as a string.
func (s *SecretsManager) GetSecretValue(name string) (string, error) {
resp, err := s.secretsManager.GetSecretValue(&secretsmanager.GetSecretValueInput{
func (s *SecretsManager) GetSecretValue(ctx context.Context, name string) (string, error) {
resp, err := s.secretsManager.GetSecretValueWithContext(ctx, &secretsmanager.GetSecretValueInput{
SecretId: aws.String(name),
})
if err != nil {
Expand Down
55 changes: 53 additions & 2 deletions internal/pkg/aws/secretsmanager/secretsmanager_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,17 @@
package secretsmanager

import (
"context"
"errors"
"fmt"
"github.com/aws/aws-sdk-go/service/secretsmanager"
"testing"
"time"

"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/awserr"
"github.com/aws/aws-sdk-go/service/secretsmanager"
"github.com/aws/copilot-cli/internal/pkg/aws/secretsmanager/mocks"
"github.com/golang/mock/gomock"

"github.com/stretchr/testify/require"
)

Expand Down Expand Up @@ -251,3 +251,54 @@ func TestSecretsManager_DescribeSecret(t *testing.T) {
})
}
}

func TestSecretsManager_GetSecretValue(t *testing.T) {
tests := map[string]struct {
secretName string
setupMock func(m *mocks.Mockapi)

want string
wantError string
}{
"error": {
secretName: "asdf",
setupMock: func(m *mocks.Mockapi) {
m.EXPECT().GetSecretValueWithContext(gomock.Any(), &secretsmanager.GetSecretValueInput{
SecretId: aws.String("asdf"),
}).Return(nil, errors.New("some error"))
},
wantError: `get secret "asdf" from secrets manager: some error`,
},
"success": {
secretName: "asdf",
setupMock: func(m *mocks.Mockapi) {
m.EXPECT().GetSecretValueWithContext(gomock.Any(), &secretsmanager.GetSecretValueInput{
SecretId: aws.String("asdf"),
}).Return(&secretsmanager.GetSecretValueOutput{
SecretString: aws.String("hi"),
}, nil)
},
want: "hi",
},
}

for name, tc := range tests {
t.Run(name, func(t *testing.T) {
ctrl := gomock.NewController(t)
defer ctrl.Finish()

api := mocks.NewMockapi(ctrl)
tc.setupMock(api)

sm := SecretsManager{
secretsManager: api,
}

got, err := sm.GetSecretValue(context.Background(), tc.secretName)
if tc.wantError != "" {
require.EqualError(t, err, tc.wantError)
}
require.Equal(t, tc.want, got)
})
}
}
35 changes: 21 additions & 14 deletions internal/pkg/aws/ssm/mocks/mock_ssm.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

15 changes: 7 additions & 8 deletions internal/pkg/aws/ssm/ssm.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,24 +5,23 @@
package ssm

import (
"context"
"errors"
"fmt"
"sort"

"github.com/aws/aws-sdk-go/aws/awserr"
"github.com/aws/aws-sdk-go/aws/request"

"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/ssm"
)

// Namespace represents the AWS Systems Manager(SSM) service namespace.
const Namespace = "ssm"

type api interface {
PutParameter(input *ssm.PutParameterInput) (*ssm.PutParameterOutput, error)
AddTagsToResource(input *ssm.AddTagsToResourceInput) (*ssm.AddTagsToResourceOutput, error)
GetParameter(input *ssm.GetParameterInput) (*ssm.GetParameterOutput, error)
PutParameter(*ssm.PutParameterInput) (*ssm.PutParameterOutput, error)
AddTagsToResource(*ssm.AddTagsToResourceInput) (*ssm.AddTagsToResourceOutput, error)
GetParameterWithContext(context.Context, *ssm.GetParameterInput, ...request.Option) (*ssm.GetParameterOutput, error)
}

// SSM wraps an AWS SSM client.
Expand Down Expand Up @@ -67,8 +66,8 @@ func (s *SSM) PutSecret(in PutSecretInput) (*PutSecretOutput, error) {

// GetSecretValue retrieves the value of a parameter from AWS Systems Manager Parameter Store.
// It takes the name of the parameter as input and returns the corresponding value as a string.
func (s *SSM) GetSecretValue(name string) (string, error) {
resp, err := s.client.GetParameter(&ssm.GetParameterInput{
func (s *SSM) GetSecretValue(ctx context.Context, name string) (string, error) {
resp, err := s.client.GetParameterWithContext(ctx, &ssm.GetParameterInput{
Name: aws.String(name),
WithDecryption: aws.Bool(true),
})
Expand Down
66 changes: 59 additions & 7 deletions internal/pkg/aws/ssm/ssm_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,21 +4,18 @@
package ssm

import (
"context"
"errors"
"fmt"
"testing"

"github.com/aws/aws-sdk-go/aws/awserr"

"github.com/stretchr/testify/require"

"github.com/aws/copilot-cli/internal/pkg/deploy"

"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/awserr"
"github.com/aws/aws-sdk-go/service/ssm"
"github.com/aws/copilot-cli/internal/pkg/aws/ssm/mocks"

"github.com/aws/copilot-cli/internal/pkg/deploy"
"github.com/golang/mock/gomock"
"github.com/stretchr/testify/require"
)

func TestSSM_PutSecret(t *testing.T) {
Expand Down Expand Up @@ -361,3 +358,58 @@ func TestSSM_PutSecret(t *testing.T) {
})
}
}

func TestSSM_GetSecretValue(t *testing.T) {
tests := map[string]struct {
secretName string
setupMock func(m *mocks.Mockapi)

want string
wantError string
}{
"error": {
secretName: "asdf",
setupMock: func(m *mocks.Mockapi) {
m.EXPECT().GetParameterWithContext(gomock.Any(), &ssm.GetParameterInput{
Name: aws.String("asdf"),
WithDecryption: aws.Bool(true),
}).Return(nil, errors.New("some error"))
},
wantError: `get parameter "asdf" from SSM: some error`,
},
"success": {
secretName: "asdf",
setupMock: func(m *mocks.Mockapi) {
m.EXPECT().GetParameterWithContext(gomock.Any(), &ssm.GetParameterInput{
Name: aws.String("asdf"),
WithDecryption: aws.Bool(true),
}).Return(&ssm.GetParameterOutput{
Parameter: &ssm.Parameter{
Value: aws.String("hi"),
},
}, nil)
},
want: "hi",
},
}

for name, tc := range tests {
t.Run(name, func(t *testing.T) {
ctrl := gomock.NewController(t)
defer ctrl.Finish()

api := mocks.NewMockapi(ctrl)
tc.setupMock(api)

ssm := SSM{
client: api,
}

got, err := ssm.GetSecretValue(context.Background(), tc.secretName)
if tc.wantError != "" {
require.EqualError(t, err, tc.wantError)
}
require.Equal(t, tc.want, got)
})
}
}
Loading