blob: e2271b789707f5b9d0da1a8836c52f2706aebff5 [file] [log] [blame]
#!/usr/bin/env python3
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 # NOQA
import variables as var # NOQA
BuiltIn().import_resource("state_manager.robot")
BuiltIn().import_resource("rest_client.robot")
platform_arch_type = os.environ.get(
"PLATFORM_ARCH_TYPE", ""
) or BuiltIn().get_variable_value("${PLATFORM_ARCH_TYPE}", default="power")
# 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",
),
},
}
REDFISH_VALID_BOOT_STATES = {
"Off": { # Valid states when Host is Off.
# (BMC , Chassis , Host , BootProgress)
(
"Enabled",
"Off",
"Disabled",
"None",
),
},
"Reboot": { # Valid states when BMC reset to standby.
# (BMC , Chassis , Host , BootProgress)
(
"Enabled",
"Off",
"Disabled",
"None",
),
},
"Running": { # Valid states when Host is powering on.
# (BMC , Chassis , Host , BootProgress)
(
"Enabled",
"On",
"Enabled",
"OSRunning",
),
},
"Booted": { # Valid state when Host is booted.
# (BMC , Chassis , Host , BootProgress)
(
"Enabled",
"On",
"Enabled",
"OSRunning",
),
},
"ResetReload": { # Valid state BMC reset reload when host is booted.
# (BMC , Chassis , Host , BootProgress)
(
"Enabled",
"On",
"Enabled",
"OSRunning",
),
},
}
if platform_arch_type == "x86":
VALID_BOOT_STATES_X86 = {}
for state_name, state_set in VALID_BOOT_STATES.items():
VALID_BOOT_STATES_X86[state_name] = set()
for state_tuple in state_set:
state_tuple_new = tuple(
x
for x in state_tuple
if not (
x.startswith("xyz.openbmc_project.State.Boot.Progress")
or x.startswith(
"xyz.openbmc_project.State.OperatingSystem"
)
)
)
VALID_BOOT_STATES_X86[state_name].add(state_tuple_new)
VALID_BOOT_STATES = VALID_BOOT_STATES_X86
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"]
if platform_arch_type == "x86":
return (str(bmc_state), str(chassis_state), str(host_state))
else:
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
def redfish_valid_boot_state(self, boot_type, state_dict):
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_dict State dictionary.
"""
if set(state_dict.values()) in set(
REDFISH_VALID_BOOT_STATES[boot_type]
):
return True
else:
return False