UNPKG

@csermet/multiprovider

Version:

cloud-graph provider plugin for AWS used to fetch AWS cloud data.

106 lines (105 loc) 4.21 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const emr_1 = __importDefault(require("aws-sdk/clients/emr")); const sdk_1 = __importDefault(require("@cloudgraph/sdk")); const groupBy_1 = __importDefault(require("lodash/groupBy")); const isEmpty_1 = __importDefault(require("lodash/isEmpty")); const flatMap_1 = __importDefault(require("lodash/flatMap")); const logger_1 = __importDefault(require("../../properties/logger")); const utils_1 = require("../../utils"); const errorLog_1 = __importDefault(require("../../utils/errorLog")); const data_1 = require("../emrCluster/data"); const services_1 = __importDefault(require("../../enums/services")); const lt = { ...logger_1.default }; const { logger } = sdk_1.default; const serviceName = 'EMR instance'; const errorLog = new errorLog_1.default(serviceName); const endpoint = utils_1.initTestEndpoint(serviceName); const getInstancesPerCluster = async (emr, clusterId) => new Promise(resolve => { const instanceList = []; const listInstancesOpts = { ClusterId: clusterId }; const listInstances = (marker) => { if (marker) { listInstancesOpts.Marker = marker; } try { emr.listInstances(listInstancesOpts, (err, data) => { if (err) { errorLog.generateAwsErrorLog({ functionName: 'emr:listInstances', err, }); } /** * No EMR instances data for this cluster */ if (isEmpty_1.default(data)) { return resolve([]); } const { Instances = [], Marker: nextToken } = data; instanceList.push(...Instances); if (nextToken) { logger.debug(lt.foundAnotherTwoThousandInstances(clusterId)); listInstances(nextToken); } else { resolve(instanceList); } }); } catch (error) { resolve([]); } }; listInstances(); }); exports.default = async ({ regions, config, rawData, }) => new Promise(async (resolve) => { const emrInstances = []; let emrClusters = []; const existingData = flatMap_1.default(rawData.find(({ name }) => name === services_1.default.emrCluster)?.data) || []; if (isEmpty_1.default(existingData)) { /** * Get all the EMR clusters for this region */ await Promise.all(regions.split(',').map(region => new Promise(async (resolveEmrClusters) => { const emr = new emr_1.default({ ...config, region, endpoint }); const clusterList = await data_1.getEmrClusters(emr, region); if (!isEmpty_1.default(clusterList)) { emrClusters.push(...clusterList.map(cluster => ({ Id: cluster.Id, region, }))); } resolveEmrClusters(); }))); } else { // Uses existing data emrClusters = existingData; } logger.debug(lt.fetchedEmrClusters(emrClusters.length)); /** * Get the instances for each EMR cluster */ let numOfInstances = 0; const emrInstancePromises = emrClusters.map((cluster) => new Promise(async (resolveInstances) => { const emr = new emr_1.default({ ...config, region: cluster.region, endpoint }); const instances = await getInstancesPerCluster(emr, cluster.Id); if (!isEmpty_1.default(instances)) { numOfInstances += instances.length; emrInstances.push(...instances.map(instance => ({ region: cluster.region, ...instance, }))); } resolveInstances(); })); await Promise.all(emrInstancePromises); errorLog.reset(); logger.debug(lt.fetchedEmrClusterInstances(numOfInstances)); resolve(groupBy_1.default(emrInstances, 'region')); });