UNPKG

@csermet/multiprovider

Version:

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

143 lines (142 loc) 5.45 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.getDomainNamesForRegion = void 0; const sdk_1 = __importDefault(require("@cloudgraph/sdk")); const apigatewayv2_1 = __importDefault(require("aws-sdk/clients/apigatewayv2")); const isEmpty_1 = __importDefault(require("lodash/isEmpty")); const groupBy_1 = __importDefault(require("lodash/groupBy")); 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 MAX_DOMAIN_NAMES = '500'; const serviceName = 'API Gateway Domain Name'; const errorLog = new errorLog_1.default(serviceName); const endpoint = utils_1.initTestEndpoint(serviceName); const customRetrySettings = utils_1.setAwsRetryOptions({ baseDelay: constants_1.API_GATEWAY_CUSTOM_DELAY, }); const getDomainNamesForRegion = async (apiGw) => new Promise(async (resolve) => { const domainNameList = []; const getDomainNamesOpts = {}; const listAllDomainNames = (token) => { getDomainNamesOpts.MaxResults = MAX_DOMAIN_NAMES; if (token) { getDomainNamesOpts.NextToken = token; } try { apiGw.getDomainNames(getDomainNamesOpts, (err, data) => { if (err) { errorLog.generateAwsErrorLog({ functionName: 'apiGw:getDomainNames', err, }); } if (isEmpty_1.default(data)) { return resolve([]); } const { NextToken: nextToken, Items: items = [] } = data || {}; if (isEmpty_1.default(items)) { return resolve([]); } logger.debug(lt.fetchedApiGwDomainNames(items.length)); domainNameList.push(...items); if (nextToken) { listAllDomainNames(nextToken); } else { resolve(domainNameList); } }); } catch (error) { resolve([]); } }; listAllDomainNames(); }); exports.getDomainNamesForRegion = getDomainNamesForRegion; const getAPIMappings = (apiGw, domainName) => new Promise(resolve => { const apiMappingList = []; const args = { DomainName: domainName }; const listAllAPIMappings = (token) => { if (token) { args.NextToken = token; } try { apiGw.getApiMappings(args, (err, data) => { if (err) { errorLog.generateAwsErrorLog({ functionName: 'apiGw:getApiMappings', err, }); } if (isEmpty_1.default(data)) { return resolve({ domainName, apiMappings: [], }); } const { NextToken: nextToken, Items: apiMappings = [] } = data || {}; if (isEmpty_1.default(apiMappings)) { return resolve({ domainName, apiMappings: [], }); } apiMappingList.push(...apiMappings); if (nextToken) { listAllAPIMappings(nextToken); } else { resolve({ domainName, apiMappings: apiMappingList }); } }); } catch (error) { resolve({ domainName, apiMappings: [], }); } }; listAllAPIMappings(); }); exports.default = async ({ regions, config, account, }) => new Promise(async (resolve) => { const domainNamesResult = []; const regionPromises = regions.split(',').map(region => { const apiGw = new apigatewayv2_1.default({ ...config, region, endpoint, ...customRetrySettings, }); return new Promise(async (resolveTransitGatewayData) => { // Get Custom Domains Data const customDomains = await exports.getDomainNamesForRegion(apiGw); const mappingPromises = customDomains.map(({ DomainName: domainName }) => getAPIMappings(apiGw, domainName)); const mappingData = await Promise.all(mappingPromises); if (!isEmpty_1.default(customDomains)) { for (const domain of customDomains) { domainNamesResult.push({ ...domain, ApiMappings: mappingData?.find(m => m.domainName === domain.DomainName) ?.apiMappings || [], region, Tags: domain.Tags, account, }); } } resolveTransitGatewayData(); }); }); await Promise.all(regionPromises); errorLog.reset(); resolve(groupBy_1.default(domainNamesResult, 'region')); });