跳到主要内容

POST – 固件的分段式 HTTP 推送更新

此操作可通过将软件映像文件推送到 UpdateService.MultipartHttpPushUri 属性引用的 URI,对已装软件组件执行更新。在 XCC2 Redfish 服务中,UpdateService.MultipartHttpPushUri 属性值为“/mfwupdate”。

请求 URL

POST https://<BMC_IPADDR>/mfwupdate

请求正文

HTTP POST 操作应为认证提供用于访问 UpdateService 资源的足够权限。

响应

字段类型错误消息 ID

Id

字符串

创建的任务 ID。

Name

字符串

任务名称。

Description

字符串

“This resource represents a task for a Redfish implementation.”

TaskMonitor

字符串

此任务的任务监控器的 URI。

StartTime

字符串

上次启动任务的日期时间戳。

TaskState

字符串

任务的状态。

Messages

数组

这是与任务关联的消息数组。

PercentComplete

整数

任务完成百分比。

HidePayload

布尔

指示 Payload 对象为隐藏状态且不会在执行 GET 时返回。

客户端可以选择在 POST 正文中包含 HTTP 分段式表单数据,以便指定 RFC2388 规定的映像文件名。XCC2 检查此标头并验证固件更新的大小是否受支持,并在文件大小过大时返回代码 413。如果客户端在一个 POST 请求中上传多个文件,则会返回代码 400,并显示一条错误消息以指示格式不受支持。

当 HTTP 推送更新正在进行时,可能会拒绝分段式 HTTP 推送更新并返回代码 503,反之亦然。

状态代码

HTTP 状态代码错误消息 ID
202Accepted
400BadRequest、ActionParamMissing、ActionParamTypeError、ActionParamFormatError
413RequestEntityTooLarge
500InternalError
503ServiceUnavailable

示例

