From a57fa800542ed2ee61b931bc6d2991eca0d946e6 Mon Sep 17 00:00:00 2001 From: Ana Krivokapic Date: Fri, 26 Jun 2015 17:15:43 +0200 Subject: Properly filter Ceilometer statistics for charts We used to filter by image_id for roles, back when we had different images for different roles. As we are now using the same image for all the roles, that way of filtering does not work any longer. We need to filter by instance UUIDs instead. Change-Id: Ie4f26a29beaaf67aa3b36bb82961b491d31c95a0 --- tuskar_ui/infrastructure/nodes/views.py | 16 +++++++++++----- tuskar_ui/infrastructure/roles/views.py | 29 ++++++++++++++++------------- tuskar_ui/utils/metering.py | 21 ++++++++------------- tuskar_ui/utils/tests.py | 4 +++- 4 files changed, 38 insertions(+), 32 deletions(-) diff --git a/tuskar_ui/infrastructure/nodes/views.py b/tuskar_ui/infrastructure/nodes/views.py index 6596a773..eece7bfb 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 9c7baa1e..78a73065 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 41231056..2f9927ef 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 2bba88f2..71a59e30 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, [ -- cgit v1.2.1