def aws_cost_by_resource_m(accounts, month, category): try: date_from = datetime.strptime(month, "%Y-%m-%d") assert category[0] in ['<', '>'] cat = int(category[1:]) except: return jsonify(error='Not found.'), 404 raw_data = AWSDetailedLineitem.get_cost_by_resource( [account.get_aws_user_id() for account in accounts], date_from=date_from) def transform(r): r['resource_name'] = r['resource'] return r minus = category[0] == '<' data = [ transform(r) for r in raw_data if (minus and cat > r['cost'] >= cat / 10) or ( not minus and r['cost'] > cat) ] if len(data) <= 0: return jsonify(error='Not found.'), 404 return jsonify( category=dict(resources=data, total=sum([x['cost'] for x in data])))
def aws_cost_by_resource_month_categories_m(accounts, month): try: date_from = datetime.strptime(month, "%Y-%m-%d") except: return jsonify(error='Not found.'), 404 raw_data = AWSDetailedLineitem.get_cost_by_resource([account.get_aws_user_id() for account in accounts], date_from=date_from) cat = [] max_cat = 0 for new in raw_data: x = 1 while new['cost'] > x: x *= 10 if x >= max_cat: max_cat = x elif '<{}'.format(x) not in cat: cat.append('<{}'.format(x)) cat.append('>{}'.format(max_cat / 10)) return jsonify(categories=cat)
def aws_cost_by_resource_search_m(accounts, month, search): try: date_from = datetime.strptime(month, "%Y-%m-%d") except: return jsonify(error='Not found.'), 404 raw_data = [ AWSDetailedLineitem.get_cost_by_resource(account.get_aws_user_id(), date_from=date_from, search=search) for account in accounts ] def transform(r): r['resource_name'] = r['resource'] return r data = [transform(r) for raw in raw_data for r in raw] if not len(data): return jsonify(error='Not found.'), 404 return jsonify(search_result=data)
def aws_cost_by_resource_month_chart_m(accounts, month): # TODO: Use ES agg to categorize try: date_from = datetime.strptime(month, "%Y-%m-%d") except: return jsonify(error='Not found.'), 404 raw_data = [ AWSDetailedLineitem.get_cost_by_resource(account.get_aws_user_id(), date_from=date_from) for account in accounts ] data = [] def get_cat_with_cost(cost): x = 1 while cost > x: x *= 10 return x def add_resource_in_data(new): new_cat = get_cat_with_cost(new['cost']) for cat in data: if cat['category'] == '<{}'.format(new_cat): cat['total'] += new['cost'] return data.append(dict(category='<{}'.format(new_cat), total=new['cost'])) for one in raw_data: for new in one: add_resource_in_data(new) if not len(data): return jsonify(message=get_next_update_estimation_message_aws( accounts, AWS_KEY_PROCESSING_INTERVAL_HOURS)) max_cat = 0 for i in range(len(data)): if len(data[i]['category']) > len(data[max_cat]['category']): max_cat = i data[max_cat]['category'] = data[max_cat]['category'][:-1] data[max_cat]['category'] = data[max_cat]['category'].replace('<', '>', 1) return jsonify(categories=data)