This document describes the Redfish Update Service routes in tlBMC, primarily handled by update_service.cc. This service is key for firmware updates and related actions.
The Update Service and its routes are active if the install_module is enabled in the Central Configuration.
The configuration flag is checked in all_routes.cc:
if (GetTlbmcConfig().install_module().enabled()) { task_service::RegisterRoutes(app, root_path); update_service::RegisterRoutes(app, root_path); redfish_authorization::RegisterRoutes(app, root_path); }
/redfish/v1/UpdateServiceHandleUpdateService/redfish/v1/UpdateService/FirmwareInventory/redfish/v1/UpdateService/MultipartUpdate/ (for uploading firmware packages)/redfish/v1/UpdateService/Actions/UpdateService.SimpleUpdateGoogle.InstallOfflineNodeEntityGoogle.InstallHostInstallManifestGoogle.WipeRwfsGoogle.ReformatEmmc/redfish/v1/UpdateService/Oem/Google/DebugLogs/redfish/v1/UpdateService/Oem/Google/OfflineNodeEntityBase64 (exposed as a property)/redfish/v1/UpdateService/Oem/Google/HostInstallManifest (exposed as a property)/redfish/v1/UpdateService/Oem/Google/AuthorizationConfig/redfish/v1/UpdateService/Oem/Google/AuthorizationPrivilegeRegistryThe following JSON snippet demonstrates a sample Redfish representation of the UpdateService resource (with specific platform identifiers redacted) as exposed over HTTP GET requests:
{ "@odata.id": "/redfish/v1/UpdateService", "@odata.type": "#UpdateService.v1_8_0.UpdateService", "Actions": { "#UpdateService.SimpleUpdate": { "@Redfish.ActionInfo": "/redfish/v1/UpdateService/SimpleUpdateActionInfo", "target": "/redfish/v1/UpdateService/Actions/UpdateService.SimpleUpdate" }, "Oem": { "#Google.InstallHostInstallManifest": { "@Redfish.ActionInfo": "/redfish/v1/UpdateService/Oem/Google/InstallHostInstallManifestActionInfo", "target": "/redfish/v1/UpdateService/Actions/Oem/Google.InstallHostInstallManifest" }, "#Google.InstallOfflineNodeEntity": { "@Redfish.ActionInfo": "/redfish/v1/UpdateService/Oem/Google/InstallOfflineNodeEntityActionInfo", "target": "/redfish/v1/UpdateService/Actions/Oem/Google.InstallOfflineNodeEntity" }, "#Google.ReformatEmmc": { "target": "/redfish/v1/UpdateService/Actions/Oem/Google.ReformatEmmc" }, "#Google.WipeRwfs": { "target": "/redfish/v1/UpdateService/Actions/Oem/Google.WipeRwfs" } } }, "FirmwareInventory": { "@odata.id": "/redfish/v1/UpdateService/FirmwareInventory" }, "Id": "UpdateService", "MultipartHttpPushUri": "/redfish/v1/UpdateService/MultipartUpdate/", "Name": "Update Service", "Oem": { "Google": { "AuthorizationConfig": { "@odata.id": "/redfish/v1/UpdateService/Oem/Google/AuthorizationConfig" }, "AuthorizationPrivilegeRegistry": { "@odata.id": "/redfish/v1/UpdateService/Oem/Google/AuthorizationPrivilegeRegistry" }, "DebugLogs": { "@odata.id": "/redfish/v1/UpdateService/Oem/Google/DebugLogs" }, "HostInstallManifest": {}, "OfflineNodeEntityBase64": "" } }, "ServiceEnabled": true }
URL: /redfish/v1/UpdateService/FirmwareInventory
Handler: HandleFirmwareInventory
Method: GET
Description: Collection of software inventory items representing firmware. It scans the run/install/inventory/ directory (under the root path) for subdirectories containing inventory.json files.
URL: /redfish/v1/UpdateService/FirmwareInventory/{MemberId}
Handler: HandleFirmwareInventoryMember
Method: GET
Description: Details of a specific firmware component. The content is read from run/install/inventory/{MemberId}/inventory.json. Includes Version, Description, and OEM Component Status (/Oem/Google/ComponentStatus).
Firmware update actions are gated by the store's ownership configuration. If IsFirmwareUpdateable() returns false, these endpoints return a Forbidden (403) response.
/redfish/v1/UpdateService/MultipartUpdate/internal::HandleMultipartUpdatemnt/luks-mmcblk0_fs/firmware_bundle.tar.gz.Multipart-SHA256-ClientSide and Multipart-SHA256-ServerSide are present.install-service.service systemd unit asynchronously.Accepted (202) response pointing to the Task Service: /redfish/v1/TaskService/Tasks/FirmwareBundleUpdate.URL: /redfish/v1/UpdateService/Actions/UpdateService.SimpleUpdate/
Handler: internal::HandleSimpleUpdate
Method: POST
Description: Triggers a firmware update from a remote URI.
ImageURI (required) and TransferProtocol (optional, “HTTP” or “HTTPS”)./mnt/luks-mmcblk0_fs/firmware_bundle.tar.gz and then triggers install-service.service.Accepted (202) response pointing to the Task Service: /redfish/v1/TaskService/Tasks/FirmwareBundleDownload.run/install/download_task.json.URL: /redfish/v1/UpdateService/SimpleUpdateActionInfo/
Handler: HandleSimpleUpdateActionInfo
Method: GET
Description: Action info for Simple Update.
/redfish/v1/UpdateService/Actions/Oem/Google.InstallOfflineNodeEntityHandleInstallOfflineNodeEntity/redfish/v1/UpdateService/Oem/Google/InstallOfflineNodeEntityActionInfo (GET)Base64EncodedContent.production_msv.node_entities_proto.OfflineNodeEntityInformation.machine_name in the resolved config is not empty and is under 27 characters.var/google/googlemachineidentity/live/offline_node_entities.pb./redfish/v1/UpdateService/Actions/Oem/Google.InstallHostInstallManifestHandleInstallHostInstallManifest/redfish/v1/UpdateService/Oem/Google/InstallHostInstallManifestActionInfo (GET)run/host_install_manifest.json.Action URL: /redfish/v1/UpdateService/Actions/Oem/Google.WipeRwfs
Handler: internal::HandleWipeRwfs
Method: POST
Description:
[!WARNING]
Do not use this action. Prefer the unified wipe API at
/redfish/v1/Managers/bmc/Actions/Oem/Google.WipeExample Replacement Payload:
POST /redfish/v1/Managers/bmc/Actions/Oem/Google.Wipe { "WipeBmcRwfs": true }
Writes an empty file to var/google/do-rwfs-purge to flag that the read-write filesystem should be wiped on the next boot.
Action URL: /redfish/v1/UpdateService/Actions/Oem/Google.ReformatEmmc
Handler: internal::HandleReformatEmmc
Method: POST
Description:
[!WARNING]
Do not use this action. Prefer the unified wipe API at
/redfish/v1/Managers/bmc/Actions/Oem/Google.WipeExample Replacement Payload:
POST /redfish/v1/Managers/bmc/Actions/Oem/Google.Wipe { "WipeBmcNssAndWipeDioriteNss": true }
Sends a SIGUSR1 signal to psdmd.service (systemctl kill --signal=SIGUSR1 psdmd.service) to trigger an asynchronous eMMC reformat.
/redfish/v1/UpdateService/Oem/Google/DebugLogsinternal::HandleDebugLogscollect-debug-log.service systemd unit and returns the JSON content from run/install/debug_log.json./Oem/Google/OfflineNodeEntityBase64 (in GET /redfish/v1/UpdateService)var/google/googlemachineidentity/live/offline_node_entities.pb./Oem/Google/HostInstallManifest (in GET /redfish/v1/UpdateService)run/host_install_manifest.json.The firmware update capability is gated by the store's ownership configuration via IsFirmwareUpdateable().
StoreImpl::IsFirmwareUpdateable() checks if a CredentialManager is instantiated.CredentialManager exists (e.g. TrustBundleInstallModule is disabled), firmware update is allowed by default (true).CredentialManager exists, it delegates to CredentialManager::IsFirmwareUpdateable().CredentialManager::IsFirmwareUpdateable() checks owner_verification_cert_configuration_.true.fw_update_enabled() from the configuration.