summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2014-04-09 15:53:28 +0000
committerGerrit Code Review <review@openstack.org>2014-04-09 15:53:28 +0000
commite75b1f459c549000f325b255288f06c884df0753 (patch)
treeed9b814f86abc324772d31079dc028b65ac65a39
parent9db0e052d80cd708ec08afbb01c89cd642285a87 (diff)
parent5a01c7adec86e1a802bb6bd132c0f4db4c4c1971 (diff)
downloadtuskar-ui-e75b1f459c549000f325b255288f06c884df0753.tar.gz
Merge "Health state improvements"
-rw-r--r--tuskar_ui/api.py24
-rw-r--r--tuskar_ui/infrastructure/nodes/tabs.py45
-rw-r--r--tuskar_ui/infrastructure/nodes/templates/nodes/_overview.html28
-rw-r--r--tuskar_ui/test/api_tests/tuskar_tests.py13
-rw-r--r--tuskar_ui/test/test_data/tuskar_data.py2
5 files changed, 74 insertions, 38 deletions
diff --git a/tuskar_ui/api.py b/tuskar_ui/api.py
index 38fe859d..11fe6d56 100644
--- a/tuskar_ui/api.py
+++ b/tuskar_ui/api.py
@@ -1037,3 +1037,27 @@ class OvercloudRole(base.APIResourceWrapper):
if attr not in self._attrs:
raise TypeError('Invalid parameter %r' % attr)
tuskarclient(request).overcloud_roles.update(self.id, **kwargs)
+
+
+def filter_nodes(nodes, healthy=None):
+ """Filters the list of Nodes and returns the filtered list.
+
+ :param nodes: list of tuskar_ui.api.Node objects to filter
+ :type nodes: list
+ :param healthy: retrieve all Nodes (healthy=None),
+ only the healthly ones (healthy=True),
+ or only those in an error state (healthy=False)
+ :type healthy: None or bool
+ :return: list of filtered tuskar_ui.api.Node objects
+ :rtype: list
+ """
+ error_states = ('deploy failed', 'error',)
+
+ if healthy is not None:
+ if healthy:
+ nodes = [node for node in nodes
+ if node.power_state not in error_states]
+ else:
+ nodes = [node for node in nodes
+ if node.power_state in error_states]
+ return nodes
diff --git a/tuskar_ui/infrastructure/nodes/tabs.py b/tuskar_ui/infrastructure/nodes/tabs.py
index 9d8f37f1..c1b60442 100644
--- a/tuskar_ui/infrastructure/nodes/tabs.py
+++ b/tuskar_ui/infrastructure/nodes/tabs.py
@@ -24,29 +24,24 @@ from tuskar_ui.infrastructure.nodes import tables
class OverviewTab(tabs.Tab):
name = _("Overview")
slug = "overview"
- template_name = ("infrastructure/nodes/_overview.html")
+ template_name = "infrastructure/nodes/_overview.html"
def get_context_data(self, request):
- free_nodes = api.Node.list(request, associated=False)
deployed_nodes = api.Node.list(request, associated=True)
-
- free_nodes_down = [node for node in free_nodes
- if node.power_state != 'on']
- deployed_nodes_down = [node for node in deployed_nodes
- if node.power_state != 'on']
-
+ free_nodes = api.Node.list(request, associated=False)
+ deployed_nodes_error = api.filter_nodes(deployed_nodes, healthy=False)
+ free_nodes_error = api.filter_nodes(free_nodes, healthy=False)
total_nodes = deployed_nodes + free_nodes
- total_nodes_down = deployed_nodes_down + free_nodes_down
- total_nodes_up = list(set(total_nodes) - set(total_nodes_down))
+ total_nodes_error = deployed_nodes_error + free_nodes_error
+ total_nodes_healthy = api.filter_nodes(total_nodes, healthy=True)
return {
- 'total_nodes': total_nodes,
- 'total_nodes_down': total_nodes_down,
- 'total_nodes_up': total_nodes_up,
+ 'total_nodes_healthy': total_nodes_healthy,
+ 'total_nodes_error': total_nodes_error,
'deployed_nodes': deployed_nodes,
- 'deployed_nodes_down': deployed_nodes_down,
+ 'deployed_nodes_error': deployed_nodes_error,
'free_nodes': free_nodes,
- 'free_nodes_down': free_nodes_down,
+ 'free_nodes_error': free_nodes_error,
}
@@ -54,17 +49,19 @@ class DeployedTab(tabs.TableTab):
table_classes = (tables.DeployedNodesTable,)
name = _("Deployed")
slug = "deployed"
- template_name = ("horizon/common/_detail_table.html")
+ template_name = "horizon/common/_detail_table.html"
def get_items_count(self):
- deployed_nodes_count = len(api.Node.list(self.request,
- associated=True))
- return deployed_nodes_count
+ return len(self.get_deployed_nodes_data())
def get_deployed_nodes_data(self):
redirect = urlresolvers.reverse('horizon:infrastructure:nodes:index')
deployed_nodes = api.Node.list(self.request, associated=True,
_error_redirect=redirect)
+
+ if 'errors' in self.request.GET:
+ return api.filter_nodes(deployed_nodes, healthy=False)
+
return deployed_nodes
@@ -72,17 +69,19 @@ class FreeTab(tabs.TableTab):
table_classes = (tables.FreeNodesTable,)
name = _("Free")
slug = "free"
- template_name = ("horizon/common/_detail_table.html")
+ template_name = "horizon/common/_detail_table.html"
def get_items_count(self):
- free_nodes_count = len(api.Node.list(self.request,
- associated=False))
- return free_nodes_count
+ return len(self.get_free_nodes_data())
def get_free_nodes_data(self):
redirect = urlresolvers.reverse('horizon:infrastructure:nodes:index')
free_nodes = api.Node.list(self.request, associated=False,
_error_redirect=redirect)
+
+ if 'errors' in self.request.GET:
+ return api.filter_nodes(free_nodes, healthy=False)
+
return free_nodes
diff --git a/tuskar_ui/infrastructure/nodes/templates/nodes/_overview.html b/tuskar_ui/infrastructure/nodes/templates/nodes/_overview.html
index 6b7dc65a..06952500 100644
--- a/tuskar_ui/infrastructure/nodes/templates/nodes/_overview.html
+++ b/tuskar_ui/infrastructure/nodes/templates/nodes/_overview.html
@@ -16,21 +16,21 @@
</a>
</td>
<td>
- {% if deployed_nodes_down %}
+ {% if deployed_nodes_error %}
<i class="icon-exclamation-sign"></i>
- {% if deployed_nodes_down|length == 1 %}
+ {% if deployed_nodes_error|length == 1 %}
{% comment %}
Replace id with uuid when ironicclient is used instead baremetalclient
{% endcomment %}
- {% url 'horizon:infrastructure:nodes:detail' deployed_nodes_down.0.id as node_detail_url %}
+ {% url 'horizon:infrastructure:nodes:detail' deployed_nodes_error.0.id as node_detail_url %}
{% else %}
{% url 'horizon:infrastructure:nodes:index' as nodes_index_url %}
{% endif %}
- {% blocktrans count down_count=deployed_nodes_down|length %}
- <a href="{{ node_detail_url }}">{{ down_count }} node</a> is down
+ {% blocktrans count error_count=deployed_nodes_error|length %}
+ <a href="{{ node_detail_url }}">{{ error_count }} node</a> with erros
{% plural %}
- <a href="{{ nodes_index_url }}?tab=nodes__deployed">{{ down_count }} nodes</a> are down
+ <a href="{{ nodes_index_url }}?tab=nodes__deployed&errors">{{ error_count }} nodes</a> with errors
{% endblocktrans %}
{% else %}
<i class="icon-ok"></i>
@@ -46,21 +46,21 @@
</a>
</td>
<td>
- {% if free_nodes_down %}
+ {% if free_nodes_error %}
<i class="icon-exclamation-sign"></i>
- {% if free_nodes_down|length == 1 %}
+ {% if free_nodes_error|length == 1 %}
{% comment %}
Replace id with uuid when ironicclient is used instead baremetalclient
{% endcomment %}
- {% url 'horizon:infrastructure:nodes:detail' free_nodes_down.0.id as node_detail_url %}
+ {% url 'horizon:infrastructure:nodes:detail' free_nodes_error.0.id as node_detail_url %}
{% else %}
{% url 'horizon:infrastructure:nodes:index' as nodes_index_url %}
{% endif %}
- {% blocktrans count down_count=free_nodes_down|length %}
- <a href="{{ node_detail_url }}">{{ down_count }} node</a> is down
+ {% blocktrans count error_count=free_nodes_error|length %}
+ <a href="{{ node_detail_url }}">{{ error_count }} node</a> with errors
{% plural %}
- <a href="{{ nodes_index_url }}?tab=nodes__free">{{ down_count }} nodes</a> are down
+ <a href="{{ nodes_index_url }}?tab=nodes__free&errors">{{ error_count }} nodes</a> with errors
{% endblocktrans %}
{% else %}
<i class="icon-ok"></i>
@@ -79,8 +79,8 @@
</div>
<div class="clear"></div>
<div class="widget">
- <h2>{% trans 'Power Status' %}</h2>
- <div class="d3_pie_chart_distribution" data-used="Running={{ total_nodes_up|length }}|Stopped={{ total_nodes_down|length }}"></div>
+ <h2>{% trans 'Health Status' %}</h2>
+ <div class="d3_pie_chart_distribution" data-used="Healthy={{ total_nodes_healthy|length }}|Defective={{ total_nodes_error|length }}"></div>
</div>
</div>
</div>
diff --git a/tuskar_ui/test/api_tests/tuskar_tests.py b/tuskar_ui/test/api_tests/tuskar_tests.py
index aa4e5c96..4a795a5d 100644
--- a/tuskar_ui/test/api_tests/tuskar_tests.py
+++ b/tuskar_ui/test/api_tests/tuskar_tests.py
@@ -370,3 +370,16 @@ class TuskarAPITests(test.APITestCase):
ret_val = api.OvercloudRole.get(self.request, role.id)
self.assertIsInstance(ret_val, api.OvercloudRole)
+
+ def test_filter_nodes(self):
+ nodes = self.ironicclient_nodes.list()
+ num_nodes = len(nodes)
+
+ with patch('novaclient.v1_1.contrib.baremetal.'
+ 'BareMetalNodeManager.list', return_value=nodes):
+ all_nodes = api.filter_nodes(nodes)
+ healthy_nodes = api.filter_nodes(nodes, healthy=True)
+ defective_nodes = api.filter_nodes(nodes, healthy=False)
+ self.assertEqual(len(all_nodes), num_nodes)
+ self.assertEqual(len(healthy_nodes), num_nodes - 1)
+ self.assertEqual(len(defective_nodes), 1)
diff --git a/tuskar_ui/test/test_data/tuskar_data.py b/tuskar_ui/test/test_data/tuskar_data.py
index 659b0931..15f9dd4f 100644
--- a/tuskar_ui/test/test_data/tuskar_data.py
+++ b/tuskar_ui/test/test_data/tuskar_data.py
@@ -243,7 +243,7 @@ def data(TEST):
'ram': '16',
'local_disk': '10',
},
- 'power_state': 'on',
+ 'power_state': 'error',
# FIXME(lsmola) nova-baremetal test attrs, delete when Ironic is in
"pm_address": None,