'use strict'; const awsRequest = require('@serverless/test/aws-request'); const CloudFormationService = require('aws-sdk').CloudFormation; const SHARED_INFRA_TESTS_CLOUDFORMATION_STACK = 'integration-tests-deps-stack'; const SHARED_INFRA_TESTS_ACTIVE_MQ_CREDENTIALS_NAME = 'integration-tests-active-mq-broker-credentials'; const SHARED_INFRA_TESTS_RABBITMQ_CREDENTIALS_NAME = 'integration-tests-rabbitmq-broker-credentials'; async function findStacks(name, status) { const params = {}; if (status) { params.StackStatusFilter = status; } async function recursiveFind(found, token) { if (token) params.NextToken = token; return awsRequest(CloudFormationService, '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([]); } async function deleteStack(stack) { const params = { StackName: stack, }; return awsRequest(CloudFormationService, 'deleteStack', params); } async function listStackResources(stack) { const params = { StackName: stack, }; async function recursiveFind(resources, token) { if (token) params.NextToken = token; return awsRequest(CloudFormationService, 'listStackResources', params).then((result) => { resources.push(...result.StackResourceSummaries); if (result.NextToken) return recursiveFind(resources, result.NextToken); return resources; }); } return recursiveFind([]); } async function listStacks(status) { const params = {}; if (status) { params.StackStatusFilter = status; } return awsRequest(CloudFormationService, 'listStacks', params); } async function getStackOutputMap(name) { const describeStackResponse = await awsRequest(CloudFormationService, '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(CloudFormationService, '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, SHARED_INFRA_TESTS_RABBITMQ_CREDENTIALS_NAME, isDependencyStackAvailable, getDependencyStackOutputMap, };