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
15 changes: 10 additions & 5 deletions lib/createChangeSet.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@

const _ = require('lodash')

const createChangeSet = (plugin, stackName, changeSetName, changeSetType) => {
const createChangeSet = (plugin, stackName, stage, changeSetName, changeSetType) => {
const compiledTemplateFileName = 'compiled-cloudformation-template.json'
const templateUrl = `https://s3.amazonaws.com/${plugin.bucketName}/${plugin.serverless.service.package.artifactDirectoryName}/${compiledTemplateFileName}`

let stackTags = {
STAGE: plugin.options.stage
STAGE: stage
}
// Merge additional stack tags
if (typeof plugin.serverless.service.provider.stackTags === 'object') {
Expand Down Expand Up @@ -39,22 +39,27 @@ const createChangeSet = (plugin, stackName, changeSetName, changeSetType) => {
'CloudFormation',
'createChangeSet',
params,
plugin.options.stage,
stage,
plugin.options.region
)
}

module.exports = {
createChangeSet () {
if (this.shouldNotDeploy) {
return Promise.resolve()
}

const stackName = this.provider.naming.getStackName()
const stage = this.options.stage || this.serverless.service.provider.stage
const changeSetName = this.options.changeSetName ? this.options.changeSetName : `${stackName}-${Date.now()}`

this.serverless.cli.log(`Creating CloudFormation ChangeSet [${changeSetName}]...`)
return createChangeSet(this, stackName, changeSetName, 'UPDATE')
return createChangeSet(this, stackName, stage, changeSetName, 'UPDATE')
.catch(e => {
if (e.message.indexOf('does not exist') > -1) {
this.serverless.cli.log(`Stack [${stackName}] does not exist. Creating a new empty stack...`)
return createChangeSet(this, stackName, changeSetName, 'CREATE')
return createChangeSet(this, stackName, stage, changeSetName, 'CREATE')
}
throw e
})
Expand Down
48 changes: 34 additions & 14 deletions lib/createChangeSet.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,24 +7,23 @@ const Serverless = require('serverless/lib/Serverless')
const ServerlessCloudFormationChangeSets = require('../index')
const sinon = require('sinon')

function buildServerlessChangeSets (options = { stage: 'dev', region: 'us-east-1', changeset: 'test'}) {
const serverless = new Serverless()
serverless.config.servicePath = 'foo'
serverless.setProvider('aws', new AwsProvider(serverless))
const serverlessChangeSets = new ServerlessCloudFormationChangeSets(serverless, options)
serverless.service.service = `service-${(new Date()).getTime().toString()}`
serverlessChangeSets.bucketName = 'deployment-bucket'
serverlessChangeSets.serverless.service.package.artifactDirectoryName = 'somedir'
serverlessChangeSets.serverless.cli = new serverless.classes.CLI()
return serverlessChangeSets
}

describe('updateStack', () => {
let serverless
let serverlessChangeSets

beforeEach(() => {
serverless = new Serverless()
serverless.config.servicePath = 'foo'
serverless.setProvider('aws', new AwsProvider(serverless))
const options = {
stage: 'dev',
region: 'us-east-1',
changeset: 'test'
}
serverlessChangeSets = new ServerlessCloudFormationChangeSets(serverless, options)
serverless.service.service = `service-${(new Date()).getTime().toString()}`
serverlessChangeSets.bucketName = 'deployment-bucket'
serverlessChangeSets.serverless.service.package.artifactDirectoryName = 'somedir'
serverlessChangeSets.serverless.cli = new serverless.classes.CLI()
serverlessChangeSets = buildServerlessChangeSets()
})

describe('#createChangeSet()', () => {
Expand Down Expand Up @@ -133,5 +132,26 @@ describe('updateStack', () => {
)
})
})

it('should skip execution when there are no changes', () => {
serverlessChangeSets.shouldNotDeploy = true
return createChangeSet.bind(serverlessChangeSets)()
.then(() => {
sinon.assert.notCalled(createChangeSetStub)
})
})

it('should use provider stage when not available in the options', () => {
serverlessChangeSets = buildServerlessChangeSets({ region: 'us-east-1', changeset: 'test'})
createChangeSetStub = sinon.stub(serverlessChangeSets.provider, 'request').resolves()
serverlessChangeSets.serverless.service.provider.stage = 'test1'

return createChangeSet.bind(serverlessChangeSets)().then(() => {
expect(createChangeSetStub.args[0][2].Tags)
.to.deep.equal([
{ Key: 'STAGE', Value: 'test1' }
])
})
})
})
})