@csermet/multiprovider
Version:
cloud-graph provider plugin for AWS used to fetch AWS cloud data.
115 lines (114 loc) • 5.36 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.enrichInstanceWithBillingData = exports.connectAWSServicesToAccount = void 0;
const get_1 = __importDefault(require("lodash/get"));
const isEmpty_1 = __importDefault(require("lodash/isEmpty"));
const regions_1 = require("../../enums/regions");
const services_1 = __importDefault(require("../../enums/services"));
const utils_1 = require("../../utils");
const connections_1 = __importDefault(require("../account/connections"));
/**
* Generates AWS services connections to Scanned accounts
* @param {EnhancerConfig} accounts Scanned accounts
* @param {EnhancerConfig} data AWS Services fetched data
* @returns {ProviderData}
*/
const connectAWSServicesToAccount = ({ accounts, data, }) => {
let accountsConnections = {};
for (const account of accounts) {
const connections = connections_1.default({
service: account,
data: data.entities,
});
accountsConnections = {
...accountsConnections,
...connections,
};
}
return {
entities: data.entities,
connections: utils_1.checkAndMergeConnections(data.connections, accountsConnections),
};
};
exports.connectAWSServicesToAccount = connectAWSServicesToAccount;
/**
* Adds Billing data to EC2 instances
* @param {EnhancerConfig}
* @returns {ProviderData}
*/
const enrichInstanceWithBillingData = ({ rawData, configuredRegions, data: { entities, connections }, }) => {
const billingRegion = regions_1.regionMap.usEast1;
let result = entities;
if (configuredRegions.includes(billingRegion)) {
const billingArray = rawData.find(({ name }) => name === services_1.default.billing)?.data?.[billingRegion] ?? [];
for (const billing of billingArray) {
const individualData = get_1.default(billing, ['individualData'], undefined);
if (individualData) {
for (const [key, value] of Object.entries(individualData)) {
if (key.includes('natgateway') && !isEmpty_1.default()) {
// this billing data is for natgateway, search for the instance
const { name, mutation, data: nats, } = result.find(({ name: instanceName }) => instanceName === services_1.default.nat) ?? {};
if (!isEmpty_1.default(nats)) {
const natsWithBilling = nats.map(val => {
if (key.includes(val.id)) {
return {
...val,
dailyCost: {
cost: value?.cost,
currency: value?.currency,
formattedCost: value?.formattedCost,
},
};
}
return val;
});
result = result.filter(({ name: serviceName }) => serviceName !== services_1.default.nat);
result.push({
name,
mutation,
data: natsWithBilling,
});
}
}
if (key.includes('i-')) {
// this billing data is for ec2, search for the instance
const { name, mutation, data: ec2s, } = result.find(({ name: instanceName }) => instanceName === services_1.default.ec2Instance) ?? {};
if (!isEmpty_1.default(ec2s)) {
const ec2WithBilling = ec2s.map(val => {
if (key === val.id) {
return {
...val,
dailyCost: {
cost: value?.cost,
currency: value?.currency,
formattedCost: value?.formattedCost,
},
};
}
return val;
});
result = result.filter(({ name: serviceName }) => serviceName !== services_1.default.ec2Instance);
result.push({
name,
mutation,
data: ec2WithBilling,
});
}
}
}
}
}
}
return {
entities: result,
connections,
};
};
exports.enrichInstanceWithBillingData = enrichInstanceWithBillingData;
exports.default = [
{ name: 'billing', enhancer: exports.enrichInstanceWithBillingData },
{ name: 'account', enhancer: exports.connectAWSServicesToAccount },
];