1#!/usr/bin/env python 2 3r""" 4State Manager module: 5 6 - Defines Valid states of the system 7 8""" 9import os 10import re 11import sys 12 13from robot.libraries.BuiltIn import BuiltIn 14 15robot_pgm_dir_path = os.path.dirname(__file__) + os.sep 16repo_data_dir_path = re.sub('/lib', '/data', robot_pgm_dir_path) 17sys.path.append(repo_data_dir_path) 18 19import gen_robot_keyword as keyword 20import variables as var 21 22BuiltIn().import_resource("state_manager.robot") 23BuiltIn().import_resource("rest_client.robot") 24 25# We will build eventually the mapping for warm, cold reset as well. 26VALID_STATES = { 27 'reboot': 28 { 29 # (Power Policy, BMC state, Chassis State, Host State) 30 ('LEAVE_OFF', 'Ready', 'Off', 'Off'), 31 ('ALWAYS_POWER_ON', 'Ready', 'On', 'Running'), 32 ('ALWAYS_POWER_ON', 'Ready', 'On', 'Off'), 33 ('RESTORE_LAST_STATE', 'Ready', 'On', 'Running'), 34 ('RESTORE_LAST_STATE', 'Ready', 'On', 'Off'), 35 ('RESTORE_LAST_STATE', 'Ready', 'Off', 'Off'), 36 }, 37} 38 39VALID_BOOT_STATES = { 40 'Off': # Valid states when Host is Off. 41 { 42 # (BMC , Chassis , Host , BootProgress, OperatingSystemState) 43 ( 44 "xyz.openbmc_project.State.BMC.BMCState.Ready", 45 "xyz.openbmc_project.State.Chassis.PowerState.Off", 46 "xyz.openbmc_project.State.Host.HostState.Off", 47 "xyz.openbmc_project.State.Boot.Progress.ProgressStages.Unspecified", 48 "xyz.openbmc_project.State.OperatingSystem.Status.OSStatus.Inactive" 49 ), 50 }, 51 'Reboot': # Valid states when BMC reset to standby. 52 { 53 # (BMC , Chassis , Host , BootProgress, OperatingSystemState) 54 ( 55 "xyz.openbmc_project.State.BMC.BMCState.Ready", 56 "xyz.openbmc_project.State.Chassis.PowerState.Off", 57 "xyz.openbmc_project.State.Host.HostState.Off", 58 "xyz.openbmc_project.State.Boot.Progress.ProgressStages.Unspecified", 59 "xyz.openbmc_project.State.OperatingSystem.Status.OSStatus.Inactive" 60 ), 61 }, 62 'Running': # Valid states when Host is powering on. 63 { 64 # (BMC , Chassis , Host , BootProgress, OperatingSystemState) 65 ( 66 "xyz.openbmc_project.State.BMC.BMCState.Ready", 67 "xyz.openbmc_project.State.Chassis.PowerState.On", 68 "xyz.openbmc_project.State.Host.HostState.Running", 69 "xyz.openbmc_project.State.Boot.Progress.ProgressStages.MotherboardInit", 70 "xyz.openbmc_project.State.OperatingSystem.Status.OSStatus.Inactive" 71 ), 72 }, 73 'Booted': # Valid state when Host is booted. 74 { 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 { 86 # (BMC , Chassis , Host , BootProgress, OperatingSystemState) 87 ( 88 "xyz.openbmc_project.State.BMC.BMCState.Ready", 89 "xyz.openbmc_project.State.Chassis.PowerState.On", 90 "xyz.openbmc_project.State.Host.HostState.Running", 91 "xyz.openbmc_project.State.Boot.Progress.ProgressStages.OSStart", 92 "xyz.openbmc_project.State.OperatingSystem.Status.OSStatus.BootComplete" 93 ), 94 }, 95} 96 97 98class state_map(): 99 100 def get_boot_state(self): 101 r""" 102 Return the system state as a tuple of bmc, chassis, host state, 103 BootProgress and OperatingSystemState. 104 """ 105 106 status, state = keyword.run_key("Read Properties " + 107 var.SYSTEM_STATE_URI + "enumerate") 108 bmc_state = state[var.SYSTEM_STATE_URI + 'bmc0']['CurrentBMCState'] 109 chassis_state = \ 110 state[var.SYSTEM_STATE_URI + 'chassis0']['CurrentPowerState'] 111 host_state = state[var.SYSTEM_STATE_URI + 'host0']['CurrentHostState'] 112 boot_state = state[var.SYSTEM_STATE_URI + 'host0']['BootProgress'] 113 os_state = \ 114 state[var.SYSTEM_STATE_URI + 'host0']['OperatingSystemState'] 115 116 return (str(bmc_state), 117 str(chassis_state), 118 str(host_state), 119 str(boot_state), 120 str(os_state)) 121 122 def valid_boot_state(self, boot_type, state_set): 123 r""" 124 Validate a given set of states is valid. 125 126 Description of argument(s): 127 boot_type Boot type (e.g. off/running/host booted etc.) 128 state_set State set 129 (e.g.bmc,chassis,host,BootProgress,OperatingSystemState) 130 """ 131 132 if state_set in set(VALID_BOOT_STATES[boot_type]): 133 return True 134 else: 135 return False 136