diff options
author | Jenkins <jenkins@review.openstack.org> | 2014-04-09 15:53:28 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2014-04-09 15:53:28 +0000 |
commit | e75b1f459c549000f325b255288f06c884df0753 (patch) | |
tree | ed9b814f86abc324772d31079dc028b65ac65a39 /tuskar_ui | |
parent | 9db0e052d80cd708ec08afbb01c89cd642285a87 (diff) | |
parent | 5a01c7adec86e1a802bb6bd132c0f4db4c4c1971 (diff) | |
download | tuskar-ui-e75b1f459c549000f325b255288f06c884df0753.tar.gz |
Merge "Health state improvements"
Diffstat (limited to 'tuskar_ui')
-rw-r--r-- | tuskar_ui/api.py | 24 | ||||
-rw-r--r-- | tuskar_ui/infrastructure/nodes/tabs.py | 45 | ||||
-rw-r--r-- | tuskar_ui/infrastructure/nodes/templates/nodes/_overview.html | 28 | ||||
-rw-r--r-- | tuskar_ui/test/api_tests/tuskar_tests.py | 13 | ||||
-rw-r--r-- | tuskar_ui/test/test_data/tuskar_data.py | 2 |
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, |