diff --git a/tuskar_ui/infrastructure/nodes/views.py b/tuskar_ui/infrastructure/nodes/views.py index 6596a7736..eece7bfbb 100644 --- a/tuskar_ui/infrastructure/nodes/views.py +++ b/tuskar_ui/infrastructure/nodes/views.py @@ -179,15 +179,21 @@ class PerformanceView(base.TemplateView): node_uuid = kwargs.get('node_uuid', None) if node_uuid: node = api.node.Node.get(request, node_uuid) - instance_uuid = node.instance_uuid + instance_uuids = [node.instance_uuid] else: # Aggregated stats for all nodes - instance_uuid = None + instance_uuids = [] json_output = metering_utils.get_nodes_stats( - request, node_uuid, instance_uuid, image_uuid=None, meter=meter, - date_options=date_options, date_from=date_from, date_to=date_to, - stats_attr=stats_attr, barchart=barchart) + request=request, + node_uuid=node_uuid, + instance_uuids=instance_uuids, + meter=meter, + date_options=date_options, + date_from=date_from, + date_to=date_to, + stats_attr=stats_attr, + barchart=barchart) return django.http.HttpResponse( json.dumps(json_output), content_type='application/json') diff --git a/tuskar_ui/infrastructure/roles/views.py b/tuskar_ui/infrastructure/roles/views.py index 9c7baa1e8..78a730652 100644 --- a/tuskar_ui/infrastructure/roles/views.py +++ b/tuskar_ui/infrastructure/roles/views.py @@ -168,21 +168,24 @@ class PerformanceView(base.TemplateView, views.RoleMixin, views.StackMixin): stats_attr = request.GET.get('stats_attr', 'avg') barchart = bool(request.GET.get('barchart')) - plan = api.tuskar.Plan.get_the_plan(self.request) - role = self.get_role(None) - role.image(plan) + role = self.get_role() + stack = self.get_stack() + instances = stack.resources(role=role, with_joins=True) - try: - image = role.image(plan) - image_uuid = image.id - except AttributeError: - json_output = None - else: + if instances: + instance_uuids = [i.physical_resource_id for i in instances] json_output = metering_utils.get_nodes_stats( - request, node_uuid=None, instance_uuid=None, - image_uuid=image_uuid, meter=meter, date_options=date_options, - date_from=date_from, date_to=date_to, stats_attr=stats_attr, - barchart=barchart, group_by='image_id') + request=request, + node_uuid=None, + instance_uuids=instance_uuids, + meter=meter, + date_options=date_options, + date_from=date_from, + date_to=date_to, + stats_attr=stats_attr, + barchart=barchart) + else: + json_output = None return http.HttpResponse(json.dumps(json_output), content_type='application/json') diff --git a/tuskar_ui/utils/metering.py b/tuskar_ui/utils/metering.py index 412310563..2f9927efd 100644 --- a/tuskar_ui/utils/metering.py +++ b/tuskar_ui/utils/metering.py @@ -177,13 +177,13 @@ def create_json_output(series, barchart, unit, date_from, date_to): return json_output -def get_nodes_stats(request, node_uuid, instance_uuid, image_uuid, meter, +def get_nodes_stats(request, node_uuid, instance_uuids, meter, date_options=None, date_from=None, date_to=None, stats_attr=None, barchart=None, group_by=None): series = [] meter_list, unit = get_meter_list_and_unit(request, meter) - if instance_uuid or image_uuid: + if instance_uuids: if 'ipmi' in meter: # For IPMI metrics, a resource ID is made of node UUID concatenated # with the metric description. E.g: @@ -199,17 +199,12 @@ def get_nodes_stats(request, node_uuid, instance_uuid, image_uuid, meter, else: # For SNMP metrics, a resource ID matches exactly the UUID of the # associated instance - if group_by == "image_id": - query = {} - image_query = [{"field": "metadata.%s" % group_by, - "op": "eq", - "value": image_uuid}] - query[instance_uuid] = image_query - else: - query = [{'field': 'resource_id', - 'op': 'eq', - 'value': instance_uuid}] - queries = [query] + queries = [ + [{'field': 'resource_id', + 'op': 'eq', + 'value': instance_uuid}] + for instance_uuid in instance_uuids + ] else: # query will be aggregated across all resources group_by = "all" diff --git a/tuskar_ui/utils/tests.py b/tuskar_ui/utils/tests.py index 2bba88f2a..71a59e304 100644 --- a/tuskar_ui/utils/tests.py +++ b/tuskar_ui/utils/tests.py @@ -288,7 +288,9 @@ class MeteringTests(helpers.TestCase): return_value=('from date', 'to date'), ): ret = metering.get_nodes_stats( - request, node_uuid='abc', instance_uuid='def', image_uuid=None, + request=request, + node_uuid='abc', + instance_uuids=['def'], meter='foo.bar') self.assertEqual(ret, '') self.assertEqual(create_json_output.call_args_list, [