1# Software Version Management and Image Update
2
3## Overview
4
5There are two types of processes involved in software version management and
6code update:
7
81. _ImageManager_ - This is a process which manages a collection of, likely
9   temporary, images located somewhere in a file system. These are images which
10   are available on the BMC for update.
112. _ItemUpdater_ - This is a process which manages specific storage elements,
12   likely for an inventory item, to determine which software versions are
13   installed onto that item. A specific example of this would be a process that
14   controls and updates the BIOS flash module for a managed host.
15
16A simple system design would be to include a single _ImageManager_ and two
17_ItemUpdater_(s): one for the BMC itself and one for the Host.
18
19### ImageManager
20
21The _ImageManager_ would provide interfaces at `/xyz/openbmc_project/software`
22to allow additional images to be added to the BMC, such as Object.Add() for REST
23and DownloadViaTFTP() for TFTP. The standard Object.Delete() interface would
24also be provided to facilitate removing images which are no longer needed.
25Images maintained in the file system would be presented as a corresponding
26`/xyz/openbmc_project/software/<id>` object. In addition, the
27`xyz.openbmc_project.Common.FilePath` interface would be provided to specify the
28location of the image.
29
30It is assumed that the _ImageManager_ has [at least] a bare minimum amount of
31parsing knowledge, perhaps due to a common image format, to allow it to populate
32all of the properties of `xyz.openbmc_project.Software.Version` and
33`xyz.openbmc_project.Inventory.Decorator.Compatible`. _ItemUpdater_(s) will
34likely listen for standard D-Bus signals to identify new images being created.
35
36### ItemUpdater
37
38The _ItemUpdater_ is responsible for monitoring for new `Software.Version`
39elements being created to identify versions that are applicable to the inventory
40element(s) it is managing. The _ItemUpdater_ should dynamically create an
41`xyz.openbmc_project.Software.Activation` interface under
42`/xyz/openbmc_project/software/`, an association of type
43`{active_image,software_version}` between the `Software.Version` and
44`Software.Activation` under `/xyz/openbmc_project/software/`, and an association
45of type `{activation,item}` between the `Inventory.Item` and
46`Software.Activation` under `/xyz/openbmc_project/software/<id>`. Application of
47the software image is then handled through the `RequestedActivation` property of
48the `Software.Activation` interface.
49
50In many cases, the _ItemUpdater_'s creation of the `Software.Activation`
51interface will be at the exact same path as the _ImageManager_'s
52`Software.Version` instance (ie. `/xyz/openbmc_project/software/<id>`). This is
53appropriate when the software image can be applied to exactly one device in the
54system at exactly one storage location. In cases where multiple devices could
55updated with the same image or multiple locations in the same device could hold
56the same image (such as a primary / secondary flash bank relationship), the
57_ItemUpdater_ should create `Software.Activation` interfaces as a sub-path of
58the corresponding image, such as `/xyz/openbmc_project/software/<id>/<device>`.
59
60The _ItemUpdater_ should, if possible, also create its own
61`xyz.openbmc_project.Software.Version` objects, and appropriate associations for
62software versions that are currently present on the managed inventory
63element(s). This provides a mechanism for interrogation of the software versions
64when the _ImageManager_ no longer contains a copy.
65
66## Details
67
68### Image Identifier
69
70The _ImageManager_ and _ItemUpdater_ should use a common, though perhaps
71implementation specific, algorithm for the `<id>` portion of a D-Bus path for
72each `Software.Version`. This allows the same software version to be contained
73in multiple locations but represented by the same object path.
74
75A reasonable algorithm might be:
76`echo <Version.Version> <Compatible.Names> | sha512sum | cut -b 1-8`
77
78### Compatibility
79
80Identifying that a particular Software image is for a particular system element
81can be challenging. For the BMC, two different images may both be the same size
82but for vastly different hardware. If the image for one system is applied onto
83the BMC for another it is quite possible that the image won't even boot
84properly. It is therefore important to be able to specify more details than
85simply "BMC" or "Host".
86
87Early on implementations used the `Software.Version.Purpose` property and a
88custom string in the `Software.ExtendedVersion` to align software images with
89appropriate hardware. This lead to an ever-increasing set of `Purpose`
90enumeration values and inconsistent implementations of software update routines.
91
92The `Inventory.Decorator.Compatible` interface was introduced to give
93identifiers that can be used to map to common software implementations, in a
94similar manner to how the Linux Device Tree compatible strings are used.
95Software update should leverage these `Compatible.Names` properties to create a
96consistent mapping of `Software.Version` instances to the system element the
97image is applicable to.
98
99At the same path as the `Software.Version`, an _ImageManager_ should create an
100`xyz.openbmc_project.Inventory.Decorator.Compatible` interface containing
101strings identifying the system element this image can be applied to.
102Correspondingly, the Inventory Item corresponding to the system element should
103have the same string in its `Inventory.Decorator.Compatible` interface. These
104strings shall be of the following format:
105
106- `<org>.Software.Element.<identifer>.Type.<type>`
107
108Where:
109
110- `<org>` corresponds to the organization owning the `<identifier>`, such as
111  `xyz.openbmc_project` or `com.foo_corp`.
112- `<identifier>` is a unique name for the element, such as `SystemFoo` or
113  `BoardBar`. Typically these would be code names for the hardware element such
114  as `Witherspoon`.
115- `<type>` is an identifier for sub-element the image corresponds to and is
116  documented in the `<org>/Software/Element/<identifier>.interface` file under
117  the `Type` enumeration.
118
119The following `<type>` are reserved for a particular meaning:
120
121- BMC - The image is for the BMC contained on that element.
122- Host - The image is the primary firmware for the managed host contained on
123  that element.
124
125If an image contains sub-sections which can be applied to multiple system
126elements, the image should contain `Compatible` strings for each sub-section. It
127is expected that the _ItemUpdater_ is aware of how to find the sub-section
128appropriate for any element(s) being Activated.
129
130### Activation States
131
132`xyz.openbmc_project.Software.Activation` has a property Activation that can be
133in the following states:
134
1351. _NotReady_ - Indicating that the _ItemUpdater_ is still processing the
136   version and it is therefore not ready for activation. This might be used on
137   an image that has a security header while verification is being performed.
1382. _Invalid_ - Indicating that, while the `Software.Version.Purpose` suggested
139   the image was valid for a managed element, a detailed analysis by the
140   _ItemUpdater_ showed that it was not. Reasons may include image corruption
141   detected via CRC or security verification failure. An event may be recorded
142   with additional details.
1433. _Ready_ - Indicating that the `Software.Version` can be activated.
1444. _Activating_ - Indicating that the `Software.Version` is in the process of
145   being activated.
1465. _Active_ - The `Software.Version` is active on the managed element. Note that
147   on systems with redundant storage devices a version might be _Active_ but not
148   the primary version.
1496. _Failed_ - The `Software.Version` or the storage medium on which it is stored
150   has failed. An event may be recorded with additional details.
1517. _Staged_ - The `Software.Version` is in staged flash region. This will be
152   moved from staged flash region to active flash region upon reset. Staged
153   flash region is the designated flash area which is used to store the
154   integrity validated firmware image that comes in during firmware update
155   process. Note that the staged image is not necessarily a functional firmware.
156
157### Image Apply Time
158
159`xyz.openbmc_project.Software.ApplyTime` has a property called
160RequestedApplyTime that indicates when the newly applied software image will be
161activated. RequestedApplyTime is a D-Bus property that maps to the "ApplyTime"
162property in the Redfish UpdateService schema. Below are the currently supported
163values and the value can be supplied through HttpPushUriApplyTime object:
164
1651. _Immediate_ - Indicating that the `Software.Version` needs to be activated
166   immediately.
1672. _OnReset_ - Indicating that the `Software.Version` needs to be activated on
168   the next reset.
169
170### Blocking State Transitions
171
172It is sometimes useful to block a system state transition while activations are
173being performed. For example, we do not want to boot a managed host while its
174BIOS is being updated. In order to facilitate this, the interface
175`xyz.openbmc_project.Software.ActivationBlocksTransition` may be added to any
176object with `Software.Activation` to indicate this behavior. See that interface
177for more details.
178
179It is strongly suggested that any activations are completed prior to a managed
180BMC reboot. This could be facilitated with systemd service specifiers.
181
182### Software Versions
183
184All version identifiers are implementation specific strings. No format should be
185assumed.
186
187Some software versions are a collection of images, each with their own version
188identifiers. The `xyz.openbmc_project.Software.ExtendedVersion` interface can be
189added to any `Software.Version` to express the versioning of the aggregation.
190
191### Activation Progress
192
193The `xyz.openbmc_project.Software.ActivationProgress` interface is provided to
194show current progress while a software version is _Activating_. It is expected
195that an _ItemUpdater_ will dynamically create this interface while the version
196is _Activating_ and dynamically remove it when the activation is complete (or
197failed).
198
199### Handling Redundancy
200
201The `xyz.openbmc_project.Software.RedundancyPriority` interface is provided to
202express the relationship between two (or more) software versions activated for a
203single managed element. It is expected that all installed versions are listed as
204_Active_ and the `Priority` shows which version is the primary and which are
205available for redundancy.
206
207Prior to `Activation`, it can be useful to indicate a desired
208`RedundancyPriority`. This can be done by setting the `Priority` on the
209`RequestedRedundancyPriority` interface. Some _ItemUpdater_ implementations may
210not honor this field or be unable to comply with the request, in which case the
211resulting `Activation` may result in one of two conditions: a
212`ActivationState = Failed` or an `ActivateState = Active` with a
213`RedundancyPriority = 0 (High)`.
214
215### Image Clean Up
216
217An _ItemUpdater_ is responsible for garbage collecting images contained on the
218elements it is managing. Often an element can only contain a single image so
219this is a natural side-effect of the update process. In other cases, the
220_ItemUpdater_ may remove images based on the `RedundancyPriority` assigned to an
221image.
222
223The _ImageManager_ should expose `Object.Delete()` methods to remove images from
224the BMC filesystem. It is possible that some _ItemUpdater_(s) will call this
225method once the `Version` is successfully activated.
226
227In some designs there may be multiple _ItemUpdater_ instances which are handling
228update for different system elements, all of which can potentially apply the
229same software image (as in a multi-host design). The _ImageManager_ may
230optionally monitor the `Software.Activation` signals and actively garbage
231collect an image once all `Software.Activation` under the `.../software/<id>`
232path are either `Active` or `Staged`.
233
234### Software Settings
235
236The `xyz.openbmc_project.Software.Settings` interface is provided to show the
237settings of the given software. The `Software.Settings` should be added to along
238side `Software.Version` to represent its state from the same service.
239
240```sh
241busctl introspect $SERVICE /xyz/openbmc_project/software/software_0
242...
243xyz.openbmc_project.Software.Version   interface   -
244.Purpose                               property    s
245.Version                               property    s
246xyz.openbmc_project.Software.Settings  interface   -
247.WriteProtected                        property    b
248...
249```
250
251The _ItemUpdater_ manages the fields such as `WriteProtected` to help provide
252information on how the software is managed.
253
254## REST use-cases
255
256### Find all software versions on the system, either active or available
257
258List `/xyz/openbmc_project/software/`. This list can be filtered to just active
259listing `.../software/active/` and following the `software_version` association
260to retrieve version information. To list just "functional" or running versions
261list `/xyz/openbmc_project/software/functional/`.
262
263### Find all software versions on a managed element
264
265List `/xyz/openbmc_project/inventory/.../<item>/activation` association.
266
267### Upload new version via REST
268
269HTTP PUT to `/xyz/openbmc_project/software/`. _ImageManager_ will assign the
270`<id>` when called for Object.Add().
271
272### Upload new version via ???
273
274Need additional interfaces defined for alternative upload methods.
275
276### Activate a version
277
278Modify `RequestedActivation` to _Active_ on the desired `Activation`.
279
280### Switch primary image
281
282Set `Priority` to 0 on the desired `RedundancyPriority` interface.
283