Skip to content
Merged
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
38 changes: 33 additions & 5 deletions lib/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -632,6 +632,28 @@ Emulate only the body of the API Gateway event.
}
}

_alias (lambda, functionName, functionVersion, aliasName) {
return lambda.getAlias({
FunctionName: functionName,
Name: aliasName
}).promise().then(() => {
return lambda.updateAlias({
FunctionName: functionName,
Name: aliasName,
FunctionVersion: functionVersion
}).promise()
}).catch((err) => {
if (err.code === 'ResourceNotFoundException') {
return lambda.createAlias({
FunctionName: functionName,
Name: aliasName,
FunctionVersion: functionVersion
}).promise()
}
throw err
})
}

async _uploadExisting (lambda, params) {
const functionCodeParams = Object.assign({
FunctionName: params.FunctionName,
Expand Down Expand Up @@ -666,7 +688,7 @@ Emulate only the body of the API Gateway event.
console.log(response.error.message)
console.log('=> Retrying')
})
const updateConfigResponse = await updateConfigRequest.promise()
await updateConfigRequest.promise()

// Wait for the `Configuration.LastUpdateStatus` to change from `InProgress` to `Successful`.
for (let i = 0; i < 10; i++) {
Expand All @@ -682,9 +704,9 @@ Emulate only the body of the API Gateway event.
console.log(response.error.message)
console.log('=> Retrying')
})
await updateCodeRequest.promise()
const updateCodeResponse = await updateCodeRequest.promise()

return updateConfigResponse
return updateCodeResponse
}

_uploadNew (lambda, params) {
Expand Down Expand Up @@ -1044,7 +1066,10 @@ they may not work as expected in the Lambda environment.
cloudWatchLogs,
program,
params.FunctionName
)
),
...(params.Publish && program.lambdaVersion
? [this._alias(lambda, params.FunctionName, results.Version, program.lambdaVersion)]
: [])
])
} else {
const results = await this._uploadNew(lambda, params)
Expand Down Expand Up @@ -1072,7 +1097,10 @@ they may not work as expected in the Lambda environment.
cloudWatchLogs,
program,
params.FunctionName
)
),
...(params.Publish && program.lambdaVersion
? [this._alias(lambda, params.FunctionName, results.Version, program.lambdaVersion)]
: [])
])
}
}
Expand Down
50 changes: 47 additions & 3 deletions test/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,8 @@ const lambdaMockSettings = {
},
updateFunctionCode: {
FunctionArn: 'Lambda.updateFunctionCode.mock.FunctionArn',
FunctionName: 'Lambda.updateFunctionCode.mock.FunctionName'
FunctionName: 'Lambda.updateFunctionCode.mock.FunctionName',
Version: '1'
},
updateFunctionConfiguration: {
FunctionArn: 'Lambda.updateFunctionConfiguration.mock.FunctionArn',
Expand All @@ -107,7 +108,19 @@ const lambdaMockSettings = {
Tags: { tag1: 'key1' }
},
untagResource: {},
tagResource: {}
tagResource: {},
getAlias: {
FunctionArn: 'Lambda.getAlias.mock.FunctionArn',
Name: 'mockAlias'
},
createAlias: {
FunctionArn: 'Lambda.createAlias.mock.FunctionArn',
Name: 'mockAlias'
},
updateAlias: {
FunctionArn: 'Lambda.updateAlias.mock.FunctionArn',
Name: 'mockAlias'
}
}

const _mockSetting = () => {
Expand Down Expand Up @@ -1575,7 +1588,27 @@ describe('lib/main', function () {
it('simple test with mock', () => {
const params = lambda._params(program, null)
return lambda._uploadExisting(awsLambda, params).then((results) => {
assert.deepEqual(results, lambdaMockSettings.updateFunctionConfiguration)
assert.deepEqual(results, lambdaMockSettings.updateFunctionCode)
})
})
})

describe('_alias', () => {
it('updates alias when it already exists', () => {
return lambda._alias(awsLambda, 'myFunc', '1', 'mockAlias').then((results) => {
assert.deepEqual(results, lambdaMockSettings.updateAlias)
})
})

it('creates alias when it does not exist', () => {
const err = new Error('ResourceNotFoundException')
err.code = 'ResourceNotFoundException'
const mockLambda = {
getAlias: () => ({ promise: () => Promise.reject(err) }),
createAlias: () => ({ promise: () => Promise.resolve(lambdaMockSettings.createAlias) })
}
return lambda._alias(mockLambda, 'myFunc', '1', 'mockAlias').then((results) => {
assert.deepEqual(results, lambdaMockSettings.createAlias)
})
})
})
Expand Down Expand Up @@ -1648,6 +1681,17 @@ describe('lib/main', function () {
)
})
})

it('creates alias when publish and lambdaVersion are set', () => {
program.publish = true
program.lambdaVersion = 'v1'
const params = lambda._params(program, null)
params.Publish = true
return lambda._deployToRegion(program, params, 'us-east-1').then((result) => {
assert.equal(result.length, 4)
assert.deepEqual(result[3], lambdaMockSettings.updateAlias)
})
})
})

describe('Lambda.prototype.deploy()', () => {
Expand Down