diff --git a/deploy/googleDeploy.js b/deploy/googleDeploy.js index 384979f..3a1c2aa 100644 --- a/deploy/googleDeploy.js +++ b/deploy/googleDeploy.js @@ -4,6 +4,7 @@ const BbPromise = require('bluebird'); const validate = require('../shared/validate'); const utils = require('../shared/utils'); +const setDeploymentBucketName = require('../shared/setDeploymentBucketName'); const prepareDeployment = require('./lib/prepareDeployment'); const createDeployment = require('./lib/createDeployment'); const monitorDeployment = require('../shared/monitorDeployment'); @@ -24,6 +25,7 @@ class GoogleDeploy { this, validate, utils, + setDeploymentBucketName, prepareDeployment, createDeployment, monitorDeployment, @@ -40,6 +42,7 @@ class GoogleDeploy { .then(this.setDefaults), 'deploy:initialize': () => BbPromise.bind(this) + .then(this.setDeploymentBucketName) .then(this.prepareDeployment), 'deploy:setupProviderConfiguration': () => BbPromise.bind(this) diff --git a/deploy/googleDeploy.test.js b/deploy/googleDeploy.test.js index 7ef3ae9..c102208 100644 --- a/deploy/googleDeploy.test.js +++ b/deploy/googleDeploy.test.js @@ -38,6 +38,7 @@ describe('GoogleDeploy', () => { describe('hooks', () => { let validateStub; let setDefaultsStub; + let setDeploymentBucketNameStub; let prepareDeploymentStub; let createDeploymentStub; let generateArtifactDirectoryNameStub; @@ -52,6 +53,8 @@ describe('GoogleDeploy', () => { .returns(BbPromise.resolve()); setDefaultsStub = sinon.stub(googleDeploy, 'setDefaults') .returns(BbPromise.resolve()); + setDeploymentBucketNameStub = sinon.stub(googleDeploy, 'setDeploymentBucketName') + .returns(BbPromise.resolve()); prepareDeploymentStub = sinon.stub(googleDeploy, 'prepareDeployment') .returns(BbPromise.resolve()); createDeploymentStub = sinon.stub(googleDeploy, 'createDeployment') @@ -74,6 +77,7 @@ describe('GoogleDeploy', () => { afterEach(() => { googleDeploy.validate.restore(); googleDeploy.setDefaults.restore(); + googleDeploy.setDeploymentBucketName.restore(); googleDeploy.prepareDeployment.restore(); googleDeploy.createDeployment.restore(); googleDeploy.generateArtifactDirectoryName.restore(); @@ -92,7 +96,8 @@ describe('GoogleDeploy', () => { it('should run "deploy:initialize" promise chain', () => googleDeploy .hooks['deploy:initialize']().then(() => { - expect(prepareDeploymentStub.calledOnce).toEqual(true); + expect(setDeploymentBucketNameStub.calledOnce).toEqual(true); + expect(prepareDeploymentStub.calledAfter(setDeploymentBucketNameStub)).toEqual(true); })); it('it should run "deploy:setupProviderConfiguration" promise chain', () => googleDeploy diff --git a/deploy/lib/cleanupDeploymentBucket.js b/deploy/lib/cleanupDeploymentBucket.js index f8656ab..6d399d7 100644 --- a/deploy/lib/cleanupDeploymentBucket.js +++ b/deploy/lib/cleanupDeploymentBucket.js @@ -12,7 +12,7 @@ module.exports = { getObjectsToRemove() { const params = { - bucket: `sls-${this.serverless.service.service}-${this.options.stage}`, + bucket: this.serverless.service.provider.deploymentBucketName, }; return this.provider.request('storage', 'objects', 'list', params) diff --git a/deploy/lib/cleanupDeploymentBucket.test.js b/deploy/lib/cleanupDeploymentBucket.test.js index 4fe855d..cf30a0b 100644 --- a/deploy/lib/cleanupDeploymentBucket.test.js +++ b/deploy/lib/cleanupDeploymentBucket.test.js @@ -16,6 +16,9 @@ describe('CleanupDeploymentBucket', () => { serverless = new Serverless(); serverless.service = { service: 'my-service', + provider: { + deploymentBucketName: 'sls-my-service-dev-12345678', + }, }; serverless.setProvider('google', new GoogleProvider(serverless)); const options = { @@ -64,27 +67,27 @@ describe('CleanupDeploymentBucket', () => { const response = { items: [ { - bucket: 'sls-my-service-dev', + bucket: 'sls-my-service-dev-12345678', name: `${key}/151224711231-2016-08-18T15:42:00/artifact.zip`, }, { - bucket: 'sls-my-service-dev', + bucket: 'sls-my-service-dev-12345678', name: `${key}/141264711231-2016-08-18T15:43:00/artifact.zip`, }, { - bucket: 'sls-my-service-dev', + bucket: 'sls-my-service-dev-12345678', name: `${key}/141321321541-2016-08-18T11:23:02/artifact.zip`, }, { - bucket: 'sls-my-service-dev', + bucket: 'sls-my-service-dev-12345678', name: `${key}/142003031341-2016-08-18T12:46:04/artifact.zip`, }, { - bucket: 'sls-my-service-dev', + bucket: 'sls-my-service-dev-12345678', name: `${key}/113304333331-2016-08-18T13:40:06/artifact.zip`, }, { - bucket: 'sls-my-service-dev', + bucket: 'sls-my-service-dev-12345678', name: `${key}/903940390431-2016-08-18T23:42:08/artifact.zip`, }, ], @@ -94,19 +97,19 @@ describe('CleanupDeploymentBucket', () => { return googleDeploy.getObjectsToRemove().then((objects) => { expect(objects.length).toEqual(2); expect(objects).not.toContainEqual({ - bucket: 'sls-my-service-dev', + bucket: 'sls-my-service-dev-12345678', name: `${key}/141321321541-2016-08-18T11:23:02/artifact.zip`, }); expect(objects).not.toContainEqual({ - bucket: 'sls-my-service-dev', + bucket: 'sls-my-service-dev-12345678', name: `${key}/142003031341-2016-08-18T12:46:04/artifact.zip`, }); expect(objects).not.toContainEqual({ - bucket: 'sls-my-service-dev', + bucket: 'sls-my-service-dev-12345678', name: `${key}/151224711231-2016-08-18T15:42:00/artifact.zip`, }); expect(objects).not.toContainEqual({ - bucket: 'sls-my-service-dev', + bucket: 'sls-my-service-dev-12345678', name: `${key}/903940390431-2016-08-18T23:42:08/artifact.zip`, }); expect(requestStub.calledWithExactly( @@ -114,7 +117,7 @@ describe('CleanupDeploymentBucket', () => { 'objects', 'list', { - bucket: 'sls-my-service-dev', + bucket: 'sls-my-service-dev-12345678', })).toEqual(true); }); }); @@ -123,19 +126,19 @@ describe('CleanupDeploymentBucket', () => { const response = { items: [ { - bucket: 'sls-my-service-dev', + bucket: 'sls-my-service-dev-12345678', name: `${key}/151224711231-2016-08-18T15:42:00/artifact.zip`, }, { - bucket: 'sls-my-service-dev', + bucket: 'sls-my-service-dev-12345678', name: `${key}/141264711231-2016-08-18T15:43:00/artifact.zip`, }, { - bucket: 'sls-my-service-dev', + bucket: 'sls-my-service-dev-12345678', name: `${key}/141321321541-2016-08-18T11:23:02/artifact.zip`, }, { - bucket: 'sls-my-service-dev', + bucket: 'sls-my-service-dev-12345678', name: `${key}/142003031341-2016-08-18T12:46:04/artifact.zip`, }, ], @@ -150,7 +153,7 @@ describe('CleanupDeploymentBucket', () => { 'objects', 'list', { - bucket: 'sls-my-service-dev', + bucket: 'sls-my-service-dev-12345678', })).toEqual(true); }); }); @@ -169,7 +172,7 @@ describe('CleanupDeploymentBucket', () => { 'objects', 'list', { - bucket: 'sls-my-service-dev', + bucket: 'sls-my-service-dev-12345678', })).toEqual(true); }); }); @@ -201,19 +204,19 @@ describe('CleanupDeploymentBucket', () => { it('should remove all given objects', () => { const objectsToRemove = [ { - bucket: 'sls-my-service-dev', + bucket: 'sls-my-service-dev-12345678', name: `${key}/151224711231-2016-08-18T15:42:00/artifact.zip`, }, { - bucket: 'sls-my-service-dev', + bucket: 'sls-my-service-dev-12345678', name: `${key}/141264711231-2016-08-18T15:43:00/artifact.zip`, }, { - bucket: 'sls-my-service-dev', + bucket: 'sls-my-service-dev-12345678', name: `${key}/141321321541-2016-08-18T11:23:02/artifact.zip`, }, { - bucket: 'sls-my-service-dev', + bucket: 'sls-my-service-dev-12345678', name: `${key}/142003031341-2016-08-18T12:46:04/artifact.zip`, }, ]; diff --git a/deploy/lib/compileFunctions.js b/deploy/lib/compileFunctions.js index 031db0d..54333ad 100644 --- a/deploy/lib/compileFunctions.js +++ b/deploy/lib/compileFunctions.js @@ -27,9 +27,9 @@ module.exports = { const funcTemplate = getFunctionTemplate( funcObject, this.options.region, - `gs://sls-${ - this.serverless.service.service - }-${this.options.stage}/${this.serverless.service.package.artifactFilePath}`); + `gs://${ + this.serverless.service.provider.deploymentBucketName + }/${this.serverless.service.package.artifactFilePath}`); funcTemplate.properties.availableMemoryMb = _.get(funcObject, 'memorySize') || _.get(this, 'serverless.service.provider.memorySize') diff --git a/deploy/lib/compileFunctions.test.js b/deploy/lib/compileFunctions.test.js index 880164a..7368174 100644 --- a/deploy/lib/compileFunctions.test.js +++ b/deploy/lib/compileFunctions.test.js @@ -22,6 +22,7 @@ describe('CompileFunctions', () => { compiledConfigurationTemplate: { resources: [], }, + deploymentBucketName: 'sls-my-service-dev-12345678', }; serverless.setProvider('google', new GoogleProvider(serverless)); const options = { @@ -115,7 +116,7 @@ describe('CompileFunctions', () => { function: 'func1', availableMemoryMb: 1024, timeout: '60s', - sourceArchiveUrl: 'gs://sls-my-service-dev/some-path/artifact.zip', + sourceArchiveUrl: 'gs://sls-my-service-dev-12345678/some-path/artifact.zip', httpsTrigger: { url: 'foo', }, @@ -148,7 +149,7 @@ describe('CompileFunctions', () => { function: 'func1', availableMemoryMb: 1024, timeout: '60s', - sourceArchiveUrl: 'gs://sls-my-service-dev/some-path/artifact.zip', + sourceArchiveUrl: 'gs://sls-my-service-dev-12345678/some-path/artifact.zip', httpsTrigger: { url: 'foo', }, @@ -181,7 +182,7 @@ describe('CompileFunctions', () => { function: 'func1', availableMemoryMb: 256, timeout: '120s', - sourceArchiveUrl: 'gs://sls-my-service-dev/some-path/artifact.zip', + sourceArchiveUrl: 'gs://sls-my-service-dev-12345678/some-path/artifact.zip', httpsTrigger: { url: 'foo', }, @@ -214,7 +215,7 @@ describe('CompileFunctions', () => { function: 'func1', availableMemoryMb: 256, timeout: '120s', - sourceArchiveUrl: 'gs://sls-my-service-dev/some-path/artifact.zip', + sourceArchiveUrl: 'gs://sls-my-service-dev-12345678/some-path/artifact.zip', httpsTrigger: { url: 'foo', }, @@ -246,7 +247,7 @@ describe('CompileFunctions', () => { function: 'func1', availableMemoryMb: 256, timeout: '60s', - sourceArchiveUrl: 'gs://sls-my-service-dev/some-path/artifact.zip', + sourceArchiveUrl: 'gs://sls-my-service-dev-12345678/some-path/artifact.zip', httpsTrigger: { url: 'foo', }, @@ -296,7 +297,7 @@ describe('CompileFunctions', () => { function: 'func1', availableMemoryMb: 256, timeout: '60s', - sourceArchiveUrl: 'gs://sls-my-service-dev/some-path/artifact.zip', + sourceArchiveUrl: 'gs://sls-my-service-dev-12345678/some-path/artifact.zip', eventTrigger: { eventType: 'foo', path: 'some-path', @@ -312,7 +313,7 @@ describe('CompileFunctions', () => { function: 'func2', availableMemoryMb: 256, timeout: '60s', - sourceArchiveUrl: 'gs://sls-my-service-dev/some-path/artifact.zip', + sourceArchiveUrl: 'gs://sls-my-service-dev-12345678/some-path/artifact.zip', eventTrigger: { eventType: 'foo', resource: 'some-resource', diff --git a/deploy/lib/createDeployment.js b/deploy/lib/createDeployment.js index 7644772..9dfa53d 100644 --- a/deploy/lib/createDeployment.js +++ b/deploy/lib/createDeployment.js @@ -20,21 +20,21 @@ module.exports = { return this.provider.request('deploymentmanager', 'deployments', 'list', params) .then((response) => { - let found = false; + let foundDeployment; if (response && response.deployments) { - found = !!response.deployments.find((deployment) => { + foundDeployment = response.deployments.find((deployment) => { const name = `sls-${this.serverless.service.service}-${this.options.stage}`; return deployment.name === name; }); } - return found; + return foundDeployment; }); }, - createIfNotExists(existingDeployment) { - if (existingDeployment) return BbPromise.resolve(); + createIfNotExists(foundDeployment) { + if (foundDeployment) return BbPromise.resolve(); this.serverless.cli.log('Creating deployment...'); diff --git a/deploy/lib/createDeployment.test.js b/deploy/lib/createDeployment.test.js index 77713ea..b99e465 100644 --- a/deploy/lib/createDeployment.test.js +++ b/deploy/lib/createDeployment.test.js @@ -72,11 +72,11 @@ describe('CreateDeployment', () => { }); describe('#checkForExistingDeployment()', () => { - it('should return "false" if no deployments are found', () => { + it('should return "undefined" if no deployments are found', () => { requestStub.returns(BbPromise.resolve([])); - return googleDeploy.checkForExistingDeployment().then((found) => { - expect(found).toEqual(false); + return googleDeploy.checkForExistingDeployment().then((foundDeployment) => { + expect(foundDeployment).toEqual(undefined); expect(requestStub.calledWithExactly( 'deploymentmanager', 'deployments', @@ -86,7 +86,7 @@ describe('CreateDeployment', () => { }); }); - it('should return "false" if deployments do not contain deployment', () => { + it('should return "undefined" if deployments do not contain deployment', () => { const response = { deployments: [ { name: 'some-other-deployment' }, @@ -94,8 +94,8 @@ describe('CreateDeployment', () => { }; requestStub.returns(BbPromise.resolve(response)); - return googleDeploy.checkForExistingDeployment().then((found) => { - expect(found).toEqual(false); + return googleDeploy.checkForExistingDeployment().then((foundDeployment) => { + expect(foundDeployment).toEqual(undefined); expect(requestStub.calledWithExactly( 'deploymentmanager', 'deployments', @@ -114,8 +114,8 @@ describe('CreateDeployment', () => { }; requestStub.returns(BbPromise.resolve(response)); - return googleDeploy.checkForExistingDeployment().then((found) => { - expect(found).toEqual(true); + return googleDeploy.checkForExistingDeployment().then((foundDeployment) => { + expect(foundDeployment).toEqual(response.deployments[0]); expect(requestStub.calledWithExactly( 'deploymentmanager', 'deployments', @@ -145,16 +145,16 @@ describe('CreateDeployment', () => { }); it('should resolve if there is no existing deployment', () => { - const deploymentFound = true; + const foundDeployment = true; - return googleDeploy.createIfNotExists(deploymentFound).then(() => { + return googleDeploy.createIfNotExists(foundDeployment).then(() => { expect(consoleLogStub.calledOnce).toEqual(false); expect(readFileSyncStub.called).toEqual(false); }); }); it('should create and hand over to monitor the deployment if it does not exist', () => { - const deploymentFound = false; + const foundDeployment = false; const params = { project: 'my-project', resource: { @@ -168,7 +168,7 @@ describe('CreateDeployment', () => { }; requestStub.returns(BbPromise.resolve()); - return googleDeploy.createIfNotExists(deploymentFound).then(() => { + return googleDeploy.createIfNotExists(foundDeployment).then(() => { expect(consoleLogStub.calledOnce).toEqual(true); expect(readFileSyncStub.called).toEqual(true); expect(requestStub.calledWithExactly( diff --git a/deploy/lib/prepareDeployment.js b/deploy/lib/prepareDeployment.js index ad56912..6ab1259 100644 --- a/deploy/lib/prepareDeployment.js +++ b/deploy/lib/prepareDeployment.js @@ -19,7 +19,8 @@ module.exports = { 'core-configuration-template.yml')); const bucket = deploymentTemplate.resources.find(findDeploymentBucket); - const name = `sls-${this.serverless.service.service}-${this.options.stage}`; + + const name = this.serverless.service.provider.deploymentBucketName; const updatedBucket = updateBucketName(bucket, name); const bucketIndex = deploymentTemplate.resources.findIndex(findDeploymentBucket); diff --git a/deploy/lib/prepareDeployment.test.js b/deploy/lib/prepareDeployment.test.js index a353b9a..177e6b4 100644 --- a/deploy/lib/prepareDeployment.test.js +++ b/deploy/lib/prepareDeployment.test.js @@ -24,6 +24,7 @@ describe('PrepareDeployment', () => { serverless.service.service = 'my-service'; serverless.service.provider = { compiledConfigurationTemplate: coreResources, + deploymentBucketName: 'sls-my-service-dev-12345678', }; serverless.setProvider('google', new GoogleProvider(serverless)); const options = { @@ -49,7 +50,7 @@ describe('PrepareDeployment', () => { resources: [ { type: 'storage.v1.bucket', - name: 'sls-my-service-dev', + name: 'sls-my-service-dev-12345678', }, ], }; diff --git a/deploy/lib/uploadArtifacts.js b/deploy/lib/uploadArtifacts.js index c4b658a..6141242 100644 --- a/deploy/lib/uploadArtifacts.js +++ b/deploy/lib/uploadArtifacts.js @@ -7,7 +7,7 @@ module.exports = { this.serverless.cli.log('Uploading artifacts...'); const params = { - bucket: `sls-${this.serverless.service.service}-${this.options.stage}`, + bucket: this.serverless.service.provider.deploymentBucketName, resource: { name: this.serverless.service.package.artifactFilePath, contentType: 'application/octet-stream', diff --git a/deploy/lib/uploadArtifacts.test.js b/deploy/lib/uploadArtifacts.test.js index fa21d8a..4e61607 100644 --- a/deploy/lib/uploadArtifacts.test.js +++ b/deploy/lib/uploadArtifacts.test.js @@ -20,6 +20,9 @@ describe('UploadArtifacts', () => { serverless = new Serverless(); serverless.service = { service: 'my-service', + provider: { + deploymentBucketName: 'sls-my-service-dev-12345678', + }, package: { artifactFilePath: '/some-file-path', artifact: 'artifact.zip', @@ -50,7 +53,7 @@ describe('UploadArtifacts', () => { 'objects', 'insert', { - bucket: 'sls-my-service-dev', + bucket: 'sls-my-service-dev-12345678', resource: { name: '/some-file-path', contentType: 'application/octet-stream', @@ -70,7 +73,7 @@ describe('UploadArtifacts', () => { 'objects', 'insert', { - bucket: 'sls-my-service-dev', + bucket: 'sls-my-service-dev-12345678', resource: { name: '/some-file-path', contentType: 'application/octet-stream', @@ -90,7 +93,7 @@ describe('UploadArtifacts', () => { 'objects', 'insert', { - bucket: 'sls-my-service-dev', + bucket: 'sls-my-service-dev-12345678', resource: { name: '/some-file-path', contentType: 'application/octet-stream', diff --git a/remove/googleRemove.js b/remove/googleRemove.js index 3e394d0..ecbc066 100644 --- a/remove/googleRemove.js +++ b/remove/googleRemove.js @@ -4,6 +4,7 @@ const BbPromise = require('bluebird'); const validate = require('../shared/validate'); const setDefaults = require('../shared/utils'); +const setDeploymentBucketName = require('../shared/setDeploymentBucketName'); const emptyDeploymentBucket = require('./lib/emptyDeploymentBucket'); const removeDeployment = require('./lib/removeDeployment'); const monitorDeployment = require('../shared/monitorDeployment'); @@ -18,6 +19,7 @@ class GoogleRemove { this, validate, setDefaults, + setDeploymentBucketName, emptyDeploymentBucket, removeDeployment, monitorDeployment); @@ -25,7 +27,8 @@ class GoogleRemove { this.hooks = { 'before:remove:remove': () => BbPromise.bind(this) .then(this.validate) - .then(this.setDefaults), + .then(this.setDefaults) + .then(this.setDeploymentBucketName), 'remove:remove': () => BbPromise.bind(this) .then(this.emptyDeploymentBucket) diff --git a/remove/googleRemove.test.js b/remove/googleRemove.test.js index f1d37a1..2411ac1 100644 --- a/remove/googleRemove.test.js +++ b/remove/googleRemove.test.js @@ -38,6 +38,7 @@ describe('GoogleRemove', () => { describe('hooks', () => { let validateStub; let setDefaultsStub; + let setDeploymentBucketNameStub; let emptyDeploymentBucketStub; let removeDeploymentStub; @@ -46,6 +47,8 @@ describe('GoogleRemove', () => { .returns(BbPromise.resolve()); setDefaultsStub = sinon.stub(googleRemove, 'setDefaults') .returns(BbPromise.resolve()); + setDeploymentBucketNameStub = sinon.stub(googleRemove, 'setDeploymentBucketName') + .returns(BbPromise.resolve()); emptyDeploymentBucketStub = sinon.stub(googleRemove, 'emptyDeploymentBucket') .returns(BbPromise.resolve()); removeDeploymentStub = sinon.stub(googleRemove, 'removeDeployment') @@ -55,6 +58,7 @@ describe('GoogleRemove', () => { afterEach(() => { googleRemove.validate.restore(); googleRemove.setDefaults.restore(); + googleRemove.setDeploymentBucketName.restore(); googleRemove.emptyDeploymentBucket.restore(); googleRemove.removeDeployment.restore(); }); @@ -63,6 +67,7 @@ describe('GoogleRemove', () => { .hooks['before:remove:remove']().then(() => { expect(validateStub.calledOnce).toEqual(true); expect(setDefaultsStub.calledAfter(validateStub)).toEqual(true); + expect(setDeploymentBucketNameStub.calledAfter(setDefaultsStub)).toEqual(true); })); it('should run "remove:remove" promise chain', () => googleRemove diff --git a/remove/lib/emptyDeploymentBucket.js b/remove/lib/emptyDeploymentBucket.js index 131c1a6..96e7cd1 100644 --- a/remove/lib/emptyDeploymentBucket.js +++ b/remove/lib/emptyDeploymentBucket.js @@ -11,7 +11,7 @@ module.exports = { getObjectsToRemove() { const params = { - bucket: `sls-${this.serverless.service.service}-${this.options.stage}`, + bucket: this.serverless.service.provider.deploymentBucketName, }; return this.provider.request('storage', 'objects', 'list', params) diff --git a/remove/lib/emptyDeploymentBucket.test.js b/remove/lib/emptyDeploymentBucket.test.js index baf5a7d..e4d5ec1 100644 --- a/remove/lib/emptyDeploymentBucket.test.js +++ b/remove/lib/emptyDeploymentBucket.test.js @@ -16,6 +16,9 @@ describe('EmptyDeploymentBucket', () => { serverless = new Serverless(); serverless.service = { service: 'my-service', + provider: { + deploymentBucketName: 'sls-my-service-dev-12345678', + }, }; serverless.setProvider('google', new GoogleProvider(serverless)); const options = { @@ -74,7 +77,7 @@ describe('EmptyDeploymentBucket', () => { 'objects', 'list', { - bucket: 'sls-my-service-dev', + bucket: 'sls-my-service-dev-12345678', })).toEqual(true); }); }); @@ -83,11 +86,11 @@ describe('EmptyDeploymentBucket', () => { const response = { items: [ { - bucket: 'sls-my-service-dev', + bucket: 'sls-my-service-dev-12345678', name: `${key}/151224711231-2016-08-18T15:42:00/artifact.zip`, }, { - bucket: 'sls-my-service-dev', + bucket: 'sls-my-service-dev-12345678', name: `${key}/141264711231-2016-08-18T15:43:00/artifact.zip`, }, ], @@ -97,11 +100,11 @@ describe('EmptyDeploymentBucket', () => { return googleRemove.getObjectsToRemove().then((objects) => { expect(objects.length).toEqual(2); expect(objects).toContainEqual({ - bucket: 'sls-my-service-dev', + bucket: 'sls-my-service-dev-12345678', name: `${key}/151224711231-2016-08-18T15:42:00/artifact.zip`, }); expect(objects).toContainEqual({ - bucket: 'sls-my-service-dev', + bucket: 'sls-my-service-dev-12345678', name: `${key}/141264711231-2016-08-18T15:43:00/artifact.zip`, }); expect(requestStub.calledWithExactly( @@ -109,7 +112,7 @@ describe('EmptyDeploymentBucket', () => { 'objects', 'list', { - bucket: 'sls-my-service-dev', + bucket: 'sls-my-service-dev-12345678', })).toEqual(true); }); }); @@ -141,11 +144,11 @@ describe('EmptyDeploymentBucket', () => { it('should remove all given objects', () => { const objectsToRemove = [ { - bucket: 'sls-my-service-dev', + bucket: 'sls-my-service-dev-12345678', name: `${key}/151224711231-2016-08-18T15:42:00/artifact.zip`, }, { - bucket: 'sls-my-service-dev', + bucket: 'sls-my-service-dev-12345678', name: `${key}/141264711231-2016-08-18T15:43:00/artifact.zip`, }, ]; diff --git a/shared/setDeploymentBucketName.js b/shared/setDeploymentBucketName.js new file mode 100644 index 0000000..c428e9b --- /dev/null +++ b/shared/setDeploymentBucketName.js @@ -0,0 +1,36 @@ +'use strict'; + +const BbPromise = require('bluebird'); +const _ = require('lodash'); + +module.exports = { + setDeploymentBucketName() { + // set a default name for the deployment bucket + const service = this.serverless.service.service; + const stage = this.options.stage; + const timestamp = (+new Date()); + const name = `sls-${service}-${stage}-${timestamp}`; + + this.serverless.service.provider.deploymentBucketName = name; + + // check if there's already a deployment and update if available + const params = { + project: this.serverless.service.provider.project, + deployment: `sls-${this.serverless.service.service}-${this.options.stage}`, + }; + + return this.provider.request('deploymentmanager', 'resources', 'list', params) + .then((response) => { + if (!_.isEmpty(response) && response.resources) { + const regex = new RegExp(`sls-${service}-${stage}-.+`); + + const deploymentBucket = response.resources + .find(resource => (resource.type === 'storage.v1.bucket' + && resource.name.match(regex))); + + this.serverless.service.provider.deploymentBucketName = deploymentBucket.name; + } + }) + .catch(() => BbPromise.resolve()); // if it cannot be found (e.g. on initial deployment) + }, +}; diff --git a/shared/setDeploymentBucketName.test.js b/shared/setDeploymentBucketName.test.js new file mode 100644 index 0000000..84b936a --- /dev/null +++ b/shared/setDeploymentBucketName.test.js @@ -0,0 +1,91 @@ +'use strict'; + +const sinon = require('sinon'); +const BbPromise = require('bluebird'); + +const setDeploymentBucketName = require('./setDeploymentBucketName'); +const GoogleProvider = require('../provider/googleProvider'); +const Serverless = require('../test/serverless'); +const GoogleCommand = require('../test/googleCommand'); + +describe('SetDeploymentBucketName', () => { + let serverless; + let googleCommand; + let requestStub; + + beforeEach(() => { + serverless = new Serverless(); + serverless.service = { + service: 'my-service', + }; + serverless.service.provider = { + project: 'my-project', + }; + const options = { + stage: 'dev', + region: 'us-central1', + }; + serverless.setProvider('google', new GoogleProvider(serverless)); + googleCommand = new GoogleCommand(serverless, options, setDeploymentBucketName); + requestStub = sinon.stub(googleCommand.provider, 'request'); + }); + + afterEach(() => { + googleCommand.provider.request.restore(); + }); + + describe('#setDeploymentBucketName()', () => { + it('should set the name if the deployment request errors out', () => { + requestStub.returns(BbPromise.reject()); + + return googleCommand.setDeploymentBucketName().then(() => { + expect(serverless.service.provider.deploymentBucketName) + .toMatch(/sls-my-service-dev-.+/); + expect(requestStub.calledWithExactly( + 'deploymentmanager', + 'resources', + 'list', + { project: 'my-project', deployment: 'sls-my-service-dev' }, + )).toEqual(true); + }); + }); + + it('should set the name if a deployment is not present', () => { + const response = {}; + requestStub.returns(BbPromise.resolve(response)); + + return googleCommand.setDeploymentBucketName().then(() => { + expect(serverless.service.provider.deploymentBucketName) + .toMatch(/sls-my-service-dev-.+/); + expect(requestStub.calledWithExactly( + 'deploymentmanager', + 'resources', + 'list', + { project: 'my-project', deployment: 'sls-my-service-dev' }, + )).toEqual(true); + }); + }); + + it('should set the bucket name with the one of the deployment if exists', () => { + const response = { + resources: [ + { type: 'some-other-type', name: 'some-other-resource' }, + { type: 'storage.v1.bucket', name: 'some-bucket' }, + { type: 'storage.v1.bucket', name: 'sls-my-service-dev-12345678' }, + ], + }; + requestStub.returns(BbPromise.resolve(response)); + + return googleCommand.setDeploymentBucketName().then(() => { + expect(serverless.service.provider.deploymentBucketName) + .toEqual('sls-my-service-dev-12345678'); + expect(requestStub.calledWithExactly( + 'deploymentmanager', + 'resources', + 'list', + { project: 'my-project', deployment: 'sls-my-service-dev' }, + )).toEqual(true); + }); + }); + }); +});