summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAna Krivokapic <akrivoka@redhat.com>2015-06-26 17:15:43 +0200
committerAna Krivokapic <akrivoka@redhat.com>2015-06-26 17:15:43 +0200
commita57fa800542ed2ee61b931bc6d2991eca0d946e6 (patch)
tree0d2783dffffa486a5cb3293500a0e59510e43158
parent513f0da17bc4714d8c93209dd71c1f52c2713a8b (diff)
downloadtuskar-ui-a57fa800542ed2ee61b931bc6d2991eca0d946e6.tar.gz
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
-rw-r--r--tuskar_ui/infrastructure/nodes/views.py16
-rw-r--r--tuskar_ui/infrastructure/roles/views.py29
-rw-r--r--tuskar_ui/utils/metering.py21
-rw-r--r--tuskar_ui/utils/tests.py4
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, [