Image API v2 HTTP PATCH media types¶
概述¶
HTTP PATCH 请求必须提供一种媒体类型,以便服务器确定如何将补丁应用于镜像资源。不支持的媒体类型将导致 HTTP 错误响应,状态码为 415。对于镜像资源,支持两种媒体类型
application/openstack-images-v2.1-json-patchapplication/openstack-images-v2.0-json-patch
`application/openstack-images-v2.1-json-patch` 媒体类型旨在提供 JavaScript Object Notation (JSON) Patch RFC6902 中定义的功能的一个有用且兼容的子集,该标准定义了 `application/json-patch+json` 媒体类型。
`application/openstack-images-v2.0-json-patch` 媒体类型基于该标准的 draft 4。 其使用已被弃用。
受限的 JSON 指针¶
本附录中定义的 ‘application/openstack-images-v2.1-json-patch’ 媒体类型采用 JSON-Pointers 的受限形式。 受限的 JSON 指针是一个 Unicode 字符串,包含一个恰好包含一个引用标记的序列,该标记以前缀 ‘/’ (%x2F) 字符开头。
如果引用标记包含 ‘~’ (%x7E) 或 ‘/’ (%x2F) 字符,则必须将其编码为 ‘~0’ 和 ‘~1’ 分别。
其 ABNF 语法是
restricted-json-pointer = "/" reference-token
reference-token = *( unescaped / escaped )
unescaped = %x00-2E / %x30-7D / %x7F-10FFFF
escaped = "~" ( "0" / "1" )
受限的 JSON 指针按照 JSON-Pointer 的方式评估为普通的 JSON 指针。
例如,给定 `image` 实体
{
"id": "da3b75d9-3f4a-40e7-8a2c-bfab23927dea",
"name": "cirros-0.3.0-x86_64-uec-ramdisk",
"status": "active",
"visibility": "public",
"size": 2254249,
"checksum": "2cec138d7dae2aa59038ef8c9aec2390",
"~/.ssh/": "present",
"tags": ["ping", "pong"],
"created_at": "2012-08-10T19:23:50Z",
"updated_at": "2012-08-10T19:23:50Z",
"self": "/v2/images/da3b75d9-3f4a-40e7-8a2c-bfab23927dea",
"file": "/v2/images/da3b75d9-3f4a-40e7-8a2c-bfab23927dea/file",
"schema": "/v2/schemas/image"
}
以下受限的 JSON 指针评估为相应的数值
"/name" "cirros-0.3.0-x86_64-uec-ramdisk"
"/size" 2254249
"/tags" ["ping", "pong"]
"/~0~1.ssh~1" "present"
操作¶
application/openstack-images-v2.1-json-patch 媒体类型支持 application/json-patch+json 媒体类型中定义的操作的一个子集。在请求对象的 “op” 成员中指定操作。
支持的操作包括 add、remove 和 replace。
如果操作对象不包含任何已识别的操作成员,则会发生错误。
在操作对象的 “path” 成员中指定要在目标镜像中执行请求操作的位置。
成员值是一个字符串,包含一个受限的 JSON 指针值,该值引用目标镜像中要执行操作的位置。
在适当的情况下(即,对于 “add” 和 “replace” 操作),操作对象必须包含 “value” 数据成员。
成员值是以 JSON 符号表示的实际值,用于添加(或用于替换操作)。(例如,字符串必须用引号括起来,数值值不带引号。)
PATCH 请求的有效负载必须是 JSON 对象的列表。每个对象必须符合以下格式之一。
添加
add 操作在目标镜像的指定位置添加一个新值。该位置必须引用要添加到现有镜像的镜像属性。
操作对象指定一个 “value” 成员和关联值。
示例
PATCH /images/{image_id}
[
{
"op":"add",
"path":"/login-name",
"value":"kvothe"
}
]
您还可以使用 add 操作将位置添加到与指定镜像 ID 关联的位置集合中,如下所示
示例
PATCH /images/{image_id}
[
{
"op":"add",
"path":"/locations/1",
"value":"scheme4://path4"
}
]
remove
remove 操作删除目标镜像中指定的镜像属性。如果镜像属性在指定位置不存在,则会发生错误。
示例
PATCH /images/{image_id}
[
{
"op":"remove",
"path":"/login-name"
}
]
您还可以使用 remove 操作从与指定镜像 ID 关联的位置集合中删除位置,如下所示
示例
PATCH /images/{image_id}
[
{
"op":"remove",
"path":"/locations/2"
}
]
replace
replace 操作将目标镜像中指定镜像属性的值替换为新值。操作对象包含一个 “value” 成员,该成员指定替换值。
示例
[
{
"op":"replace",
"path":"/login-name",
"value":"kote"
}
]
此操作在功能上与对镜像属性执行 “remove” 操作完全相同,紧接着在相同位置执行 “add” 操作,并使用替换值。
如果目标镜像中指定的镜像属性不存在,则会发生错误。
您还可以使用 replace 操作替换与指定镜像 ID 关联的位置集合中的位置,如下所示
示例
PATCH /images/{image_id}
[
{
"op":"replace",
"path":"/locations",
"value":[
"scheme5://path5",
"scheme6://path6"
]
}
]