59 lines
2.5 KiB
TypeScript
59 lines
2.5 KiB
TypeScript
|
import AWS from 'aws-sdk';
|
||
|
import Input from '../../../../input';
|
||
|
import CloudRunnerLogger from '../../../services/cloud-runner-logger';
|
||
|
import { TaskService } from './task-service';
|
||
|
import { TertiaryResourcesService } from './tertiary-resources-service';
|
||
|
|
||
|
export class GarbageCollectionService {
|
||
|
static isOlderThan1day(date: any) {
|
||
|
const ageDate = new Date(date.getTime() - Date.now());
|
||
|
|
||
|
return ageDate.getDay() > 0;
|
||
|
}
|
||
|
|
||
|
public static async cleanup(deleteResources = false, OneDayOlderOnly: boolean = false) {
|
||
|
process.env.AWS_REGION = Input.region;
|
||
|
const CF = new AWS.CloudFormation();
|
||
|
const ecs = new AWS.ECS();
|
||
|
const cwl = new AWS.CloudWatchLogs();
|
||
|
const taskDefinitionsInUse = new Array();
|
||
|
await TaskService.awsListTasks(async (taskElement, element) => {
|
||
|
taskDefinitionsInUse.push(taskElement.taskDefinitionArn);
|
||
|
if (deleteResources && (!OneDayOlderOnly || GarbageCollectionService.isOlderThan1day(taskElement.CreatedAt))) {
|
||
|
CloudRunnerLogger.log(`Stopping task ${taskElement.containers?.[0].name}`);
|
||
|
await ecs.stopTask({ task: taskElement.taskArn || '', cluster: element }).promise();
|
||
|
}
|
||
|
});
|
||
|
await TaskService.awsListStacks(async (element) => {
|
||
|
if (
|
||
|
(await CF.describeStackResources({ StackName: element.StackName }).promise()).StackResources?.some(
|
||
|
(x) => x.ResourceType === 'AWS::ECS::TaskDefinition' && taskDefinitionsInUse.includes(x.PhysicalResourceId),
|
||
|
)
|
||
|
) {
|
||
|
CloudRunnerLogger.log(`Skipping ${element.StackName} - active task was running not deleting`);
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
if (deleteResources && (!OneDayOlderOnly || GarbageCollectionService.isOlderThan1day(element.CreationTime))) {
|
||
|
if (element.StackName === 'game-ci' || element.TemplateDescription === 'Game-CI base stack') {
|
||
|
CloudRunnerLogger.log(`Skipping ${element.StackName} ignore list`);
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
CloudRunnerLogger.log(`Deleting ${element.logGroupName}`);
|
||
|
const deleteStackInput: AWS.CloudFormation.DeleteStackInput = { StackName: element.StackName };
|
||
|
await CF.deleteStack(deleteStackInput).promise();
|
||
|
}
|
||
|
});
|
||
|
await TertiaryResourcesService.awsListLogGroups(async (element) => {
|
||
|
if (
|
||
|
deleteResources &&
|
||
|
(!OneDayOlderOnly || GarbageCollectionService.isOlderThan1day(new Date(element.createdAt)))
|
||
|
) {
|
||
|
CloudRunnerLogger.log(`Deleting ${element.logGroupName}`);
|
||
|
await cwl.deleteLogGroup({ logGroupName: element.logGroupName || '' }).promise();
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
}
|