@csermet/multiprovider
Version:
cloud-graph provider plugin for AWS used to fetch AWS cloud data.
119 lines (118 loc) • 4.33 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const sdk_1 = __importDefault(require("@cloudgraph/sdk"));
const cloudfront_1 = __importDefault(require("aws-sdk/clients/cloudfront"));
const groupBy_1 = __importDefault(require("lodash/groupBy"));
const isEmpty_1 = __importDefault(require("lodash/isEmpty"));
const logger_1 = __importDefault(require("../../properties/logger"));
const format_1 = require("../../utils/format");
const utils_1 = require("../../utils");
const errorLog_1 = __importDefault(require("../../utils/errorLog"));
const regions_1 = require("../../enums/regions");
const lt = { ...logger_1.default };
const { logger } = sdk_1.default;
const serviceName = 'Cloudfront';
const errorLog = new errorLog_1.default(serviceName);
const endpoint = utils_1.initTestEndpoint(serviceName);
const listCloudfrontDistributions = async (cloudFront) => new Promise(resolve => {
const distributions = [];
const listDistOpts = {};
const listDistributions = (marker) => {
if (marker) {
listDistOpts.Marker = marker;
}
cloudFront.listDistributions(listDistOpts, (err, data) => {
if (err) {
errorLog.generateAwsErrorLog({
functionName: 'cloudfront:listDistributions',
err,
});
}
const { DistributionList: { Items = [], NextMarker: nextToken = '', IsTruncated = false, } = {}, } = data || {};
/**
* No Distributions Found
*/
if (isEmpty_1.default(Items)) {
return resolve([]);
}
distributions.push(...Items);
if (IsTruncated) {
listDistributions(nextToken);
}
else {
resolve(distributions);
}
});
};
listDistributions();
});
const getDistributionTags = async (cloudfront, arn) => new Promise(resolve => {
cloudfront.listTagsForResource({
Resource: arn,
}, (err, data) => {
if (err) {
errorLog.generateAwsErrorLog({
functionName: 'cloudfront:listTagsForResource',
err,
});
}
const { Tags: { Items: tags = [] }, } = data || { Tags: {} };
if (!isEmpty_1.default(data)) {
resolve(format_1.convertAwsTagsToTagMap(tags));
}
resolve({});
});
});
const getDistributionConfig = async (cloudfront, id) => new Promise(resolve => {
cloudfront.getDistributionConfig({
Id: id,
}, (err, data) => {
if (err) {
errorLog.generateAwsErrorLog({
functionName: 'cloudfront:getDistributionConfig',
err,
});
}
if (!isEmpty_1.default(data)) {
resolve({ config: data.DistributionConfig, etag: data.ETag });
}
resolve({});
});
});
/**
* Cloudfront
*/
exports.default = async ({ config, }) => {
const cloudfront = new cloudfront_1.default({ ...config, endpoint });
const distributionList = await listCloudfrontDistributions(cloudfront);
let numOfDistributions = 0;
let cloudfrontData = [];
if (!isEmpty_1.default(distributionList)) {
numOfDistributions += distributionList.length;
cloudfrontData = distributionList.map(item => ({
summary: item,
region: regions_1.globalRegionName,
}));
}
logger.debug(lt.fetchedCloudFrontDistros(numOfDistributions));
await Promise.all(cloudfrontData.map(async (dist, distIndex) => new Promise(async (resolveDistributionTags) => {
const promises = [
getDistributionTags(cloudfront, dist.summary.ARN),
getDistributionConfig(cloudfront, dist.summary.Id),
];
const [Tags, distConfig] = await utils_1.settleAllPromises(promises);
const { config, etag } = distConfig;
cloudfrontData[distIndex] = {
...dist,
Tags,
config,
etag,
};
resolveDistributionTags();
})));
errorLog.reset();
return groupBy_1.default(cloudfrontData, 'region');
};