serverless/test/utils/cloudformation.js
2020-10-08 09:40:57 +02:00

107 lines
2.6 KiB
JavaScript

'use strict';
const awsRequest = require('@serverless/test/aws-request');
const SHARED_INFRA_TESTS_CLOUDFORMATION_STACK = 'integration-tests-deps-stack';
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,
isDependencyStackAvailable,
getDependencyStackOutputMap,
};