blob: a54ea6b75311d0f7c40774fe96a6b189db886d5e [file] [log] [blame]
#!/usr/bin/env python
r"""
State Manager module:
- Defines Valid states of the system
"""
import os
import re
import sys
from robot.libraries.BuiltIn import BuiltIn
robot_pgm_dir_path = os.path.dirname(__file__) + os.sep
repo_data_dir_path = re.sub('/lib', '/data', robot_pgm_dir_path)
sys.path.append(repo_data_dir_path)
import gen_robot_keyword as keyword
import variables as var
BuiltIn().import_resource("state_manager.robot")
BuiltIn().import_resource("rest_client.robot")
# We will build eventually the mapping for warm, cold reset as well.
VALID_STATES = {
'reboot':
{
# (Power Policy, BMC state, Chassis State, Host State)
('LEAVE_OFF', 'Ready', 'Off', 'Off'),
('ALWAYS_POWER_ON', 'Ready', 'On', 'Running'),
('ALWAYS_POWER_ON', 'Ready', 'On', 'Off'),
('RESTORE_LAST_STATE', 'Ready', 'On', 'Running'),
('RESTORE_LAST_STATE', 'Ready', 'On', 'Off'),
('ALWAYS_POWER_OFF', 'Ready', 'On', 'Running'),
('ALWAYS_POWER_OFF', 'Ready', 'Off', 'Off'),
},
}
VALID_BOOT_STATES = {
'Off': # Valid states when Host is Off.
{
# (BMC , Chassis , Host , BootProgress, OperatingSystemState)
(
"xyz.openbmc_project.State.BMC.BMCState.Ready",
"xyz.openbmc_project.State.Chassis.PowerState.Off",
"xyz.openbmc_project.State.Host.HostState.Off",
"xyz.openbmc_project.State.Boot.Progress.ProgressStages.Unspecified",
"xyz.openbmc_project.State.OperatingSystem.Status.OSStatus.Inactive"
),
},
'Reboot': # Valid states when BMC reset to standby.
{
# (BMC , Chassis , Host , BootProgress, OperatingSystemState)
(
"xyz.openbmc_project.State.BMC.BMCState.Ready",
"xyz.openbmc_project.State.Chassis.PowerState.Off",
"xyz.openbmc_project.State.Host.HostState.Off",
"xyz.openbmc_project.State.Boot.Progress.ProgressStages.Unspecified",
"xyz.openbmc_project.State.OperatingSystem.Status.OSStatus.Inactive"
),
},
'Running': # Valid states when Host is powering on.
{
# (BMC , Chassis , Host , BootProgress, OperatingSystemState)
(
"xyz.openbmc_project.State.BMC.BMCState.Ready",
"xyz.openbmc_project.State.Chassis.PowerState.On",
"xyz.openbmc_project.State.Host.HostState.Running",
"xyz.openbmc_project.State.Boot.Progress.ProgressStages.MotherboardInit",
"xyz.openbmc_project.State.OperatingSystem.Status.OSStatus.Inactive"
),
},
'Booted': # Valid state when Host is booted.
{
# (BMC , Chassis , Host , BootProgress, OperatingSystemState)
(
"xyz.openbmc_project.State.BMC.BMCState.Ready",
"xyz.openbmc_project.State.Chassis.PowerState.On",
"xyz.openbmc_project.State.Host.HostState.Running",
"xyz.openbmc_project.State.Boot.Progress.ProgressStages.OSStart",
"xyz.openbmc_project.State.OperatingSystem.Status.OSStatus.BootComplete"
),
},
'ResetReload': # Valid state BMC reset reload when host is booted.
{
# (BMC , Chassis , Host , BootProgress, OperatingSystemState)
(
"xyz.openbmc_project.State.BMC.BMCState.Ready",
"xyz.openbmc_project.State.Chassis.PowerState.On",
"xyz.openbmc_project.State.Host.HostState.Running",
"xyz.openbmc_project.State.Boot.Progress.ProgressStages.OSStart",
"xyz.openbmc_project.State.OperatingSystem.Status.OSStatus.BootComplete"
),
},
}
class state_map():
def get_boot_state(self):
r"""
Return the system state as a tuple of bmc, chassis, host state,
BootProgress and OperatingSystemState.
"""
status, state = keyword.run_key("Read Properties "
+ var.SYSTEM_STATE_URI + "enumerate")
bmc_state = state[var.SYSTEM_STATE_URI + 'bmc0']['CurrentBMCState']
chassis_state = \
state[var.SYSTEM_STATE_URI + 'chassis0']['CurrentPowerState']
host_state = state[var.SYSTEM_STATE_URI + 'host0']['CurrentHostState']
boot_state = state[var.SYSTEM_STATE_URI + 'host0']['BootProgress']
os_state = \
state[var.SYSTEM_STATE_URI + 'host0']['OperatingSystemState']
return (str(bmc_state),
str(chassis_state),
str(host_state),
str(boot_state),
str(os_state))
def valid_boot_state(self, boot_type, state_set):
r"""
Validate a given set of states is valid.
Description of argument(s):
boot_type Boot type (e.g. off/running/host booted
etc.)
state_set State set (e.g.bmc,chassis,host,
BootProgress,OperatingSystemState)
"""
if state_set in set(VALID_BOOT_STATES[boot_type]):
return True
else:
return False