以下使用 curl 命令的示例是 UEFI/BMC(备用)的分段式 HTTP 推送更新过程。

  1. 将 HttpPushUriTargetsBusy 更新为 true。

    客户端应首先检查 HttpPushUriTargetsBusy 属性。当此值为 false 时,请将 HttpPushUriTargetsBusy 属性更改为 True,以便声明固件更新占用了此服务。为避免干扰,其他客户端不应更新此服务器上的固件。

    PATCH 正文为:

    {
    "HttpPushUriTargetsBusy" : true
    }

  2. 如果客户端计划更新 BMC(备用),还需要额外提供 HttpPushUriTargets。

    如果不更新 BMC(备用)固件,请跳过此步骤。

    PATCH 正文为:

       "HttpPushUriTargets" : [
    "/redfish/v1/UpdateService/FirmwareInventory/BMC-Backup"
    ]

  3. 将固件映像推送到 MultipartHttpPushUri 属性中的 URL。

    下面是用于 BMC(备用)的分段式 HTTP 推送更新请求的示例 curl 命令。

    curl -s -k -u USERID:PASSW0RD -F 'UpdateParameters={ "Targets":[  ],"@Redfish.OperationApplyTime":"OnStartUpdateRequest"};type=application/json' -F 'UpdateFile=@ lnvgy_fw_xcc_usx319b-0.99_anyos_comp.uxz ;type=application/octet-stream' https://192.168.1.216:443/mfwupdate

    返回以下示例 JSON 响应。

    {
    "@odata.type": "#Task.v1_5_1.Task",
    "@odata.id": "/redfish/v1/TaskService/Tasks/f9c172dc-8d25-41da-8ad1-b59b5e144209",
    "TaskMonitor": "/redfish/v1/TaskService/570dfa36-f60b-4dda-b9db-4435f90c3e20",
    "Messages": [],
    "Description": "This resource represents a task for a Redfish implementation.",
    "StartTime": "2023-01-04T07:48:51+00:00",
    "@odata.etag": "\"1672818531928\"",
    "PercentComplete": 0,
    "HidePayload": true,
    "@odata.context": "/redfish/v1/$metadata#Task.Task",
    "TaskState": "New",
    "Id": "f9c172dc-8d25-41da-8ad1-b59b5e144209",
    "Name": "Task f9c172dc-8d25-41da-8ad1-b59b5e144209"
    }

    在响应正文中将包含新创建的任务资源。在 TaskMonitor 属性中将引用任务监控器资源。

  4. 属性“@ Redfish.OperationApplyTime”支持的值为“Immediate”、“OnReset”和“OnStartUpdateRequest”之一。如果请求属性“@Redfish.OperationApplyTime”为“OnStartUpdateRequest”,则客户端需要执行 StartUpdate 操作以使固件更新流程继续。

    如果“@Redfish.OperationApplyTime”不是 OnStartUpdateRequest,请跳过此步骤。

    POST URL 为:/redfish/v1/UpdateService/Actions/UpdateService.StartUpdate

    POST 正文为:

    {}
  5. 客户端需要定期检查任务的 URI 以更新进度。

    以下是用于持续检查任务资源的示例 JSON 响应。(任务 ID 为 f9c172dc-8d25-41da-8ad1-b59b5e144209)

    任务总体进度为 100%。任务状态为“已完成”。

    {
    "@odata.type": "#Task.v1_5_1.Task",
    "@odata.id": "/redfish/v1/TaskService/Tasks/f9c172dc-8d25-41da-8ad1-b59b5e144209",
    "EndTime": "2023-01-04T07:51:14+00:00",
    "TaskMonitor": "/redfish/v1/TaskService/570dfa36-f60b-4dda-b9db-4435f90c3e20",
    "Messages": [
    {
    "@odata.type": "#Message.v1_1_2.Message",
    "MessageId": "Update.1.0.OperationTransitionedToJob",
    "MessageSeverity": "OK",
    "Resolution": "Follow the referenced job and monitor the job for further updates.",
    "Message": "The update operation has transitioned to the job at URI '/redfish/v1/JobService/Jobs/JobR000004-Update'.",
    "MessageArgs": [
    "/redfish/v1/JobService/Jobs/JobR000004-Update"
    ]
    }
    ],
    "Description": "This resource represents a task for a Redfish implementation.",
    "@odata.etag": "\"1672818674540\"",
    "StartTime": "2023-01-04T07:48:51+00:00",
    "PercentComplete": 100,
    "TaskStatus": "OK",
    "HidePayload": true,
    "@odata.context": "/redfish/v1/$metadata#Task.Task",
    "Name": "Task f9c172dc-8d25-41da-8ad1-b59b5e144209",
    "Id": "f9c172dc-8d25-41da-8ad1-b59b5e144209",
    "TaskState": "Completed"
    }

    在响应正文中将包含新创建的 Job 资源。

  6. 客户端需要检查作业,直至其状态变为“Completed”或“Exception”。根据返回的作业消息处理异常。

    下面是完整的作业响应示例。

    {
    "@odata.type": "#Job.v1_0_7.Job",
    "@odata.id": "/redfish/v1/JobService/Jobs/JobR000004-Update",
    "EndTime": "2023-01-04T07:51:32+00:00",
    "Messages": [
    {
    "@odata.type": "#Message.v1_1_2.Message",
    "MessageId": "Update.1.0.UpdateSuccessful",
    "MessageSeverity": "OK",
    "Resolution": "None.",
    "Message": "Device '/redfish/v1/UpdateService/FirmwareInventory/BMC-Primary' successfully updated with image 'lnvgy_fw_xcc_usx319b-0.99_anyos_comp.uxz'.",
    "MessageArgs": [
    "/redfish/v1/UpdateService/FirmwareInventory/BMC-Primary",
    "lnvgy_fw_xcc_usx319b-0.99_anyos_comp.uxz"
    ]
    }
    ],
    "Description": "This resource is used to represent a job for a Redfish implementation.",
    "StepOrder": [
    "BMC-Primary"
    ],
    "StartTime": "2023-01-04T07:51:14+00:00",
    "Steps": {
    "@odata.id": "/redfish/v1/JobService/Jobs/JobR000004-Update/Steps"
    },
    "@odata.etag": "\"1672818692407\"",
    "PercentComplete": 100,
    "@odata.context": "/redfish/v1/$metadata#Job.Job",
    "JobState": "Completed",
    "Id": "JobR000004-Update",
    "Name": "JobR000004-Update"
    }

  7. 如果目标是 BMC(备用),还需要额外清除 HttpPushUriTargets。

    如果未更新 BMC(备用)固件,请跳过此步骤。

    PATCH 正文为:

    {
    "HttpPushUriTargets" : [ ]
    }

  8. 将 HttpPushUriTargetsBusy 更新为 false。

    固件更新过程完成后,请将 HttpPushUriTargetsBusy 属性更改为 false,以便将服务释放给其他客户端进行固件更新。

    PATCH 正文为:

    {
    "HttpPushUriTargetsBusy" : false
    }