diff --git a/tuskar_ui/api/node.py b/tuskar_ui/api/node.py index d10401a2c..4f97e9489 100644 --- a/tuskar_ui/api/node.py +++ b/tuskar_ui/api/node.py @@ -63,7 +63,8 @@ def image_get(request, image_id): class IronicNode(base.APIResourceWrapper): _attrs = ('id', 'uuid', 'instance_uuid', 'driver', 'driver_info', - 'properties', 'power_state', 'maintenance') + 'properties', 'power_state', 'target_power_state', + 'maintenance') def __init__(self, apiresource, request=None): super(IronicNode, self).__init__(apiresource) @@ -390,6 +391,10 @@ class BareMetalNode(base.APIResourceWrapper): } return task_state_dict.get(self.task_state, 'off') + @cached_property + def target_power_state(self): + return None + @cached_property def driver(self): """Return driver for this BareMetalNode @@ -444,8 +449,8 @@ class NodeClient(object): class Node(base.APIResourceWrapper): _attrs = ('id', 'uuid', 'instance_uuid', 'driver', 'driver_info', - 'power_state', 'addresses', 'maintenance', 'cpus', - 'memory_mb', 'local_gb', 'cpu_arch') + 'power_state', 'target_power_state', 'addresses', 'maintenance', + 'cpus', 'memory_mb', 'local_gb', 'cpu_arch') def __init__(self, apiresource, request=None, **kwargs): """Initialize a Node diff --git a/tuskar_ui/infrastructure/nodes/tables.py b/tuskar_ui/infrastructure/nodes/tables.py index 722143fdb..737349bd0 100644 --- a/tuskar_ui/infrastructure/nodes/tables.py +++ b/tuskar_ui/infrastructure/nodes/tables.py @@ -109,6 +109,14 @@ def get_role_link(datum): kwargs={'role_id': datum.role_id}) +def get_power_state_with_transition(node): + if node.target_power_state and ( + node.power_state != node.target_power_state): + return "{0} -> {1}".format( + node.power_state, node.target_power_state) + return node.power_state + + class RegisteredNodesTable(tables.DataTable): node = tables.Column('uuid', link="horizon:infrastructure:nodes:detail", @@ -121,14 +129,8 @@ class RegisteredNodesTable(tables.DataTable): role_name = tables.Column('role_name', link=get_role_link, verbose_name=_("Deployment Role")) - power_state = tables.Column("power_state", - verbose_name=_("Power"), - status=True, - status_choices=( - ('on', True), - ('off', False), - ('rebooting', None) - )) + power_state = tables.Column(get_power_state_with_transition, + verbose_name=_("Power")) class Meta: name = "nodes_table" diff --git a/tuskar_ui/test/test_data/node_data.py b/tuskar_ui/test/test_data/node_data.py index 36f674a62..ef2c80791 100644 --- a/tuskar_ui/test/test_data/node_data.py +++ b/tuskar_ui/test/test_data/node_data.py @@ -134,6 +134,7 @@ def data(TEST): 'cpu_arch': 'x86_64', }, 'power_state': 'on', + 'target_power_state': 'on', 'maintenance': None, 'newly_discovered': None, }) @@ -156,6 +157,7 @@ def data(TEST): 'cpu_arch': 'x86_64', }, 'power_state': 'on', + 'target_power_state': 'on', 'maintenance': None, 'newly_discovered': None, }) @@ -178,6 +180,7 @@ def data(TEST): 'cpu_arch': 'x86_64', }, 'power_state': 'rebooting', + 'target_power_state': 'on', 'maintenance': None, 'newly_discovered': None, }) @@ -200,6 +203,7 @@ def data(TEST): 'cpu_arch': 'x86_64', }, 'power_state': 'on', + 'target_power_state': 'on', 'maintenance': None, 'newly_discovered': None, }) @@ -222,6 +226,7 @@ def data(TEST): 'cpu_arch': 'x86_64', }, 'power_state': 'error', + 'target_power_state': 'on', 'maintenance': None, 'newly_discovered': None, }) @@ -244,6 +249,7 @@ def data(TEST): 'cpu_arch': 'x86_64', }, 'power_state': 'on', + 'target_power_state': 'on', 'maintenance': None, 'newly_discovered': None, }) @@ -266,6 +272,7 @@ def data(TEST): 'cpu_arch': 'x86_64', }, 'power_state': 'off', + 'target_power_state': 'on', 'maintenance': True, 'newly_discovered': None, }) @@ -288,6 +295,7 @@ def data(TEST): 'cpu_arch': 'x86_64', }, 'power_state': 'on', + 'target_power_state': 'on', 'maintenance': True, 'newly_discovered': True, }) @@ -310,6 +318,7 @@ def data(TEST): 'cpu_arch': 'x86_64', }, 'power_state': 'on', + 'target_power_state': 'on', 'maintenance': True, 'newly_discovered': True, })