@csermet/multiprovider
Version:
cloud-graph provider plugin for AWS used to fetch AWS cloud data.
106 lines (105 loc) • 4.16 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const autoscaling_1 = __importDefault(require("aws-sdk/clients/autoscaling"));
const lodash_1 = require("lodash");
const sdk_1 = __importDefault(require("@cloudgraph/sdk"));
const logger_1 = __importDefault(require("../../properties/logger"));
const utils_1 = require("../../utils");
const errorLog_1 = __importDefault(require("../../utils/errorLog"));
const constants_1 = require("../../config/constants");
const lt = { ...logger_1.default };
const { logger } = sdk_1.default;
const serviceName = 'ASG';
const errorLog = new errorLog_1.default(serviceName);
const endpoint = utils_1.initTestEndpoint(serviceName);
const customRetrySettings = utils_1.setAwsRetryOptions({ baseDelay: constants_1.ASG_CUSTOM_DELAY });
const listAsgData = async (asg) => {
try {
const fullResources = [];
let autoScalingGroups = await asg.describeAutoScalingGroups().promise();
fullResources.push(...autoScalingGroups.AutoScalingGroups);
let nextToken = autoScalingGroups.NextToken;
while (nextToken) {
autoScalingGroups = await asg
.describeAutoScalingGroups({ NextToken: nextToken })
.promise();
fullResources.push(...autoScalingGroups.AutoScalingGroups);
nextToken = autoScalingGroups.NextToken;
}
return fullResources;
}
catch (err) {
errorLog.generateAwsErrorLog({
functionName: 'asg:describeAutoScalingGroups',
err,
});
}
return null;
};
const listLaunchConfigData = async (asg) => {
try {
const fullResources = [];
let launchConfigurations = await asg
.describeLaunchConfigurations()
.promise();
fullResources.push(...launchConfigurations.LaunchConfigurations);
let nextToken = launchConfigurations.NextToken;
while (nextToken) {
launchConfigurations = await asg
.describeLaunchConfigurations({ NextToken: nextToken })
.promise();
fullResources.push(...launchConfigurations.LaunchConfigurations);
nextToken = launchConfigurations.NextToken;
}
logger.debug(lt.fetchedAsgs(fullResources.length));
return fullResources;
}
catch (err) {
errorLog.generateAwsErrorLog({
functionName: 'asg:describeLaunchConfiguration',
err,
});
}
return null;
};
exports.default = async ({ regions, config, }) => {
const asgData = [];
let launchConfigData;
for (const region of regions.split(',')) {
const asg = new autoscaling_1.default({ ...config, region, endpoint, ...customRetrySettings });
/**
* Step 1) Get all the ASG data for each region
*/
const autoScalingGroups = await listAsgData(asg);
if (!lodash_1.isEmpty(autoScalingGroups)) {
asgData.push(...autoScalingGroups.map((autoScalingGroup) => ({
...autoScalingGroup,
region,
LaunchConfiguration: {},
})));
}
/**
* Step 2) Get all the Launch Configuration data for each region
*/
launchConfigData = await listLaunchConfigData(asg);
}
asgData.map(({ LaunchConfigurationName: targetLcName, Tags: tags }, idx) => {
asgData[idx].LaunchConfiguration = {};
if (targetLcName) {
const launchConfig = launchConfigData?.find(({ LaunchConfigurationName: lcName }) => targetLcName === lcName);
if (launchConfig) {
asgData[idx].LaunchConfiguration = launchConfig;
}
}
if (!lodash_1.isEmpty(tags)) {
asgData[idx].Tags = (tags || [])
.map(({ Key, Value }) => ({ [Key]: Value }))
.reduce((acc, curr) => ({ ...acc, ...curr }), {});
}
});
errorLog.reset();
return lodash_1.groupBy(asgData, 'region');
};