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