Added support for new 'rest' substate to state.py.

Change-Id: I1797c568406489c001531f353fb95d4cccec1a93
Signed-off-by: Michael Walsh <micwalsh@us.ibm.com>
diff --git a/lib/state.py b/lib/state.py
index 712d310..dd151bf 100755
--- a/lib/state.py
+++ b/lib/state.py
@@ -91,7 +91,8 @@
 
 else:
     # default_state is an initial value which may be of use to callers.
-    default_state = DotDict([('chassis', 'On'),
+    default_state = DotDict([('rest', '1'),
+                             ('chassis', 'On'),
                              ('boot_progress', 'FW Progress, Starting OS'),
                              ('host', 'Running'),
                              ('os_ping', '1'),
@@ -105,6 +106,7 @@
                         'packet_loss',
                         'uptime',
                         'epoch_seconds',
+                        'rest',
                         'chassis',
                         'boot_progress',
                         'host',
@@ -113,7 +115,8 @@
                         'os_run_cmd']
     # When a user calls get_state w/o specifying req_states, default_req_states
     # is used as its value.
-    default_req_states = ['chassis',
+    default_req_states = ['rest',
+                          'chassis',
                           'boot_progress',
                           'host',
                           'os_ping',
@@ -473,6 +476,7 @@
     uptime = ''
     epoch_seconds = ''
     power = ''
+    rest = '1'
     chassis = ''
     bmc = ''
     boot_progress = ''
@@ -549,14 +553,16 @@
             if shell_rc == 0:
                 epoch_seconds = out_buf.rstrip("\n")
 
-    if 'power' in req_states:
-        cmd_buf = ["Get Power State", "quiet=${" + str(quiet) + "}"]
-        grp.rdpissuing_keyword(cmd_buf)
-        status, ret_values = \
-            BuiltIn().run_keyword_and_ignore_error(*cmd_buf)
-        if status == "PASS":
-            power = ret_values
-    if 'chassis' in req_states:
+    master_req_rest = ['rest', 'power', 'chassis', 'bmc', 'boot_progress',
+                       'host']
+    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) + "}"]
         grp.rdpissuing_keyword(cmd_buf)
         status, ret_values = \
@@ -564,39 +570,51 @@
         if status == "PASS":
             chassis = ret_values
             chassis = re.sub(r'.*\.', "", chassis)
-
-    if 'bmc' in req_states:
-        if OBMC_STATES_VERSION == 0:
-            qualifier = "utils"
+            rest = '1'
         else:
-            # This will not be supported much longer.
-            qualifier = "state_manager"
+            rest = ret_values
 
-        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
-
-    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) + "}"]
+    if rest == '1':
+        if 'power' in req_states:
+            cmd_buf = ["Get Power 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)
+                power = ret_values
+
+        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
+
+        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:
@@ -865,7 +883,7 @@
         BuiltIn().fail(gp.sprint_error(error_message))
 
     gp.print_timen("Verifying that REST API interface is working.")
-    match_state = DotDict([('chassis', '.*')])
+    match_state = DotDict([('rest', '^1$')])
     state = wait_state(match_state, wait_time="5 mins", interval="2 seconds")
 
 ###############################################################################