Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
66 changes: 66 additions & 0 deletions __tests__/utils/bucket-name.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
'use strict';

const test = require('ava');
const sinon = require('sinon');

const setDeploymentBucketName = require('../../lib/deployment-bucket-name');

function createOriginalContext() {
return {
serverless: {
service: {
provider: {}
},
getProvider: sinon.stub().callsFake((providerName) => {
if (providerName === 'aws') {
return {
getServerlessDeploymentBucketName: sinon.stub().resolves('mock-bucket-name')
};
}
}),
version: '4.0.0'
},
options: {}
};
}

test.beforeEach(t => {
t.context = createOriginalContext();
});

test('sets deployment bucket name if explicitly defined', async t => {
t.context.serverless.service.provider.deploymentBucket = 'explicit-bucket';

await setDeploymentBucketName.call(t.context);

t.is(t.context.deploymentBucketName, 'explicit-bucket');
});

test('fetches deployment bucket name for Serverless v4 and sets it', async t => {
t.context.serverless.version = '4.0.0';
t.context.serverless.service.provider.deploymentBucket = undefined;

await setDeploymentBucketName.call(t.context);

t.is(t.context.deploymentBucketName, 'mock-bucket-name');
});

test('sets deployment bucket using Ref syntax for Serverless versions below v4', async t => {
t.context.serverless.version = '3.8.0';
t.context.serverless.service.provider.deploymentBucket = undefined;

await setDeploymentBucketName.call(t.context);

t.deepEqual(t.context.deploymentBucketName, { Ref: 'ServerlessDeploymentBucket' });
});

test('throws an error if getServerlessDeploymentBucketName fails', async t => {
t.context.serverless.getProvider = sinon.fake.returns({
getServerlessDeploymentBucketName: sinon.fake.rejects(new Error('Failed to retrieve bucket'))
});
t.context.serverless.version = '4.0.0';

const error = await t.throwsAsync(() => setDeploymentBucketName.call(t.context));

t.is(error.message, 'Failed to set deployment bucket name: Failed to retrieve bucket');
});
6 changes: 3 additions & 3 deletions __tests__/utils/nested-stack-resource.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ const utils = require('../../lib/utils');

test.beforeEach(t => {
t.context = Object.assign({}, utils, {
deploymentBucketName: 'my-bucket-name',
deploymentBucketEndpoint: 's3.amazonaws.com',
serverless: {
service: {
Expand All @@ -27,7 +28,8 @@ test('creates a resource with the right type', t => {
});

test('creates a resource with the right URL', t => {
const output = t.context.nestedStackResource('test');
t.context.deploymentBucketName = { Ref: 'ServerlessDeploymentBucket' };
const output = t.context.nestedStackResource('test');

t.true(Array.isArray(output.Properties.TemplateURL['Fn::Join']));
t.deepEqual(output.Properties.TemplateURL['Fn::Join'][0], '/');
Expand All @@ -44,8 +46,6 @@ test('creates a resource with the right URL', t => {
});

test('creates a resource with the right URL when a custom bucket is used', t => {
t.context.serverless.service.provider.deploymentBucket = 'my-bucket-name';

const output = t.context.nestedStackResource('test');

t.true(Array.isArray(output.Properties.TemplateURL['Fn::Join']));
Expand Down
22 changes: 22 additions & 0 deletions lib/deployment-bucket-name.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
'use-strict';

module.exports = async function setDeploymentBucketName() {
try {
const {service: {provider}, version} = this.serverless;
const {deploymentBucket} = provider;

if (deploymentBucket) {
this.deploymentBucketName = deploymentBucket;
return;
}

const isVersion4OrAbove = parseInt(version.split('.')[0], 10) >= 4;
if (isVersion4OrAbove) {
this.deploymentBucketName = await this.serverless.getProvider('aws').getServerlessDeploymentBucketName();
} else {
this.deploymentBucketName = { Ref: 'ServerlessDeploymentBucket' };
}
} catch (error) {
throw new Error(`Failed to set deployment bucket name: ${error.message}`);
}
};
2 changes: 1 addition & 1 deletion lib/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ module.exports = {
'Fn::Join': [
'/', [
`https://${this.deploymentBucketEndpoint}`,
this.serverless.service.provider.deploymentBucket || { Ref: 'ServerlessDeploymentBucket' },
this.deploymentBucketName,
this.serverless.service.package.artifactDirectoryName,
fileName
]
Expand Down
3 changes: 3 additions & 0 deletions split-stacks.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ const _ = require('lodash');
const semver = require('semver');

const setDeploymentBucketEndpoint = require('./lib/deployment-bucket-endpoint');
const setDeploymentBucketName = require('./lib/deployment-bucket-name');
const migrateExistingResources = require('./lib/migrate-existing-resources');
const migrateNewResources = require('./lib/migrate-new-resources');
const replaceReferences = require('./lib/replace-references');
Expand Down Expand Up @@ -34,6 +35,7 @@ class ServerlessPluginSplitStacks {
Object.assign(this,
utils,
{ setDeploymentBucketEndpoint },
{ setDeploymentBucketName },
{ migrateExistingResources },
{ migrateNewResources },
{ replaceReferences },
Expand All @@ -59,6 +61,7 @@ class ServerlessPluginSplitStacks {

return Promise.resolve()
.then(() => this.setDeploymentBucketEndpoint())
.then(() => this.setDeploymentBucketName())
.then(() => this.migrateExistingResources())
.then(() => this.migrateNewResources())
.then(() => this.replaceReferences())
Expand Down