Changed to support more states including operating_system.
Change-Id: If9d8a7696bf92d7fd31c11ced31d8772d669074b
Signed-off-by: Michael Walsh <micwalsh@us.ibm.com>
diff --git a/lib/state.py b/lib/state.py
index 73a35a2..e9b9fab 100755
--- a/lib/state.py
+++ b/lib/state.py
@@ -11,6 +11,7 @@
default_state:
default_state[chassis]: On
default_state[boot_progress]: OSStart
+ default_state[operating_system]: BootComplete
default_state[host]: Running
default_state[os_ping]: 1
default_state[os_login]: 1
@@ -38,11 +39,20 @@
import re
import os
+import sys
+import imp
+
# We need utils.robot to get keywords like "Get Chassis Power State".
gru.my_import_resource("utils.robot")
gru.my_import_resource("state_manager.robot")
+base_path = os.path.dirname(os.path.dirname(
+ imp.find_module("gen_robot_print")[1])) + os.sep
+sys.path.append(base_path + "data/")
+import variables as var
+
+
# The BMC code has recently been changed as far as what states are defined and
# what the state values can be. This module now has a means of processing both
# the old style state (i.e. OBMC_STATES_VERSION = 0) and the new style (i.e.
@@ -64,6 +74,7 @@
'chassis',
'bmc',
'boot_progress',
+ 'operating_system',
'host',
'os_ping',
'os_login',
@@ -78,9 +89,14 @@
'epoch_seconds',
'rest',
'chassis',
+ 'requested_chassis',
'bmc',
+ 'requested_bmc',
'boot_progress',
+ 'operating_system',
'host',
+ 'requested_host',
+ 'attempts_left',
'os_ping',
'os_login',
'os_run_cmd']
@@ -109,6 +125,7 @@
('chassis', '^Off$'),
('bmc', '^Ready$'),
('boot_progress', ''),
+ ('operating_system', ''),
('host', '')])
# default_state is an initial value which may be of use to callers.
@@ -116,6 +133,7 @@
('chassis', 'On'),
('bmc', 'Ready'),
('boot_progress', 'OSStart'),
+ ('operating_system', 'BootComplete'),
('host', 'Running'),
('os_ping', '1'),
('os_login', '1'),
@@ -126,12 +144,14 @@
('bmc', '^Ready$'),
('boot_progress',
'FW Progress, Starting OS|OSStart'),
+ ('operating_system', 'BootComplete'),
('host', '^Running$')])
invalid_state_match = DotDict([('rest', '^$'),
('chassis', '^$'),
('bmc', '^$'),
('boot_progress', '^$'),
+ ('operating_system', '^$'),
('host', '^$')])
@@ -497,11 +517,6 @@
packet_loss = ''
uptime = ''
epoch_seconds = ''
- rest = '1'
- chassis = ''
- bmc = ''
- boot_progress = ''
- host = ''
# Get the component states.
if 'ping' in req_states:
@@ -554,63 +569,44 @@
if shell_rc == 0:
epoch_seconds = out_buf.rstrip("\n")
- master_req_rest = ['rest', 'chassis', 'bmc', 'boot_progress',
- 'host']
+ master_req_rest = ['rest', 'host', 'requested_host', 'operating_system',
+ 'attempts_left', 'boot_progress', 'chassis',
+ 'requested_chassis' 'bmc' 'requested_bmc']
+
req_rest = [sub_state for sub_state in req_states if sub_state in
master_req_rest]
need_rest = (len(req_rest) > 0)
-
- # Though we could try to determine 'rest' state on any of several calls,
- # for simplicity, we'll use 'chassis' to figure it out (even if the caller
- # hasn't explicitly asked for 'chassis').
- if 'chassis' in req_states or need_rest:
- cmd_buf = ["Get Chassis Power State", "quiet=${" + str(quiet) + "}"]
+ state = DotDict()
+ if need_rest:
+ cmd_buf = ["Read Properties", var.SYSTEM_STATE_URI + "enumerate",
+ "quiet=${" + str(quiet) + "}"]
grp.rdpissuing_keyword(cmd_buf)
status, ret_values = \
BuiltIn().run_keyword_and_ignore_error(*cmd_buf)
if status == "PASS":
- chassis = ret_values
- chassis = re.sub(r'.*\.', "", chassis)
- rest = '1'
+ state['rest'] = '1'
else:
- rest = ret_values
+ state['rest'] = '0'
- if rest == '1':
- if 'bmc' in req_states:
- if OBMC_STATES_VERSION == 0:
- qualifier = "utils"
- else:
- # This will not be supported much longer.
- qualifier = "state_manager"
- cmd_buf = [qualifier + ".Get BMC State",
- "quiet=${" + str(quiet) + "}"]
- grp.rdpissuing_keyword(cmd_buf)
- status, ret_values = \
- BuiltIn().run_keyword_and_ignore_error(*cmd_buf)
- if status == "PASS":
- bmc = ret_values
+ for url_path in ret_values:
+ for attr_name in ret_values[url_path]:
+ # Create a state key value based on the attr_name.
+ if type(ret_values[url_path][attr_name]) is unicode:
+ ret_values[url_path][attr_name] = \
+ re.sub(r'.*\.', "", ret_values[url_path][attr_name])
+ # Do some key name manipulations.
+ new_attr_name = re.sub(r'^Current|(State|Transition)$',
+ "", attr_name)
+ new_attr_name = re.sub(r'BMC', r'Bmc', new_attr_name)
+ new_attr_name = re.sub(r'([A-Z][a-z])', r'_\1', new_attr_name)
+ new_attr_name = new_attr_name.lower().lstrip("_")
+ new_attr_name = re.sub(r'power', r'chassis', new_attr_name)
+ if new_attr_name in req_states:
+ state[new_attr_name] = ret_values[url_path][attr_name]
- if 'boot_progress' in req_states:
- cmd_buf = ["Get Boot Progress", "quiet=${" + str(quiet) + "}"]
- grp.rdpissuing_keyword(cmd_buf)
- status, ret_values = \
- BuiltIn().run_keyword_and_ignore_error(*cmd_buf)
- if status == "PASS":
- boot_progress = ret_values
-
- if 'host' in req_states:
- if OBMC_STATES_VERSION > 0:
- cmd_buf = ["Get Host State", "quiet=${" + str(quiet) + "}"]
- grp.rdpissuing_keyword(cmd_buf)
- status, ret_values = \
- BuiltIn().run_keyword_and_ignore_error(*cmd_buf)
- if status == "PASS":
- host = ret_values
- # Strip everything up to the final period.
- host = re.sub(r'.*\.', "", host)
-
- state = DotDict()
for sub_state in req_states:
+ if sub_state in state:
+ continue
if sub_state.startswith("os_"):
# We pass "os_" requests on to get_os_state.
continue