xref: /openbmc/openbmc-test-automation/lib/state_map.py (revision 20f38712b324e61a94e174017c487a0af4b373e1)
1 #!/usr/bin/env python3
2 
3 r"""
4 State Manager module:
5 
6    - Defines Valid states of the system
7 
8 """
9 import os
10 import re
11 import sys
12 
13 from robot.libraries.BuiltIn import BuiltIn
14 
15 robot_pgm_dir_path = os.path.dirname(__file__) + os.sep
16 repo_data_dir_path = re.sub("/lib", "/data", robot_pgm_dir_path)
17 sys.path.append(repo_data_dir_path)
18 
19 import gen_robot_keyword as keyword  # NOQA
20 import variables as var  # NOQA
21 
22 BuiltIn().import_resource("state_manager.robot")
23 BuiltIn().import_resource("rest_client.robot")
24 
25 platform_arch_type = os.environ.get(
26     "PLATFORM_ARCH_TYPE", ""
27 ) or BuiltIn().get_variable_value("${PLATFORM_ARCH_TYPE}", default="power")
28 
29 # We will build eventually the mapping for warm, cold reset as well.
30 VALID_STATES = {
31     "reboot": {
32         # (Power Policy, BMC state, Chassis State, Host State)
33         ("LEAVE_OFF", "Ready", "Off", "Off"),
34         ("ALWAYS_POWER_ON", "Ready", "On", "Running"),
35         ("ALWAYS_POWER_ON", "Ready", "On", "Off"),
36         ("RESTORE_LAST_STATE", "Ready", "On", "Running"),
37         ("RESTORE_LAST_STATE", "Ready", "On", "Off"),
38         ("ALWAYS_POWER_OFF", "Ready", "On", "Running"),
39         ("ALWAYS_POWER_OFF", "Ready", "Off", "Off"),
40     },
41 }
42 
43 VALID_BOOT_STATES = {
44     "Off": {  # Valid states when Host is Off.
45         # (BMC , Chassis , Host , BootProgress, OperatingSystemState)
46         (
47             "xyz.openbmc_project.State.BMC.BMCState.Ready",
48             "xyz.openbmc_project.State.Chassis.PowerState.Off",
49             "xyz.openbmc_project.State.Host.HostState.Off",
50             "xyz.openbmc_project.State.Boot.Progress.ProgressStages.Unspecified",
51             "xyz.openbmc_project.State.OperatingSystem.Status.OSStatus.Inactive",
52         ),
53     },
54     "Reboot": {  # Valid states when BMC reset to standby.
55         # (BMC , Chassis , Host , BootProgress, OperatingSystemState)
56         (
57             "xyz.openbmc_project.State.BMC.BMCState.Ready",
58             "xyz.openbmc_project.State.Chassis.PowerState.Off",
59             "xyz.openbmc_project.State.Host.HostState.Off",
60             "xyz.openbmc_project.State.Boot.Progress.ProgressStages.Unspecified",
61             "xyz.openbmc_project.State.OperatingSystem.Status.OSStatus.Inactive",
62         ),
63     },
64     "Running": {  # Valid states when Host is powering on.
65         # (BMC , Chassis , Host , BootProgress, OperatingSystemState)
66         (
67             "xyz.openbmc_project.State.BMC.BMCState.Ready",
68             "xyz.openbmc_project.State.Chassis.PowerState.On",
69             "xyz.openbmc_project.State.Host.HostState.Running",
70             "xyz.openbmc_project.State.Boot.Progress.ProgressStages.MotherboardInit",
71             "xyz.openbmc_project.State.OperatingSystem.Status.OSStatus.Inactive",
72         ),
73     },
74     "Booted": {  # Valid state when Host is booted.
75         # (BMC , Chassis , Host , BootProgress, OperatingSystemState)
76         (
77             "xyz.openbmc_project.State.BMC.BMCState.Ready",
78             "xyz.openbmc_project.State.Chassis.PowerState.On",
79             "xyz.openbmc_project.State.Host.HostState.Running",
80             "xyz.openbmc_project.State.Boot.Progress.ProgressStages.OSStart",
81             "xyz.openbmc_project.State.OperatingSystem.Status.OSStatus.BootComplete",
82         ),
83     },
84     "ResetReload": {  # Valid state BMC reset reload when host is booted.
85         # (BMC , Chassis , Host , BootProgress, OperatingSystemState)
86         (
87             "xyz.openbmc_project.State.BMC.BMCState.Ready",
88             "xyz.openbmc_project.State.Chassis.PowerState.On",
89             "xyz.openbmc_project.State.Host.HostState.Running",
90             "xyz.openbmc_project.State.Boot.Progress.ProgressStages.OSStart",
91             "xyz.openbmc_project.State.OperatingSystem.Status.OSStatus.BootComplete",
92         ),
93     },
94 }
95 REDFISH_VALID_BOOT_STATES = {
96     "Off": {  # Valid states when Host is Off.
97         # (BMC , Chassis , Host , BootProgress)
98         (
99             "Enabled",
100             "Off",
101             "Disabled",
102             "None",
103         ),
104     },
105     "Reboot": {  # Valid states when BMC reset to standby.
106         # (BMC , Chassis , Host , BootProgress)
107         (
108             "Enabled",
109             "Off",
110             "Disabled",
111             "None",
112         ),
113     },
114     "Running": {  # Valid states when Host is powering on.
115         # (BMC , Chassis , Host , BootProgress)
116         (
117             "Enabled",
118             "On",
119             "Enabled",
120             "OSRunning",
121         ),
122     },
123     "Booted": {  # Valid state when Host is booted.
124         # (BMC , Chassis , Host , BootProgress)
125         (
126             "Enabled",
127             "On",
128             "Enabled",
129             "OSRunning",
130         ),
131     },
132     "ResetReload": {  # Valid state BMC reset reload when host is booted.
133         # (BMC , Chassis , Host , BootProgress)
134         (
135             "Enabled",
136             "On",
137             "Enabled",
138             "OSRunning",
139         ),
140     },
141 }
142 
143 if platform_arch_type == "x86":
144     VALID_BOOT_STATES_X86 = {}
145     for state_name, state_set in VALID_BOOT_STATES.items():
146         VALID_BOOT_STATES_X86[state_name] = set()
147         for state_tuple in state_set:
148             state_tuple_new = tuple(
149                 x
150                 for x in state_tuple
151                 if not (
152                     x.startswith("xyz.openbmc_project.State.Boot.Progress")
153                     or x.startswith(
154                         "xyz.openbmc_project.State.OperatingSystem"
155                     )
156                 )
157             )
158             VALID_BOOT_STATES_X86[state_name].add(state_tuple_new)
159     VALID_BOOT_STATES = VALID_BOOT_STATES_X86
160 
161 
162 class state_map:
163     def get_boot_state(self):
164         r"""
165         Return the system state as a tuple of bmc, chassis, host state,
166         BootProgress and OperatingSystemState.
167         """
168 
169         status, state = keyword.run_key(
170             "Read Properties  " + var.SYSTEM_STATE_URI + "enumerate"
171         )
172         bmc_state = state[var.SYSTEM_STATE_URI + "bmc0"]["CurrentBMCState"]
173         chassis_state = state[var.SYSTEM_STATE_URI + "chassis0"][
174             "CurrentPowerState"
175         ]
176         host_state = state[var.SYSTEM_STATE_URI + "host0"]["CurrentHostState"]
177         if platform_arch_type == "x86":
178             return (str(bmc_state), str(chassis_state), str(host_state))
179         else:
180             boot_state = state[var.SYSTEM_STATE_URI + "host0"]["BootProgress"]
181             os_state = state[var.SYSTEM_STATE_URI + "host0"][
182                 "OperatingSystemState"
183             ]
184 
185             return (
186                 str(bmc_state),
187                 str(chassis_state),
188                 str(host_state),
189                 str(boot_state),
190                 str(os_state),
191             )
192 
193     def valid_boot_state(self, boot_type, state_set):
194         r"""
195         Validate a given set of states is valid.
196 
197         Description of argument(s):
198         boot_type                   Boot type (e.g. off/running/host booted
199                                     etc.)
200         state_set                   State set (e.g.bmc,chassis,host,
201                                     BootProgress,OperatingSystemState)
202         """
203 
204         if state_set in set(VALID_BOOT_STATES[boot_type]):
205             return True
206         else:
207             return False
208 
209     def redfish_valid_boot_state(self, boot_type, state_dict):
210         r"""
211         Validate a given set of states is valid.
212 
213         Description of argument(s):
214         boot_type                   Boot type (e.g. off/running/host booted
215                                     etc.)
216         state_dict                  State dictionary.
217         """
218 
219         if set(state_dict.values()) in set(
220             REDFISH_VALID_BOOT_STATES[boot_type]
221         ):
222             return True
223         else:
224             return False
225