| # Redfish Aggregation |
| |
| With Redfish aggregation the host BMC aggregates resources from specified |
| satellite BMCs. Aggregated resources are accessed in the same way as local |
| resources. The only observable difference between local and aggregated resources |
| is aggregated resources have a special prefix added to their URIs. |
| |
| The satellite BMCs are not aware that they are being aggregated. The aggregating |
| BMC handles the additional processing required to allow the aggregating BMC and |
| satellite BMCs to be observable as a singular combined BMC. |
| |
| ## Configuration |
| |
| bmcweb by default is compiled with Redfish aggregation disabled. To enable it |
| add the following to your local.conf. |
| |
| ```bash |
| EXTRA_OEMESON:pn-bmcweb:append = "-Dredfish-aggregation='enabled'" |
| ``` |
| |
| In addition to the compiler option, bmcweb requires a satellite config to be |
| present on D-Bus. The config contains the necessary information to connect to a |
| satellite BMC. The following is an example entity-manager json config for a |
| satellite located at 160.80.40.20:80 |
| |
| ```bash |
| { |
| "Exposes": [ |
| { |
| "Hostname": "160.80.40.20", |
| "Port": "80", |
| "Name": "sat0", |
| "Type": "SatelliteController", |
| "AuthType": "None" |
| } |
| ], |
| ``` |
| |
| Note that the satellite config must specify a hostname, port, and authentication |
| type. Currently the only type of supported authentication is "None". Bmcweb will |
| reject satellite configs that do not comply with these requirements. |
| |
| ## Satellite BMC Restrictions |
| |
| - Can only aggregate a single satellite BMC |
| - HTTP only connection to satellite BMC |
| - No authentication on satellite BMC |
| |
| ## Supported Resources |
| |
| Aggregation is supported for all resources that are currently supported by |
| bmcweb and appear under top level collections. A top level collection is the |
| first collection reached when walking the path from the service root. The |
| following are a few examples of top level collections: |
| |
| ```bash |
| /redfish/v1/Chassis |
| /redfish/v1/TaskService/Tasks |
| /redfish/v1/UpdateService/FirmwareInventory |
| |
| ``` |
| |
| The only exception is `/redfish/v1/JsonSchemas`. We purposefully do not |
| aggregate that collection since some of the schemas can be very large and their |
| versions could differ from the schema versions on the aggregating BMC. Instead |
| it is assumed that the schemas are compatible. |
| |
| Similarly, we do not aggregate any satellite `$metadata` which is available at |
| `/redfish/v1/$metadata`. We make the assumption that the $metadata of the |
| aggregating BMC is compatible with all aggregated satellite resources. |
| |
| Complete support needs to be added for all top level resource collections that |
| are defined in the Redfish spec, but are not yet supported by bmcweb. Queries to |
| these endpoints like `/redfish/v1/<unsupported_collection>` will return all |
| resources on the satellite BMC, but a link for the unsupported collection will |
| not appear when querying the Service Root. |
| |
| ## Operation |
| |
| Aggregated resources will have a prefix appended to their URIs in order to |
| distinguish them from resources that are local to the aggregating BMC. The |
| aggregation prefix is planned to be derived from the uuid of the aggregating |
| BMC. This should result in the aggregation prefix being unique to each |
| aggregating BMC. |
| |
| The general URI format for aggregated resources is |
| |
| ```bash |
| /redfish/v1/<resource_collection>/<prefix>_<resource_id> |
| ``` |
| |
| When support is added for aggregating more than one satellite BMC, then each |
| satellite will be assigned its own unique satellite prefix. |
| |
| ### Aggregating Collections |
| |
| Requests to top level collections are locally processed like normal by the |
| aggregating BMC. In addition, the request is forwarded to the satellite BMCs as |
| long as it was a GET request. Any other types of request is still handled |
| locally, but the aggregator will not forward it to the satellites. |
| |
| The responses are processed by first adding the aggregation prefix to the URIs |
| and then adding the URIs to the "Members" array in the response generated by the |
| aggregating BMC. |
| |
| If the responses from the satellite responses do not contain a "Members" array |
| then we assume the initial request was not actually for a top level collection |
| and we do not attempt to add anything to the response generated by the |
| aggregating BMC. Similarly, we ignore any satellite responses that do not return |
| a 200 response code. |
| |
| The following example shows how aggregated resources are added to a top level |
| collection |
| |
| ```bash |
| curl -k -H "X-Auth-Token: $token" https://${bmc}/redfish/v1/Systems |
| { |
| "@odata.id": "/redfish/v1/Systems", |
| "@odata.type": "#ComputerSystemCollection.ComputerSystemCollection", |
| "Members": [ |
| { |
| "@odata.id": "/redfish/v1/Systems/system" |
| }, |
| { |
| "@odata.id": "/redfish/v1/Systems/5B247A_system" |
| } |
| ], |
| "Members@odata.count": 2, |
| "Name": "Computer System Collection" |
| } |
| ``` |
| |
| ### Aggregating a Resource |
| |
| When the request is for a singular satellite resource instead of a top level |
| collection, the aggregator will forward all types of requests (GET, POST, |
| DELETE, etc.). This is different from aggregating a collection where only GET |
| requests are forwarded to satellites. |
| |
| Requests for aggregated resources are not fully processed by the aggregating |
| BMC. These requests are identified by the presence of the aggregation prefix in |
| the request's URI. |
| |
| The following steps are used to retrieve the requested aggregated resource: |
| |
| 1. Determine the target satellite BMC based on the prefix |
| 2. Remove the prefix from the response URI |
| 3. Forward the request to the satellite BMC |
| 4. Where appropriate add the prefix to the URIs in the response |
| 5. Return the updated response from the satellite BMC |
| |
| ```bash |
| curl -k -H "X-Auth-Token: $token" https://${bmc}/redfish/v1/Systems/5B247A_system |
| { |
| "@odata.id": "/redfish/v1/Systems/5B247A_system", |
| ... |
| "LogServices": { |
| "@odata.id": "/redfish/v1/Systems/5B247A_system/LogServices" |
| }, |
| "Memory": { |
| "@odata.id": "/redfish/v1/Systems/5B247A_system/Memory" |
| }, |
| ... |
| } |
| ``` |
| |
| We consider any response to be a valid response code from the satellite BMC. The |
| aggregator will attempt to perform prefix fixing on the received response and |
| then forward it to the client. It is up to the client to determine how to react |
| to the received response (e.g. resend the request). A failure during the |
| communication process will cause bmcweb to attempt to resend the request as per |
| the retry policy. Exhausting the retry policy will result in the aggregating BMC |
| returning a 502 response. |
| |
| ## Remaining Work |
| |
| The long term goal is to have Redfish aggregation be enabled by default. There |
| are some features that must still be implemented before that can happen. |
| |
| 1. Add links to satellite only collections in responses from service root and |
| other appropriate locations |
| 2. Generate aggregation prefix from uuid |
| 3. Aggregate more than one satellite BMC |
| 4. Support HTTPS connection to satellite BMC |
| |
| Support for the following items should be added as well. However, their |
| implementation is not a requirement to being able to enable Redfish aggregation |
| by default. |
| |
| 1. Support adding a Contains/ContainedBy relationship between local and |
| aggregated Chassis. |
| 2. Support Authentication with satellite BMCs |