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