| #!/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 |