コード例 #1
0
ファイル: filters.py プロジェクト: jomalsan/cloud-custodian
    def _query_costs(self):
        manager = self.manager
        is_resource_group = manager.type == 'resourcegroup'

        client = manager.get_client(
            'azure.mgmt.costmanagement.CostManagementClient')

        aggregation = {'totalCost': QueryAggregation(name='PreTaxCost')}

        grouping = [
            QueryGrouping(type='Dimension',
                          name='ResourceGroupName'
                          if is_resource_group else 'ResourceId')
        ]

        query_filter = None
        if not is_resource_group:
            query_filter = QueryFilter(dimension=QueryComparisonExpression(
                name='ResourceType',
                operator='In',
                values=[manager.resource_type.resource_type]))
            if 'dimension' in query_filter._attribute_map:
                query_filter._attribute_map['dimension']['key'] = 'dimensions'

        dataset = QueryDataset(grouping=grouping,
                               aggregation=aggregation,
                               filter=query_filter)

        timeframe = self.data['timeframe']
        time_period = None

        if timeframe not in CostFilter.preset_timeframes:
            end_time = utcnow().replace(hour=0,
                                        minute=0,
                                        second=0,
                                        microsecond=0)
            start_time = end_time - timedelta(days=timeframe)
            timeframe = 'Custom'
            time_period = QueryTimePeriod(from_property=start_time,
                                          to=end_time)

        definition = QueryDefinition(timeframe=timeframe,
                                     time_period=time_period,
                                     dataset=dataset)

        subscription_id = manager.get_session().get_subscription_id()

        scope = '/subscriptions/' + subscription_id

        query = client.query.usage_by_scope(scope, definition)

        if hasattr(query, '_derserializer'):
            original = query._derserializer._deserialize
            query._derserializer._deserialize = lambda target, data: \
                original(target, self.fix_wrap_rest_response(data))

        result_list = list(query)[0]
        result_list = [{
            result_list.columns[i].name: v
            for i, v in enumerate(row)
        } for row in result_list.rows]

        for r in result_list:
            if 'ResourceGroupName' in r:
                r['ResourceId'] = scope + '/resourcegroups/' + r.pop(
                    'ResourceGroupName')
            r['ResourceId'] = r['ResourceId'].lower()

        return result_list