diff --git a/tuskar_ui/infrastructure/nodes/tabs.py b/tuskar_ui/infrastructure/nodes/tabs.py
index 6709c3b7f..42a28772b 100644
--- a/tuskar_ui/infrastructure/nodes/tabs.py
+++ b/tuskar_ui/infrastructure/nodes/tabs.py
@@ -50,7 +50,7 @@ class OverviewTab(tabs.Tab):
total_nodes_healthy = api.node.filter_nodes(total_nodes, healthy=True)
total_nodes_up = api.node.filter_nodes(total_nodes, power_state=True)
- return {
+ context = {
'cpus': cpus,
'memory_gb': memory_mb / 1024.0,
'local_gb': local_gb,
@@ -66,6 +66,23 @@ class OverviewTab(tabs.Tab):
'free_nodes_down': free_nodes_down,
}
+ if api_base.is_service_enabled(self.request, 'metering'):
+ context['meter_conf'] = (
+ (_('System Load'),
+ metering_utils.url_part('hardware.cpu.load.1min', False),
+ None),
+ (_('CPU Utilization'),
+ metering_utils.url_part('hardware.system_stats.cpu.util',
+ True),
+ '100'),
+ (_('Swap Utilization'),
+ metering_utils.url_part('hardware.memory.swap.util',
+ True),
+ '100'),
+ )
+
+ return context
+
class RegisteredTab(tabs.TableTab):
table_classes = (tables.RegisteredNodesTable,)
diff --git a/tuskar_ui/infrastructure/nodes/templates/nodes/_overview.html b/tuskar_ui/infrastructure/nodes/templates/nodes/_overview.html
index 724a0fdce..75553ef7f 100644
--- a/tuskar_ui/infrastructure/nodes/templates/nodes/_overview.html
+++ b/tuskar_ui/infrastructure/nodes/templates/nodes/_overview.html
@@ -46,3 +46,104 @@
+
+
+
+
{% trans "Provisioned nodes" %}
+ {% if meter_conf %}
+ {% url 'horizon:infrastructure:nodes:nodes_performance' as node_perf_url %}
+
+
+
+
+
+
+ {% for meter_label, url_part, y_max in meter_conf %}
+
+ {% include "infrastructure/_performance_chart.html" with label=meter_label y_max=y_max url=node_perf_url|add:"?"|add:url_part only %}
+
+ {% endfor %}
+
+ {% else %}
+
{% trans 'Metering service is not enabled.' %}
+ {% endif %}
+
+
+
diff --git a/tuskar_ui/infrastructure/nodes/urls.py b/tuskar_ui/infrastructure/nodes/urls.py
index 8ef7ee21d..6260cbb4c 100644
--- a/tuskar_ui/infrastructure/nodes/urls.py
+++ b/tuskar_ui/infrastructure/nodes/urls.py
@@ -24,6 +24,8 @@ urlpatterns = urls.patterns(
name='register'),
urls.url(r'^auto-discover/$', views.AutoDiscoverView.as_view(),
name='auto-discover'),
+ urls.url(r'^nodes_performance/$',
+ views.PerformanceView.as_view(), name='nodes_performance'),
urls.url(r'^(?P[^/]+)/$', views.DetailView.as_view(),
name='detail'),
urls.url(r'^(?P[^/]+)/performance/$',
diff --git a/tuskar_ui/infrastructure/nodes/views.py b/tuskar_ui/infrastructure/nodes/views.py
index 8afae03a9..6038e35b9 100644
--- a/tuskar_ui/infrastructure/nodes/views.py
+++ b/tuskar_ui/infrastructure/nodes/views.py
@@ -108,18 +108,21 @@ class PerformanceView(base.TemplateView):
stats_attr = request.GET.get('stats_attr', 'avg')
barchart = bool(request.GET.get('barchart'))
- node_uuid = kwargs.get('node_uuid')
- node = api.node.Node.get(request, node_uuid)
-
- try:
- instance_uuid = node.instance_uuid
- except AttributeError:
- json_output = None
+ node_uuid = kwargs.get('node_uuid', None)
+ if node_uuid:
+ node = api.node.Node.get(request, node_uuid)
+ try:
+ instance_uuid = node.instance_uuid
+ except AttributeError:
+ json_output = None
else:
- json_output = metering_utils.get_nodes_stats(
- request, instance_uuid, meter, date_options=date_options,
- date_from=date_from, date_to=date_to, stats_attr=stats_attr,
- barchart=barchart)
+ # Aggregated stats for all nodes
+ instance_uuid = None
+
+ json_output = metering_utils.get_nodes_stats(
+ request, instance_uuid, meter, date_options=date_options,
+ date_from=date_from, date_to=date_to,
+ stats_attr=stats_attr, barchart=barchart)
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 5a8319221..a766ebe7e 100644
--- a/tuskar_ui/utils/metering.py
+++ b/tuskar_ui/utils/metering.py
@@ -270,6 +270,11 @@ def get_nodes_stats(request, uuid, meter, date_options=None, date_from=None,
query = [{'field': 'resource_id',
'op': 'eq',
'value': uuid}]
+ else:
+ # query will be aggregated across all resources
+ group_by = "all"
+ query = {}
+ query['all'] = []
# Disk and Network I/O: data from 2 meters in one chart
if meter == 'disk-io':