Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ AWSResourceCostsAggregation.aggregateEntityCostsByOrg = aggregateEntityCostsByOr
AWSResourceCostsAggregation.aggregateEntityCostsByProvider = aggregateEntityCostsByProvider
AWSResourceCostsAggregation.aggregateEntityCostTrendByOrg = aggregateEntityCostTrendByOrg
AWSResourceCostsAggregation.aggregateEntityCostTrendByProvider = aggregateEntityCostTrendByProvider
AWSResourceCostsAggregation.aggregateResourceCostsForAllPeriods = aggregateResourceCostsForAllPeriods

// AWSResourceCostsAggregation.execute()

Expand Down Expand Up @@ -206,8 +207,7 @@ function updateResourceCosts(provider, downloadedCSVPath, callback) {
resourceService.getAllResourcesForProvider(provider, next)
},
function(resources, next) {
resourceService.updateAWSResourceCostsFromCSV(provider, resources, downloadedCSVPath,
AWSResourceCostsAggregation.currentCronRunTime, next)
AWSResourceCostsAggregation.aggregateResourceCostsForAllPeriods(provider, resources, next)
},
function(next) {
AWSProvider.updateLastBillUpdateTime(provider._id,
Expand All @@ -223,6 +223,13 @@ function updateResourceCosts(provider, downloadedCSVPath, callback) {
})
}

// Only aggregates monthly cost as of now and updates resource/instance collections
// @TODO To be aggregated for all periods
function aggregateResourceCostsForAllPeriods(provider, resources, callback) {
resourceService.aggregateResourceCostsForPeriod(provider, resources, 'month',
AWSResourceCostsAggregation.currentCronRunTime, callback)
}

function aggregateEntityCostsByOrg(orgs, callback) {
// var catalystEntityHierarchy = appConfig.catalystEntityHierarchy
var costAggregationPeriods = appConfig.costAggregationPeriods
Expand Down
4 changes: 1 addition & 3 deletions server/app/model/resource-costs/resource-costs.js
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ var ResourceCostsSchema = new Schema({
},
billLineItemId: {
type: Number,
required: true,
required: false,
trim: true
},
platformDetails: {
Expand Down Expand Up @@ -137,8 +137,6 @@ var ResourceCostsSchema = new Schema({
})

ResourceCostsSchema.index({'platformDetails.serviceId' : 1})
ResourceCostsSchema.index({'organizationId': 1, 'providerId': 1, 'startTime': 1,
'billIntervalId': 1, 'billLineItemId': 1, 'interval': 1}, {'unique': true})

ResourceCostsSchema.statics.save = function save(resourceCostData, callback) {
var resourceCosts = new ResourceCosts(resourceCostData)
Expand Down
49 changes: 48 additions & 1 deletion server/app/services/resourceService.js
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ resourceService.getEC2InstancesInfo=getEC2InstancesInfo;
resourceService.getAllResourcesForProvider = getAllResourcesForProvider;
resourceService.updateAWSResourceCostsFromCSV = updateAWSResourceCostsFromCSV
resourceService.updateDomainNameForInstance = updateDomainNameForInstance
resourceService.aggregateResourceCostsForPeriod = aggregateResourceCostsForPeriod

// @TODO To be cached if needed. In memory data will not exceed 200MB for upto 2000 instances.
function getAllResourcesForProvider(provider, next) {
Expand Down Expand Up @@ -193,10 +194,56 @@ function updateAWSResourceCostsFromCSV(provider, resources, downlaodedCSVPath, u
if(err) {
callback(err)
} else {
callback()
callback(null, resources)
}
})
}

function aggregateResourceCostsForPeriod(provider, resources, period, endTime, callback) {
var catalystEntityHierarchy = appConfig.catalystEntityHierarchy
var date = new Date()
var billIntervalId = date.getFullYear() + '-' + (date.getMonth() + 1)

var offset = (new Date()).getTimezoneOffset()*60000
var startTime = dateUtil.getStartOfPeriod(period, endTime)

var query = { 'providerId': provider._id.toString() }
query.startTime = {$gte: Date.parse(startTime) + offset}
query.endTime = {$lte: Date.parse(endTime) + offset}

async.waterfall([
function(next) {
resourceCost.aggregate([
{$match: query},
{$group: {_id: "$" + catalystEntityHierarchy['resource'].key,
totalCost: {$sum: "$cost"}}}
],next)
},
function(resourceCosts, next) {
async.forEach(resourceCosts, function(resourceCost, next1) {
if(resourceCost._id in resources) {
resources[resourceCost._id].cost = {
aggregateInstanceCost: Math.round(resourceCost.totalCost * 100) / 100,
currency:'USD',
symbol:"$"
}
resources[resourceCost._id].save(next1)
}
}, function(err) {
if(err) {
next(err)
} else {
next()
}
})
}
], function(err) {
if(err) {
callback(err)
} else {
callback()
}
})
}

function getCostForServices_deprecated(provider,callback) {
Expand Down
2 changes: 1 addition & 1 deletion server/install.js
Original file line number Diff line number Diff line change
Expand Up @@ -471,7 +471,7 @@ function getDefaultsConfig() {
key: 'platformDetails.region'
},
resource: {
key: 'resourceId'
key: 'platformDetails.instanceId'
}
},
costAggregationPeriods: {
Expand Down