serverless/test/utils/cloudformation.js
lewgordon cacb529925
feat(AWS Lambda): Add support for activemq event (#8840)
Co-authored-by: Lew Gordon <lew.gordon@genesys.com>
Co-authored-by: Piotr Grzesik <pj.grzesik@gmail.com>
2021-09-03 12:24:47 +02:00

110 lines
2.8 KiB
JavaScript

'use strict';
const awsRequest = require('@serverless/test/aws-request');
const SHARED_INFRA_TESTS_CLOUDFORMATION_STACK = 'integration-tests-deps-stack';
const SHARED_INFRA_TESTS_ACTIVE_MQ_CREDENTIALS_NAME =
'integration-tests-active-mq-broker-credentials';
function findStacks(name, status) {
const params = {};
if (status) {
params.StackStatusFilter = status;
}
function recursiveFind(found, token) {
if (token) params.NextToken = token;
return awsRequest('CloudFormation', 'listStacks', params).then((result) => {
const matches = result.StackSummaries.filter((stack) => stack.StackName.match(name));
if (matches.length) {
found.push(...matches);
}
if (result.NextToken) return recursiveFind(found, result.NextToken);
return found;
});
}
return recursiveFind([]);
}
function deleteStack(stack) {
const params = {
StackName: stack,
};
return awsRequest('CloudFormation', 'deleteStack', params);
}
function listStackResources(stack) {
const params = {
StackName: stack,
};
function recursiveFind(resources, token) {
if (token) params.NextToken = token;
return awsRequest('CloudFormation', 'listStackResources', params).then((result) => {
resources.push(...result.StackResourceSummaries);
if (result.NextToken) return recursiveFind(resources, result.NextToken);
return resources;
});
}
return recursiveFind([]);
}
function listStacks(status) {
const params = {};
if (status) {
params.StackStatusFilter = status;
}
return awsRequest('CloudFormation', 'listStacks', params);
}
async function getStackOutputMap(name) {
const describeStackResponse = await awsRequest('CloudFormation', 'describeStacks', {
StackName: name,
});
const outputsMap = new Map();
for (const { OutputKey: key, OutputValue: value } of describeStackResponse.Stacks[0].Outputs) {
outputsMap.set(key, value);
}
return outputsMap;
}
async function isDependencyStackAvailable() {
const validStatuses = ['CREATE_COMPLETE', 'UPDATE_COMPLETE'];
try {
const describeStacksResponse = await awsRequest('CloudFormation', 'describeStacks', {
StackName: SHARED_INFRA_TESTS_CLOUDFORMATION_STACK,
});
if (validStatuses.includes(describeStacksResponse.Stacks[0].StackStatus)) {
return true;
}
return false;
} catch (e) {
if (e.code === 'ValidationError') {
return false;
}
throw e;
}
}
async function getDependencyStackOutputMap() {
return getStackOutputMap(SHARED_INFRA_TESTS_CLOUDFORMATION_STACK);
}
module.exports = {
findStacks,
deleteStack,
listStackResources,
listStacks,
getStackOutputMap,
SHARED_INFRA_TESTS_CLOUDFORMATION_STACK,
SHARED_INFRA_TESTS_ACTIVE_MQ_CREDENTIALS_NAME,
isDependencyStackAvailable,
getDependencyStackOutputMap,
};