xref: /openbmc/openbmc-test-automation/lib/state_map.py (revision e43fb2f773a76a1083c47ceac20f0a638e5be567)
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
98###############################################################################
99class state_map():
100
101    def get_boot_state(self):
102        r"""
103        Return the system state as a tuple of bmc, chassis, host state,
104        BootProgress and OperatingSystemState.
105        """
106
107        status, state = keyword.run_key("Read Properties  " +
108                                        var.SYSTEM_STATE_URI + "enumerate")
109        bmc_state = state[var.SYSTEM_STATE_URI + 'bmc0']['CurrentBMCState']
110        chassis_state = \
111            state[var.SYSTEM_STATE_URI + 'chassis0']['CurrentPowerState']
112        host_state = state[var.SYSTEM_STATE_URI + 'host0']['CurrentHostState']
113        boot_state = state[var.SYSTEM_STATE_URI + 'host0']['BootProgress']
114        os_state = \
115            state[var.SYSTEM_STATE_URI + 'host0']['OperatingSystemState']
116
117        return (str(bmc_state),
118                str(chassis_state),
119                str(host_state),
120                str(boot_state),
121                str(os_state))
122
123    def valid_boot_state(self, boot_type, state_set):
124        r"""
125        Validate a given set of states is valid.
126
127        Description of argument(s):
128        boot_type   Boot type (e.g. off/running/host booted etc.)
129        state_set   State set
130                    (e.g.bmc,chassis,host,BootProgress,OperatingSystemState)
131        """
132
133        if state_set in set(VALID_BOOT_STATES[boot_type]):
134            return True
135        else:
136            return False
137###############################################################################
138