xref: /openbmc/docs/designs/physical-topology.md (revision 33d73e38)
1# Physical Topology for Inventory Items
2
3Author: Benjamin Fair <benjaminfair>
4
5Other contributors: Ed Tanous <edtanous>
6
7Created: June 1, 2022
8
9## Problem Description
10
11Complex systems may contain many inventory objects (such as chassis, power
12supplies, cables, fans, etc.) with different types of relationships among these
13objects. For instance, one chassis can contain another, be powered by a set of
14power supplies, connect to cables, and be cooled by fans. OpenBMC does not
15currently have a standard way to represent these types of relationships.
16
17## Background and References
18
19This builds on a
20[prior proposal](https://gerrit.openbmc.org/c/openbmc/docs/+/41468), but
21specifies using Associations for all relationships (Proposal II) rather than
22path hierarchies (Proposal I).
23
24The main driver of this design is Redfish, particularly the Links section of the
25[Chassis schema](https://redfish.dmtf.org/schemas/Chassis.v1_20_0.json).
26
27Changes to phosphor-dbus-interfaces documenting new Associations have been
28[proposed](https://gerrit.openbmc.org/c/openbmc/phosphor-dbus-interfaces/+/46806)
29but not yet merged until consensus can be reached on the design.
30
31This design was initially discussed in
32[Discord](https://discord.com/channels/775381525260664832/819741065531359263/964321666790477924),
33where some initial consensus was reached.
34
35## Requirements
36
37- Must represent one-to-many relationships from chassis inventory objects which:
38  - Connect to cables
39  - Contain other chassis and/or are contained by a chassis
40  - Contain storage drives
41  - Are cooled by fans
42  - Are powered by power supplies
43  - Contain processors such as CPUs
44  - Contain memory such as DIMMs
45- Must support relationships which are predefined, detected at runtime, or a
46  combination of both
47  - Runtime detection could include I2C bus scanning, USB enumeration, and/or
48    MCTP discovery
49
50### Optional goals (beyond initial implementation)
51
52- Non-chassis inventory objects may also need one-to-many relationships
53  - CPUs have CPU cores and associated PCIe slots
54  - CPU cores have threads
55
56## Proposed Design
57
58The design affects three layers of the OpenBMC architecture:
59phosphor-dbus-interfaces, inventory managers, and inventory consumers such as
60bmcweb.
61
62### phosphor-dbus-interfaces
63
64In the interface definition for Inventory/Item or the more specific subtypes, we
65add an association definition for each of the relationship types listed above
66and corresponding association definitions linking back to that item.
67
68### Inventory Managers
69
70#### phosphor-inventory-manager
71
72phosphor-inventory-manager already has support for exporting custom
73Associations, so no changes are needed here.
74
75#### entity-manager
76
77For entity-manager, we add new `Exposes` stanzas for the upstream and downstream
78ports in the JSON configurations. The upstream port has a type ending in `Port`
79(such as a `BackplanePort`, `PowerInputPort`, etc). The downstream port has type
80`DownstreamPort` and a `ConnectsToType` property that refers to the upstream
81port based on its type.
82
83New code in entity-manager matches these properties and exposes associations on
84D-Bus based on the types of the inventory objects involved. Two Chassis objects
85will have `containing` and `contained_by`, a Chassis and PowerSupply will have
86`powering` and `powered_by` respectively, etc.
87
88Example JSON configurations:
89
90superchassis.json
91
92```
93{
94    "Exposes": [
95        {
96            "Name": "MyPort",
97            "Type": "BackplanePort"
98        }
99    ],
100    "Name": "Superchassis",
101    "Probe": "TRUE",
102    "Type": "Chassis"
103}
104```
105
106subchassis.json:
107
108```
109{
110    "Exposes": [
111        {
112            "ConnectsToType": "BackplanePort",
113            "Name": "MyDownstreamPort",
114            "Type": "DownstreamPort"
115        }
116    ],
117    "Name": "Subchassis",
118    "Probe": "TRUE",
119    "Type": "Chassis"
120}
121```
122
123#### Other inventory managers
124
125If there are other daemons on the system exporting inventory objects, they can
126choose to include the same Associations that phosphor-inventory-manager and
127entity-manager use.
128
129### Inventory consumers
130
131When a daemon such as bmcweb wants to determine what other inventory items have
132a relationship to a specific item, it makes a query to the object mapper which
133returns a list of all associated items and the relationship types between them.
134
135Example `busctl` calls:
136
137```
138$ busctl get-property xyz.openbmc_project.ObjectMapper \
139/xyz/openbmc_project/inventory/system/chassis/Superchassis/containing \
140xyz.openbmc_project.Association endpoints
141
142as 1 "/xyz/openbmc_project/inventory/system/chassis/Subchassis"
143
144$ busctl get-property xyz.openbmc_project.ObjectMapper \
145/xyz/openbmc_project/inventory/system/chassis/Subchassis/contained_by \
146xyz.openbmc_project.Association endpoints
147
148as 1 "/xyz/openbmc_project/inventory/system/chassis/Superchassis"
149```
150
151## Alternatives Considered
152
153### Path hierarchies
154
155An alternative proposal involves encoding the topological relationships between
156inventory items using D-Bus path names. As an example, a chassis object
157underneath another would be contained by that parent chassis. This works for
158simple relationships which fit into a tree structure, but breaks down when more
159complicated relationships are introduced such as cables or fans and power
160supplies shared by multiple objects or soldered CPUs which are "part of" instead
161of "contained by" a chassis. Introducing separate trays with their own topology
162further complicates the path hierarchy approach.
163
164A potential compromise would be allowing a combination of path hierarchies and
165associations to communicate topology, but this significantly increases the
166complexity of consumers of this information since they would have to support
167both approaches and figure out a way to resolve conflicting information.
168
169Associations are the only approach that fits all use cases, so we should start
170with this method. If the additional complexity of path hierarchies is needed in
171the future, it can be added as a separate design in the future.
172
173To improve usability for humans inspecting a system, there could also be a
174dedicated tool to query for Associations of a specific type and present a
175hierarchical view of the current topology. Additionally,
176phosphor-inventory-manager configurations can organize their D-Bus objects in
177whatever way makes sense to the author of those configurations, but the
178Association properties would still need to be present in order for inventory
179consumers to understand the topology.
180
181## Impacts
182
183This new API will be documented in phosphor-dbus-interfaces as described above.
184If no topology information is added to configuration files for entity-manager or
185phosphor-inventory-manager, then the D-Bus interfaces exported by them will not
186change. If consumers of inventory data such as bmcweb do not find the new
187associations, then their output such as Redfish will not change either.
188
189### Organizational
190
191Does this repository require a new repository? No - all changes will go in
192existing repositories.
193
194## Testing
195
196All new code in entity-manager and bmcweb will be unit tested using existing
197frameworks and infrastructure. We will add new end-to-end tests in
198openbmc-test-automation to ensure the Redfish output is correct.
199
200## Update history
201
202### February 14, 2023
203
204- Update the example port type and name from `Connector` to `Port`
205- Change the association names based on feedback from phosphor-dbus-interfaces
206  maintainers (chassisContains -> containing, chassisContainedBy ->
207  contained_by, etc)
208