serverless/test/utils/awsCleanup.js
2020-09-09 11:17:21 +02:00

106 lines
3.1 KiB
JavaScript

'use strict';
// NOTE: This script requires Node.js > 8 to run since it uses
// modern Node.js / JavaScript features such as async / await
const { logger } = require('./misc');
const { findStacks, deleteStack, listStackResources } = require('./cludformation');
const { findRestApis, deleteRestApi } = require('./apiGateway');
const { deleteBucket } = require('./s3');
const { findUserPools, deleteUserPoolById } = require('./cognito');
async function findDeploymentBuckets(stacks) {
const buckets = [];
for (const stack of stacks) {
const stackResources = await listStackResources(stack.StackId);
const bucket = stackResources.filter(resource => {
return resource.LogicalResourceId === 'ServerlessDeploymentBucket';
});
buckets.push(...bucket);
}
return buckets;
}
async function cleanup() {
const date = new Date();
const yesterday = date.setDate(date.getDate() - 1);
const status = [
'CREATE_FAILED',
'CREATE_COMPLETE',
'UPDATE_COMPLETE',
'ROLLBACK_FAILED',
'ROLLBACK_COMPLETE',
'DELETE_FAILED',
'UPDATE_ROLLBACK_FAILED',
'UPDATE_ROLLBACK_COMPLETE',
];
// find all the resources
const [stacks, apis, userPools] = await Promise.all([
findStacks(/^(?:integ-)?test/, status),
findRestApis(/^dev-(?:integ-)?test/),
findUserPools(),
]);
let bucketsToRemove = [];
const stacksToRemove = stacks.filter(stack => +new Date(stack.CreationTime) < yesterday);
const apisToRemove = apis.filter(api => +new Date(api.createdDate) < yesterday);
const userPoolsToRemove = userPools.filter(userPool => userPool.CreationDate < yesterday);
if (stacksToRemove) {
bucketsToRemove = await findDeploymentBuckets(stacksToRemove);
}
logger.log(`${bucketsToRemove.length} Buckets to remove...`);
logger.log(`${stacksToRemove.length} Stacks to remove...`);
logger.log(`${apisToRemove.length} APIs to remove...`);
logger.log(`${userPoolsToRemove.length} User pools to remove...`);
if (bucketsToRemove.length) {
logger.log('Removing Buckets...');
const promises = bucketsToRemove.map(bucket => deleteBucket(bucket.PhysicalResourceId));
try {
await Promise.all(promises);
} catch (error) {
// do nothing... try to continue with cleanup
}
}
if (stacksToRemove.length) {
logger.log('Removing Stacks...');
const promises = stacksToRemove.map(stack => deleteStack(stack.StackName));
try {
await Promise.all(promises);
} catch (error) {
// do nothing... try to continue with cleanup
}
}
if (apisToRemove.length) {
logger.log('Removing APIs...');
const promises = apisToRemove.map(api => deleteRestApi(api.id));
try {
await Promise.all(promises);
} catch (error) {
// do nothing... try to continue with cleanup
}
}
if (userPoolsToRemove.length) {
logger.log('Removing User Pools...');
const promises = userPoolsToRemove.map(userPool => deleteUserPoolById(userPool.Id));
try {
await Promise.all(promises);
} catch (error) {
// do nothing... try to continue with cleanup
}
}
}
cleanup().catch(error => {
// eslint-disable-next-line no-console
console.error(error);
process.exit(1);
});