xref: /openbmc/phosphor-state-manager/README.md (revision c4c702c9b76220003b3534c15085994714c4f213)
1d6fe3150SAndrew Geissler# Phosphor State Manager Documentation
2d6fe3150SAndrew Geissler
3d6fe3150SAndrew GeisslerThis repository contains the software responsible for tracking and controlling
42138f45cSAndrew Geisslerthe state of different objects within OpenBMC. This currently includes the BMC,
52138f45cSAndrew GeisslerChassis, Host, and Hypervisor. The most critical feature of
6*c4c702c9SAndrew Geisslerphosphor-state-manager (PSM) software is its support for requests to power on
7*c4c702c9SAndrew Geisslerand off the system by the user.
8d6fe3150SAndrew Geissler
9d6fe3150SAndrew GeisslerThis software also enforces any restore policy (i.e. auto power on system after
10d6fe3150SAndrew Geisslera system power event or bmc reset) and ensures its states are updated correctly
11d6fe3150SAndrew Geisslerin situations where the BMC is rebooted and the chassis or host are in
12d6fe3150SAndrew Geissleron/running states.
13d6fe3150SAndrew Geissler
14d6fe3150SAndrew GeisslerThis repository also provides a command line tool, obmcutil, which provides
15d6fe3150SAndrew Geisslerbasic command line support to query and control phosphor-state-manager
16d6fe3150SAndrew Geisslerapplications running within an OpenBMC system. This tool itself runs within an
17d6fe3150SAndrew GeisslerOpenBMC system and utilizes D-Bus APIs. These D-Bus APIs are used for
18d6fe3150SAndrew Geisslerdevelopment and debug and are not intended for end users.
19d6fe3150SAndrew Geissler
20d6fe3150SAndrew GeisslerAs with all OpenBMC applications, interfaces and properties within
211b83babfSPatrick Williamsphosphor-state-manager are D-Bus interfaces. These interfaces are then used by
221b83babfSPatrick Williamsexternal interface protocols, such as Redfish and IPMI, to report and control
231b83babfSPatrick Williamsstate to/by the end user.
24d6fe3150SAndrew Geissler
25d6fe3150SAndrew Geissler## State Tracking and Control
26d6fe3150SAndrew Geissler
27d6fe3150SAndrew Geisslerphosphor-state-manager makes extensive use of systemd. There is a writeup
28d6fe3150SAndrew Geissler[here][1] with an overview of systemd and its use by OpenBMC.
29d6fe3150SAndrew Geissler
30*c4c702c9SAndrew Geisslerphosphor-state-manager monitors for systemd targets to complete as a trigger to
31*c4c702c9SAndrew Geisslerupdating the its corresponding D-Bus property. When using PSM, a user must
32*c4c702c9SAndrew Geisslerensure all generic services installed within the PSM targets complete
33*c4c702c9SAndrew Geisslersuccessfully in order to have PSM properly report states.
34*c4c702c9SAndrew Geissler
35d6fe3150SAndrew Geisslerphosphor-state-manager follows some basics design guidelines in its
36d6fe3150SAndrew Geisslerimplementation and use of systemd:
371b83babfSPatrick Williams
38d6fe3150SAndrew Geissler- Keep the different objects as independent as possible (host, chassis, bmc)
39*c4c702c9SAndrew Geissler- Use systemd targets for everything and keep the code within PSM minimal
40d6fe3150SAndrew Geissler- Ensure it can support required external interfaces, but don't necessarily
41d6fe3150SAndrew Geissler  create 1x1 mappings otherwise every external interface will end up with its
42d6fe3150SAndrew Geissler  own special chassis or host state request
43d6fe3150SAndrew Geissler- If something like a hard power off can be done by just turning off the
44d6fe3150SAndrew Geissler  chassis, don't provide a command in the host to do the same thing
45d6fe3150SAndrew Geissler
46d6fe3150SAndrew Geisslerphosphor-state-manager implements states and state requests as defined in
47d6fe3150SAndrew Geisslerphosphor-dbus-interfaces for each object it supports.
481b83babfSPatrick Williams
49*c4c702c9SAndrew Geissler- [bmc][2]: The BMC has very minimal states. It is `NotReady` when first started
50*c4c702c9SAndrew Geissler  and `Ready` once all services within the default.target have executed. It is
51*c4c702c9SAndrew Geissler  `Quiesced` when a critical service has entered the failed state. The only
52*c4c702c9SAndrew Geissler  state change request you can make of the BMC is for it to reboot itself.
53*c4c702c9SAndrew Geissler  - CurrentBMCState: NotReady, Ready, Quiesced
54d6fe3150SAndrew Geissler  - RequestedBMCTransition: Reboot
55*c4c702c9SAndrew Geissler  - Monitored systemd targets: multi-user.target and
56*c4c702c9SAndrew Geissler    obmc-bmc-service-quiesce@.target
57d6fe3150SAndrew Geissler- [chassis][3]: The chassis represents the physical hardware in which the system
58d6fe3150SAndrew Geissler  is contained. It usually has the power supplies, fans, and other hardware
59*c4c702c9SAndrew Geissler  associated with it. It can be either `On`, `Off`, or in a fail state. A
60*c4c702c9SAndrew Geissler  `BrownOut` state indicates there is not enough chassis power to fully power on
61*c4c702c9SAndrew Geissler  and `UninterruptiblePowerSupply` indicates the chassis is running on a UPS.
62*c4c702c9SAndrew Geissler  - CurrentPowerState: On, Off, BrownOut, UninterruptiblePowerSupply
63d6fe3150SAndrew Geissler  - RequestedPowerTransition: On, Off
64*c4c702c9SAndrew Geissler  - Monitored systemd targets: obmc-chassis-poweron@.target,
65*c4c702c9SAndrew Geissler    obmc-chassis-poweroff@.target
66d6fe3150SAndrew Geissler- [host][4]: The host represents the software running on the system. In most
67d6fe3150SAndrew Geissler  cases this is an operating system of some sort. The host can be `Off`,
681b83babfSPatrick Williams  `Running`, `TransitioningToRunning`, `TransitioningToOff`, `Quiesced`(error
691b83babfSPatrick Williams  condition), or in `DiagnosticMode`(collecting diagnostic data for a failure)
70eab2ea34SAndrew Geissler  - CurrentHostState: Off, Running, TransitioningToRunning, TransitioningToOff,
71eab2ea34SAndrew Geissler    Quiesced, DiagnosticMode
72c9844634SAndrew Geissler  - RequestedHostTransition: Off, On, Reboot, GracefulWarmReboot,
73c9844634SAndrew Geissler    ForceWarmReboot
74*c4c702c9SAndrew Geissler  - Monitored systemd targets: obmc-host-startmin@.target,
75*c4c702c9SAndrew Geissler    obmc-host-stop@.target, obmc-host-quiesce@.target,
76*c4c702c9SAndrew Geissler    obmc-host-diagnostic-mode@.target
772138f45cSAndrew Geissler- [hypervisor][4]: The hypervisor is an optional package systems can install
782138f45cSAndrew Geissler  which tracks the state of the hypervisor on the system. This state manager
792138f45cSAndrew Geissler  object implements a limited subset of the host D-Bus interface.
802138f45cSAndrew Geissler  - CurrentHostState: Standby, TransitionToRunning, Running, Off, Quiesced
812138f45cSAndrew Geissler  - RequestedHostTransition: On
82d6fe3150SAndrew Geissler
83*c4c702c9SAndrew GeisslerAs noted above, PSM provides a command line tool, [obmcutil][5], which takes a
84*c4c702c9SAndrew Geissler`state` parameter. This will use D-Bus commands to retrieve the above states and
85*c4c702c9SAndrew Geisslerpresent them to the user. It also provides other commands which will send the
86*c4c702c9SAndrew Geisslerappropriate D-Bus commands to the above properties to power on/off the chassis
87*c4c702c9SAndrew Geisslerand host (see `obmcutil --help` within an OpenBMC system).
88d6fe3150SAndrew Geissler
89d6fe3150SAndrew GeisslerThe above objects also implement other D-Bus objects like power on hours, boot
90d6fe3150SAndrew Geisslerprogress, reboot attempts, and operating system status. These D-Bus objects are
91d6fe3150SAndrew Geissleralso defined out in the phosphor-dbus-interfaces repository.
92d6fe3150SAndrew Geissler
93d6fe3150SAndrew Geissler## Restore Policy on Power Events
94d6fe3150SAndrew Geissler
95d6fe3150SAndrew GeisslerThe [RestorePolicy][6] defines the behavior the user wants when the BMC is
961b83babfSPatrick Williamsreset. If the chassis or host is on/running then this service will not run. If
97*c4c702c9SAndrew Geisslerthey are off then the `RestorePolicy` will be read and executed by PSM code.
98d6fe3150SAndrew Geissler
99d6fe3150SAndrew Geissler## BMC Reset with Host and/or Chassis On
100d6fe3150SAndrew Geissler
101d6fe3150SAndrew GeisslerIn situations where the BMC is reset and the chassis and host are on and
102d6fe3150SAndrew Geisslerrunning, its critical that the BMC software do two things:
1031b83babfSPatrick Williams
104d6fe3150SAndrew Geissler- Never impact the state of the system (causing a power off of a running system
105d6fe3150SAndrew Geissler  is very bad)
106d6fe3150SAndrew Geissler- Ensure the BMC, Chassis, and Host states accurately represent the state of the
107d6fe3150SAndrew Geissler  system.
108d6fe3150SAndrew Geissler
109d6fe3150SAndrew GeisslerNote that some of this logic is provided via service files in system-specific
1101b83babfSPatrick Williamsmeta layers. That is because the logic to determine if the chassis is on or if
1111b83babfSPatrick Williamsthe host is running can vary from system to system. The requirement to create
1121b83babfSPatrick Williamsthe files defined below and ensure the common targets go active is a must for
1131b83babfSPatrick Williamsanyone wishing to enable this feature.
114d6fe3150SAndrew Geissler
115d6fe3150SAndrew Geisslerphosphor-state-manager discovers state vs. trying to cache and save states. This
116d6fe3150SAndrew Geisslerensure it's always getting the most accurate state information. It discovers the
117d6fe3150SAndrew Geisslerchassis state by checking the `pgood` value from the power application. If it
118d6fe3150SAndrew Geisslerdetermines that power is on then it will do the following:
1191b83babfSPatrick Williams
120d6fe3150SAndrew Geissler- Create a file called /run/openbmc/chassis@0-on
121d6fe3150SAndrew Geissler  - The presence of this file tells the services to alter their behavior because
122d6fe3150SAndrew Geissler    the chassis is already powered on
123d6fe3150SAndrew Geissler- Start the obmc-chassis-poweron@0.target
124d6fe3150SAndrew Geissler  - The majority of services in this target will "fake start" due to the file
125d6fe3150SAndrew Geissler    being present. They will report to systemd that they started and ran
126d6fe3150SAndrew Geissler    successfully but they actually do nothing. This is what you would want in
127d6fe3150SAndrew Geissler    this case. Power is already on so you don't want to run the services to turn
128d6fe3150SAndrew Geissler    power on. You do want to get the obmc-chassis-poweron@0.target in the Active
129*c4c702c9SAndrew Geissler    state though so that the chassis object within PSM will correctly report
130*c4c702c9SAndrew Geissler    that the chassis is `On`
131d6fe3150SAndrew Geissler- Start a service to check if the host is on
132d6fe3150SAndrew Geissler
1334a4c1a69SAndrew GeisslerThe chassis@0-on file is removed once the obmc-chassis-poweron@0.target becomes
1344a4c1a69SAndrew Geissleractive (i.e. all service have been successfully started which are wanted or
1354a4c1a69SAndrew Geisslerrequired by this target).
136d6fe3150SAndrew Geissler
137d6fe3150SAndrew GeisslerThe logic to check if the host is on sends a command to the host, and if a
138d6fe3150SAndrew Geisslerresponse is received then similar logic to chassis is done:
1391b83babfSPatrick Williams
140d6fe3150SAndrew Geissler- Create a file called /run/openbmc/host@0-on
141d6fe3150SAndrew Geissler- Start the obmc-host-start@0.target
142d6fe3150SAndrew Geissler  - Similar to above, most services will not run due to the file being created
143d6fe3150SAndrew Geissler    and their service files implementing a
144d6fe3150SAndrew Geissler    "ConditionPathExists=!/run/openbmc/host@0-request"
145d6fe3150SAndrew Geissler
1464a4c1a69SAndrew GeisslerThe host@0-on file is removed once the obmc-host-start@0.target and
1474a4c1a69SAndrew Geisslerobmc-host-startmin@0.target become active (i.e. all service have been
1484a4c1a69SAndrew Geisslersuccessfully started which are wanted or required by these targets).
149d6fe3150SAndrew Geissler
150d6fe3150SAndrew Geissler## Building the Code
1511b83babfSPatrick Williams
1524640d48eSAndrew GeisslerTo build this package, do the following steps:
1534640d48eSAndrew Geissler
15482f23534SPatrick Williams1. `meson setup build`
15582f23534SPatrick Williams2. `ninja -C build`
1564640d48eSAndrew Geissler
1574640d48eSAndrew GeisslerTo clean the repository again run `rm -rf build`.
158d6fe3150SAndrew Geissler
159a6e7bbf0SGunnar Mills[1]: https://github.com/openbmc/docs/blob/master/architecture/openbmc-systemd.md
1601b83babfSPatrick Williams[2]:
1611b83babfSPatrick Williams  https://github.com/openbmc/phosphor-dbus-interfaces/blob/master/yaml/xyz/openbmc_project/State/BMC.interface.yaml
1621b83babfSPatrick Williams[3]:
1631b83babfSPatrick Williams  https://github.com/openbmc/phosphor-dbus-interfaces/blob/master/yaml/xyz/openbmc_project/State/Chassis.interface.yaml
1641b83babfSPatrick Williams[4]:
1651b83babfSPatrick Williams  https://github.com/openbmc/phosphor-dbus-interfaces/blob/master/yaml/xyz/openbmc_project/State/Host.interface.yaml
166d6fe3150SAndrew Geissler[5]: https://github.com/openbmc/phosphor-state-manager/blob/master/obmcutil
1671b83babfSPatrick Williams[6]:
1681b83babfSPatrick Williams  https://github.com/openbmc/phosphor-dbus-interfaces/blob/master/yaml/xyz/openbmc_project/Control/Power/RestorePolicy.interface.yaml
169