diff --git a/internal/pkg/addon/addons.go b/internal/pkg/addon/addons.go index 308e97629d3..b40f490182a 100644 --- a/internal/pkg/addon/addons.go +++ b/internal/pkg/addon/addons.go @@ -37,9 +37,9 @@ type workspaceReader interface { // Stack represents a CloudFormation stack. type Stack struct { - template *cfnTemplate - parameters yaml.Node - wlName string + template *cfnTemplate + parameters yaml.Node + workloadName string } // Parse parses the 'addon/' directory for the given workload @@ -66,8 +66,9 @@ func Parse(workloadName string, ws workspaceReader) (*Stack, error) { } return &Stack{ - template: template, - parameters: params, + template: template, + parameters: params, + workloadName: workloadName, }, nil } diff --git a/internal/pkg/addon/package.go b/internal/pkg/addon/package.go index e508e782082..a213e508e32 100644 --- a/internal/pkg/addon/package.go +++ b/internal/pkg/addon/package.go @@ -197,13 +197,13 @@ type PackageConfig struct { WorkspacePath string FS afero.Fs - wlName string + workloadName string } // Package finds references to local files in Stack's template, uploads // the files to S3, and replaces the file path with the S3 location. func (s *Stack) Package(cfg PackageConfig) error { - cfg.wlName = s.wlName + cfg.workloadName = s.workloadName err := cfg.packageIncludeTransforms(&s.template.Metadata, &s.template.Mappings, &s.template.Conditions, &s.template.Transform, &s.template.Resources, &s.template.Outputs) if err != nil { @@ -363,7 +363,7 @@ func (p *PackageConfig) uploadAddonAsset(assetPath string, forceZip bool) (templ return template.S3ObjectLocation{}, fmt.Errorf("create asset: %w", err) } - s3Path := artifactpath.AddonAsset(p.wlName, asset.hash) + s3Path := artifactpath.AddonAsset(p.workloadName, asset.hash) url, err := p.Uploader.Upload(p.Bucket, s3Path, asset.data) if err != nil { return template.S3ObjectLocation{}, fmt.Errorf("upload %s to s3 bucket %s: %w", assetPath, p.Bucket, err) diff --git a/internal/pkg/addon/package_test.go b/internal/pkg/addon/package_test.go index d791754d369..309b51e612e 100644 --- a/internal/pkg/addon/package_test.go +++ b/internal/pkg/addon/package_test.go @@ -397,8 +397,8 @@ Resources: } stack := &Stack{ - wlName: wlName, - template: newCFNTemplate("merged"), + workloadName: wlName, + template: newCFNTemplate("merged"), } require.NoError(t, yaml.Unmarshal([]byte(tc.inTemplate), stack.template)) diff --git a/internal/pkg/cli/deploy/svc.go b/internal/pkg/cli/deploy/svc.go index b939baa31a7..553430974dd 100644 --- a/internal/pkg/cli/deploy/svc.go +++ b/internal/pkg/cli/deploy/svc.go @@ -973,16 +973,14 @@ func (d *workloadDeployer) pushAddonsTemplateToS3Bucket() (string, error) { return "", nil } - if false { // TODO remove to enable packaging addons - config := addon.PackageConfig{ - Bucket: d.resources.S3Bucket, - Uploader: d.s3Client, - WorkspacePath: d.workspacePath, - FS: afero.NewOsFs(), - } - if err := d.addons.Package(config); err != nil { - return "", fmt.Errorf("package addons: %w", err) - } + config := addon.PackageConfig{ + Bucket: d.resources.S3Bucket, + Uploader: d.s3Client, + WorkspacePath: d.workspacePath, + FS: afero.NewOsFs(), + } + if err := d.addons.Package(config); err != nil { + return "", fmt.Errorf("package addons: %w", err) } tmpl, err := d.addons.Template() diff --git a/internal/pkg/cli/deploy/svc_test.go b/internal/pkg/cli/deploy/svc_test.go index 6355b208383..c496885dce3 100644 --- a/internal/pkg/cli/deploy/svc_test.go +++ b/internal/pkg/cli/deploy/svc_test.go @@ -328,6 +328,7 @@ func TestWorkloadDeployer_UploadArtifacts(t *testing.T) { m.mockFileReader.EXPECT().ReadFile(filepath.Join(mockWorkspacePath, mockEnvFile)).Return([]byte{}, nil) m.mockUploader.EXPECT().Upload(mockS3Bucket, mockEnvFilePath, gomock.Any()). Return(mockEnvFileS3URL, nil) + m.mockAddons.EXPECT().Package(gomock.Any()).Return(nil) m.mockAddons.EXPECT().Template().Return("some data", nil) m.mockUploader.EXPECT().Upload(mockS3Bucket, mockAddonPath, gomock.Any()). Return(mockAddonsS3URL, nil) @@ -339,6 +340,7 @@ func TestWorkloadDeployer_UploadArtifacts(t *testing.T) { "should return error if fail to upload to S3 bucket": { inRegion: "us-west-2", mock: func(t *testing.T, m *deployMocks) { + m.mockAddons.EXPECT().Package(gomock.Any()).Return(nil) m.mockAddons.EXPECT().Template().Return("some data", nil) m.mockUploader.EXPECT().Upload(mockS3Bucket, mockAddonPath, gomock.Any()). Return("", mockError) @@ -351,8 +353,15 @@ func TestWorkloadDeployer_UploadArtifacts(t *testing.T) { m.mockAddons = nil }, }, - "should fail if addons cannot be retrieved from workspace": { + "should fail if packaging addons fails": { mock: func(t *testing.T, m *deployMocks) { + m.mockAddons.EXPECT().Package(gomock.Any()).Return(mockError) + }, + wantErr: fmt.Errorf("package addons: %w", mockError), + }, + "should fail if addons template can't be created": { + mock: func(t *testing.T, m *deployMocks) { + m.mockAddons.EXPECT().Package(gomock.Any()).Return(nil) m.mockAddons.EXPECT().Template().Return("", mockError) }, wantErr: fmt.Errorf("retrieve addons template: %w", mockError), diff --git a/internal/pkg/deploy/cloudformation/stack/validate_template_integration_test.go b/internal/pkg/deploy/cloudformation/stack/validate_template_integration_test.go index 67a720788ac..49cf510b8ef 100644 --- a/internal/pkg/deploy/cloudformation/stack/validate_template_integration_test.go +++ b/internal/pkg/deploy/cloudformation/stack/validate_template_integration_test.go @@ -17,6 +17,7 @@ import ( "github.com/aws/copilot-cli/internal/pkg/config" "github.com/aws/copilot-cli/internal/pkg/deploy/cloudformation/stack" "github.com/aws/copilot-cli/internal/pkg/manifest" + "github.com/aws/copilot-cli/internal/pkg/workspace" "github.com/stretchr/testify/require" ) @@ -30,9 +31,13 @@ func TestAutoscalingIntegration_Validate(t *testing.T) { v, ok := content.(*manifest.LoadBalancedWebService) require.Equal(t, ok, true) - addons, err := addon.New(aws.StringValue(v.Name)) + ws, err := workspace.New() require.NoError(t, err) + _, err = addon.Parse(aws.StringValue(v.Name), ws) + var notFound *addon.ErrAddonsNotFound + require.ErrorAs(t, err, ¬Found) + serializer, err := stack.NewLoadBalancedWebService(stack.LoadBalancedWebServiceConfig{ App: &config.Application{Name: appName}, EnvManifest: &manifest.Environment{ @@ -53,7 +58,6 @@ func TestAutoscalingIntegration_Validate(t *testing.T) { "RulePriorityFunction": "https://my-bucket.s3.us-west-2.amazonaws.com/code.zip", }, }, - Addons: addons, }) require.NoError(t, err) tpl, err := serializer.Template() @@ -80,9 +84,13 @@ func TestScheduledJob_Validate(t *testing.T) { v, ok := content.(*manifest.ScheduledJob) require.True(t, ok) - addons, err := addon.New(aws.StringValue(v.Name)) + ws, err := workspace.New() require.NoError(t, err) + _, err = addon.Parse(aws.StringValue(v.Name), ws) + var notFound *addon.ErrAddonsNotFound + require.ErrorAs(t, err, ¬Found) + serializer, err := stack.NewScheduledJob(stack.ScheduledJobConfig{ App: appName, Env: envName, @@ -93,7 +101,6 @@ func TestScheduledJob_Validate(t *testing.T) { "EnvControllerFunction": "https://my-bucket.s3.us-west-2.amazonaws.com/code.zip", }, }, - Addons: addons, }) tpl, err := serializer.Template()