blob: eff23fe2a7a3cdc46714f890388c6a9d924645f1 [file] [log] [blame] [view]
# tlBMC Redfish Resource Ownership Model
go/tlbmc-redfish-resource-ownership
<!--*
# Document freshness: For more information, see go/fresh-source.
freshness: { owner: 'tlbmc-dev' reviewed: '2025-05-13' }
*-->
[TOC]
Note: This is an evolving document and definitions may shift as the scope of
tlBMC increases.
tlBMC ownership of a redfish resource happens when a redfish URL is sent to the
tlBMC app rather than the traditional gBMCweb app. As described in
go/tlbmc-smart-routing, an incoming redfish query may be routed to traditional
bmcweb or to the tlBMC app depending on if the resource is "owned" by tlBMC,
this is called smart routing. In the case of tlBMC ownership, a query being sent
to tlBMC means that tlBMC is providing the query response based on the internal
representation of the requested object after tlBMC has parsed the EM config.
There are no dbus calls being made or interactions with other daemons to return
this response.
There are three possible models for a redfish resource to be "owned" by tlBMC
today. This document describes the extent to which tlBMC may have ownership over
a resource.
## Fully Owned
### Chassis
Chassis resources onboarded to tlBMC are detected and fully owned. In this case,
FRUs are detected by tlBMC over I2C scan and the Redfish response is provided by
the tlBMC backend. Every part of the Chassis response comes from tlBMC,
including Fru info received from the eeprom of the device and links to
associated Chassis, Cables, Processors, or Drives which are configured in the EM
config.
An example can be seen from this config:
```json
{
"Name": "foo",
"ProbeV2": {
"IpmiFru": {
"BOARD_PRODUCT_NAME": "Foo"
}
},
"ResourceType": "RESOURCE_TYPE_BOARD",
"Exposes":[
{
"Name": "Foo Downstream Port",
"Label": "PE0",
"Type": "PortDownstream"
},
{
"Type": "MAX31725",
"Bus": 1,
"Address": "0x4c",
"Name": "max31725_0",
"Name1": "max31725_1",
"TlbmcOwned":true
}
],
"Asset": {
"Manufacturer": "$BOARD_MANUFACTURER",
"Model": "$BOARD_PRODUCT_NAME",
"PartNumber": "$BOARD_PART_NUMBER",
"SerialNumber": "$BOARD_SERIAL_NUMBER"
}
}
```
The above config might produce the following redfish response, which contains
fields fully populated by tlBMC, requiring no additional dbus calls or
interactions with other daemons.
```json
{
"@odata.id": "/redfish/v1/Chassis/Foo",
"@odata.type": "#Chassis.v1_17_0.Chassis",
"Assembly": {
"@odata.id": "/redfish/v1/Chassis/Foo/Assembly"
},
"Certificates": {
"@odata.id": "/redfish/v1/Chassis/Foo/Certificates"
},
"ChassisType": "Module",
"Drives": {
"@odata.id": "/redfish/v1/Chassis/Foo/Drives"
},
"EnvironmentMetrics": {
"@odata.id": "/redfish/v1/Chassis/Foo/EnvironmentMetrics"
},
"Id": "Foo",
"Links": {
"ComputerSystems": [
{
"@odata.id": "/redfish/v1/Systems/system"
}
],
"Contains": {
"@odata.id": "/redfish/v1/Chassis/Bar"
},
"ManagedBy": [
{
"@odata.id": "/redfish/v1/Managers/bmc"
}
]
},
"Manufacturer": "Foo_Manufacturer",
"Memory": {
"@odata.id": "/redfish/v1/Systems/system/Memory"
},
"Model": "Foo_Model",
"Name": "Foo",
"PCIeDevices": {
"@odata.id": "/redfish/v1/Systems/system/PCIeDevices"
},
"PCIeSlots": {
"@odata.id": "/redfish/v1/Chassis/Foo/PCIeSlots"
},
"PartNumber": "1111111-11",
"Power": {
"@odata.id": "/redfish/v1/Chassis/Foo/Power"
},
"PowerState": "On",
"PowerSubsystem": {
"@odata.id": "/redfish/v1/Chassis/Foo/PowerSubsystem"
},
"Sensors": {
"@odata.id": "/redfish/v1/Chassis/Foo/Sensors"
},
"SerialNumber": "AAAAA-11111111",
"Status": {
"Health": "OK",
"HealthRollup": "OK",
"State": "Enabled"
},
"Thermal": {
"@odata.id": "/redfish/v1/Chassis/Foo/Thermal"
},
"ThermalSubsystem": {
"@odata.id": "/redfish/v1/Chassis/Foo/ThermalSubsystem"
},
"TrustedComponents": {
"@odata.id": "/redfish/v1/Chassis/Foo/TrustedComponents"
}
}
```
### Sensors
Sensors supported by tlBMC are fully owned. Sensor configurations are parsed
from EM configs and readings are polled directly from hwmon files. There are no
dbus calls being made to supply sensor readings in tlBMC.
Note: Since tlBMC does not support all sensor types yet (only Hwmon Temp, PSU,
and I2CFan sensors for now), tlBMC does not own sensor collection. The response
at `/redfish/v1/Chassis/{ChassisId}/Sensors` is routed to bmcweb but a query for
individual sensor will be routed to tlBMC if supported.
An example can be seen from this config:
```json
"Exposes": [
{
"Name": "foo_external_sensor",
"Units": "Watts",
"MinValue": 6500,
"MaxValue": 7500,
"Type": "ExternalSensor"
},
{
"Name": "foo_psu_sensor",
"Address": "0x44",
"Bus": "11",
"Labels": [
"vout1",
"vout2",
"vout3",
"vout4"
],
"vout1_Name": "foo_psu_sensor_0",
"vout2_Name": "foo_psu_sensor_1",
"vout3_Name": "foo_psu_sensor_2",
"vout4_Name": "foo_psu_sensor_3",
"Type": "ADM1266",
"TlbmcOwned": true
},
...
]
```
Since the `foo_psu_sensor` has the field `"TlbmcOwned"` and is of the supported
type `ADM1266`, the response when any of these individual sensors is queried
will be provided by tlBMC.
## Linked Resources Not Owned
For some configurations, tlBMC may detect and own the Chassis resource, but
there may be resources configured in the EM config file that are not owned by
tlBMC.
Since the scope of tlBMC is limited to only the Chassis path at the moment it is
possible for some Chassis to not own the resources linked in its "Links", even
when configured in the EM config. When these properties are queried, the
response will be populated from the traditional bmcweb path.
These associated resources that are linked in response but not yet owned by
tlBMC include:
- Storages
- Processors
- Cables
An example can be seen in this config:
```json
# Assume there are two other Chassis EM configs connecting to the ports
# Assume there is another Cable EM config with CableUpstreamConnection to Foo Cable Downstream
{
...
"Exposes": [
{
"Label": "IO0",
"Name": "foo Port 1",
"Type": "PortDownstream",
"User": "tlbmc"
},
{
"Label": "IO1",
"Name": "foo Port 2",
"Type": "PortDownstream",
"User": "tlbmc"
},
{
"Name": "Foo Cable Downstream",
"CableId": "foo_cable",
"Type": "CableDownstreamConnection",
"User": "tlbmc"
},
...
{
"Name": "cpu0",
"Type": "Processor",
"User": "tlbmc"
},
{
"Name": "cpu1",
"Type": "Processor",
"User": "tlbmc"
},
],
...
"Storage":
{
"Id": "foo_storage",
"User": "tlbmc"
}
...
}
```
A snippet of the `Links` field resulting from querying this chassis is provided
below. This has been annotated to show the resources that are tlBMC owned and
not. As seen from the EM config above, several fields are configured for tlBMC
to produce these links but tlBMC does not have ownership of the resource paths
when queried.
<pre><code class="lang-json">
{
...
"Links": {
"Cables": [
{
"@odata.id": <del>"/redfish/v1/Cables/foo_cable"</del>
}
],
"Cables@odata.count": 1,
"ComputerSystems": [
{
"@odata.id": "/redfish/v1/Systems/system"
}
],
"Contains": [
{
"@odata.id":<ins>"/redfish/v1/Chassis/bar"</ins>
},
{
"@odata.id":<ins>"/redfish/v1/Chassis/baz"</ins>
}
],
"Contains@odata.count": 2,
"ManagedBy": [
{
"@odata.id": "/redfish/v1/Managers/bmc"
}
],
"Processors": [
{
"@odata.id": <del>"/redfish/v1/Systems/system/Processors/cpu0"</del>
},
{
"@odata.id":<del> "/redfish/v1/Systems/system/Processors/cpu1"</del>
}
],
"Processors@odata.count": 2,
"Storage": [
{
"@odata.id": <del>"/redfish/v1/Systems/system/Storage/foo_storage"</del>
}
],
"Storage@odata.count": 1
},
...
}
</code></pre>
## FRUs Not Detected by tlBMC but Modeled
For some configurations, tlBMC does not detect the existence of the resource but
may model it. tlBMC would have a TRUE probe for the resource i.e. Cables. In
this case, the existence of the cable is implied by the successful detection of
the surrounding Chassis resource and will be populated in the Cables Links of
the associated Chassis.
Here, tlBMC does not own the resource and querying the `/redfish/v1/Cables` path
will return the traditional bmcweb response. tlBMC properties in this case exist
only to correctly populate the associations (Links) to the `/redfish/v1/Cables`
path in the associated resources that tlBMC does own i.e. upstream and
downstream chassis to the cable. This is necessary for tlBMC to correctly fully
own Chassis. In the future, when tlBMC fully owns these resources, the probe
will become a real probe.
An example can be seen from this cable config:
```json
{
"Exposes": [
{
"Name": "Foo Cable Downstream",
"CableId": "FooCable",
"Type": "CableUpstreamConnection",
"User": "tlbmc"
},
{
"Name": "Foo Cable Upstream",
"CableId": "FooCable",
"Type": "CableDownstreamConnection",
"User": "tlbmc"
}
],
"Name": "NcsiCable",
"ProbeV2": "TRUE",
"ResourceType": "RESOURCE_TYPE_CABLE",
"Type": "Cable",
}
```
Although tlBMC fields are required in this EM config to create the correct
relationships when queried, tlBMC does not own `/redfish/v1/Cables/FooCable` and
this will be served from traditional Bmcweb.