def export(self): try: self.log("Starting usage export. Date: " + str(self.date)) date_str = self.date.isoformat() usage_records = ELKClient().find_usage_records( self.region, None, date_str, date_str) records = UsageRecordBuilder(self.region).build_usage_report( usage_records, date_str, date_str) base_document = self.create_base_document() records_grouped_by_project = dict() for record in records['usage']: record_list = records_grouped_by_project.get( record['project_id'], []) if not record_list: records_grouped_by_project[ record['project_id']] = record_list record_list.append(record) for project_id, record_list in records_grouped_by_project.iteritems( ): project = Project.find_by_uuid(project_id) base_document['distribuicao'].append( self.create_distribution(project, record_list)) self._send(base_document) except: self.log("Error", 'exception')
def build_usage_report(self, aggregations, start, end): records = {"usage": []} records_grouped_by_type = {'Running VM': [], 'Allocated VM': []} for project_bucket in aggregations['by_project']['buckets']: project_id = project_bucket['key'] project = next( (x for x in self.projects if x.get('id') == project_id), dict()) local_project = Project.find_by_uuid(project_id) for resource_type_bucket in project_bucket['by_type']['buckets']: usage_type = resource_type_bucket['key'] for offering_bucket in resource_type_bucket['by_offering'][ 'buckets']: offering_struct = offering_bucket['key'].split('|') offering_id = offering_struct[0] or None offering_name = offering_struct[1] or None offering_cpu = offering_struct[2] or None offering_ram = offering_struct[3] or None raw_usage = float(offering_bucket['rawusage_sum']['value']) if raw_usage > app.config['USAGE_MINIMUM_TIME']: account = project.get('account', '-') domain = project.get('domain', '-') usage_record = { 'project_id': local_project.uuid if local_project else project_id, 'project_name': local_project.name if local_project else '-', 'type': usage_type, 'start_date': start, 'end_date': end, 'offering_id': offering_id, 'offering_name': offering_name, 'offering_cpu': offering_cpu, 'offering_ram': offering_ram, 'usage': raw_usage, 'account': account, 'domain': domain, 'region': self.region.upper() } records['usage'].append(usage_record) records_grouped_by_type[usage_type].append( usage_record) self._calculate_allocated_vm_time(records_grouped_by_type, records) return records