From c406494ee38bc92b0e7463773fc9baa7d5416345 Mon Sep 17 00:00:00 2001 From: Valentin Zlydnev Date: Thu, 8 Dec 2022 19:52:27 +0400 Subject: [PATCH 1/3] Add one more option for autoresolvoing bucket name --- README.md | 3 +++ src/index.ts | 6 ++++++ src/serverless-s3-cleaner-config.ts | 6 ++++++ 3 files changed, 15 insertions(+) diff --git a/README.md b/README.md index ab36dd8..c6bb93e 100644 --- a/README.md +++ b/README.md @@ -45,6 +45,9 @@ custom: # (optional) Buckets to remove before a stack is deployed. bucketsToCleanOnDeploy: - oldBucketName + + # (optional) Get deployment bucket name from AWS. Works only for `sls s3remove` and `sls remove` + autoResolve: false ``` When removing a Serverless Framework stack, this plugin automatically empties the buckets listed under `buckets` option. diff --git a/src/index.ts b/src/index.ts index b590b87..8cbcb5c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -28,6 +28,7 @@ export default class ServerlessS3Cleaner implements Plugin { bucketsToCleanOnDeploy: { type: 'array', uniqueItems: true, items: { type: 'string' }, nullable: true }, + autoResolve: { type: 'boolean', nullable: true, default: false }, }, additionalProperties: false, anyOf: [ @@ -67,6 +68,10 @@ export default class ServerlessS3Cleaner implements Plugin { const config = this.loadConfig(); let bucketsToEmpty = isDeploying ? config.bucketsToCleanOnDeploy : config.buckets; + if (!isDeploying && config.autoResolve) { + bucketsToEmpty.push(await this.provider.getServerlessDeploymentBucketName()); + } + if (config.prompt) { prompt.start(); const bucketPromptResults = await prompt.get(bucketsToEmpty.map(bucket => ({ @@ -177,6 +182,7 @@ export default class ServerlessS3Cleaner implements Plugin { buckets: providedConfig.buckets || [], prompt: providedConfig.prompt || false, bucketsToCleanOnDeploy: providedConfig.bucketsToCleanOnDeploy || [], + autoResolve: providedConfig.autoResolve || false, }; } } diff --git a/src/serverless-s3-cleaner-config.ts b/src/serverless-s3-cleaner-config.ts index 71f1634..2afeddd 100644 --- a/src/serverless-s3-cleaner-config.ts +++ b/src/serverless-s3-cleaner-config.ts @@ -15,4 +15,10 @@ interface ServerlessS3CleanerConfig { * (and can be removed later once the stack has been upgraded). */ bucketsToCleanOnDeploy?: string[]; + + /** + * Resolve deployment bucket name from AWS. Utilize `serverless.provider.getServerlessDeploymentBucketName`. + * Use this flag in case for CI/CD deploying and removing feature stack and so on. + */ + autoResolve?: boolean; } From aa35e886108871fec5e9bc3504cb6744465b1b23 Mon Sep 17 00:00:00 2001 From: Valentin Zlydnev Date: Thu, 8 Dec 2022 20:12:36 +0400 Subject: [PATCH 2/3] Update tests --- test/index.spec.ts | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/test/index.spec.ts b/test/index.spec.ts index a8953ff..120c58a 100644 --- a/test/index.spec.ts +++ b/test/index.spec.ts @@ -1,5 +1,6 @@ /* eslint-disable @typescript-eslint/no-use-before-define */ import { DeleteObjectsOutput, DeleteObjectsRequest, ListObjectVersionsOutput, ObjectIdentifier } from 'aws-sdk/clients/s3'; +import { DescribeStackResourceOutput } from 'aws-sdk/clients/cloudformation'; import prompt from 'prompt'; import Serverless from 'serverless'; import { Logging } from 'serverless/classes/Plugin'; @@ -259,6 +260,26 @@ describe('ServerlessS3Cleaner', () => { Bucket: 'b2' })); }); + + it('should call getServerlessDeploymentBucketName if autoResolve option is true', async () => { + const { requestSpy, serverless } = stubServerlessInstance({ + buckets: ['b1', 'b2'], + autoResolve: true, + }); + const logging = stubLogging(); + const plugin = new ServerlessS3Cleaner(serverless, {}, logging); + + requestSpy.withArgs('CloudFormation', 'describeStackResource', jasmine.anything()).and.resolveTo({ + StackResourceDetail: { + PhysicalResourceId: 'service-name-stage-serverlessdeploymentbucket-gqzu7wcwjth', + } + } as DescribeStackResourceOutput); + + const removeFn = plugin.hooks['before:remove:remove']; + await expectAsync(removeFn()).toBeResolved(); + + expect(requestSpy).toHaveBeenCalled(); + }); }); describe('when executing s3remove command', () => { @@ -357,7 +378,8 @@ describe('ServerlessS3Cleaner', () => { requestSpy, serverless: jasmine.createSpyObj({ getProvider: ({ - request: requestSpy + request: requestSpy, + getServerlessDeploymentBucketName: requestSpy, }) as unknown as Aws, }, { cli: jasmine.createSpyObj(['log']), From 8c3059ec696e630b889502f3395491aaef24c1cf Mon Sep 17 00:00:00 2001 From: Valentin Zlydnev Date: Fri, 9 Dec 2022 13:03:55 +0400 Subject: [PATCH 3/3] Update version. add functionality in a backwards compatible manner --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 068ab7c..aa21d8c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "serverless-s3-cleaner", - "version": "2.0.2", + "version": "2.1.0", "description": "Serverless Framework plugin that empties S3 buckets before removing a stack", "main": "dist/index.js", "scripts": {