REST API¶
Incus 与其客户端之间所有通信都通过 HTTP 上的 RESTful API 进行。此 API 在 TLS(用于远程操作)或 Unix 套接字(用于本地操作)上封装。
有关如何远程访问 API 的信息,请参见 远程 API 身份验证。
提示
有关 API 如何使用的示例,请运行 Incus 客户端的任何命令(
incus
)并使用--debug
标志。调试信息将显示 API 调用和返回值。为了快速查询 API,Incus 客户端提供了一个
incus query
命令。
API 版本控制¶
可以使用 GET /
检索支持的主要 API 版本列表。
主要 API 版本升级的原因是 API 可能会破坏向后兼容性。
在不破坏向后兼容性的情况下完成的功能添加只会导致 api_extensions
的添加,客户端可以使用它来检查服务器是否支持给定功能。
返回值¶
有三种标准返回类型
标准返回值
后台操作
错误
标准返回值¶
对于标准同步操作,将返回以下 JSON 对象
{
"type": "sync",
"status": "Success",
"status_code": 200,
"metadata": {} // Extra resource/action specific metadata
}
HTTP 代码必须为 200。
后台操作¶
当请求导致后台操作时,HTTP 代码将设置为 202(已接受),并且 Location HTTP 标头将设置为操作 URL。
主体是一个 JSON 对象,其结构如下
{
"type": "async",
"status": "OK",
"status_code": 100,
"operation": "/1.0/instances/<id>", // URL to the background operation
"metadata": {} // Operation metadata (see below)
}
操作元数据结构如下所示
{
"id": "a40f5541-5e98-454f-b3b6-8a51ef5dbd3c", // UUID of the operation
"class": "websocket", // Class of the operation (task, websocket or token)
"created_at": "2015-11-17T22:32:02.226176091-05:00", // When the operation was created
"updated_at": "2015-11-17T22:32:02.226176091-05:00", // Last time the operation was updated
"status": "Running", // String version of the operation's status
"status_code": 103, // Integer version of the operation's status (use this rather than status)
"resources": { // Dictionary of resource types (container, snapshots, images) and affected resources
"instances": [
"/1.0/instances/test"
]
},
"metadata": { // Metadata specific to the operation in question (in this case, exec)
"fds": {
"0": "2a4a97af81529f6608dca31f03a7b7e47acc0b8dc6514496eb25e325f9e4fa6a",
"control": "5b64c661ef313b423b5317ba9cb6410e40b705806c28255f601c0ef603f079a7"
}
},
"may_cancel": false, // Whether the operation can be canceled (DELETE over REST)
"err": "" // The error string should the operation have failed
}
主体主要用作一种人性化的方式,可以在不必拉取目标操作的情况下查看正在发生的事情,主体中的所有信息也可以从后台操作 URL 中检索。
错误¶
在某些情况下,某些事情可能会立即出错,在这种情况下,将使用以下返回值
{
"type": "error",
"error": "Failure",
"error_code": 400,
"metadata": {} // More details about the error
}
HTTP 代码必须是 400、401、403、404、409、412 或 500 之一。
状态代码¶
Incus REST API 通常必须返回状态信息,无论是错误的原因、操作的当前状态还是它导出的各种资源的状态。
为了简化调试,所有这些状态都始终是双倍的。状态有一个数字表示,该表示保证永不改变,API 客户端可以依赖它。然后有一个文本版本,旨在使手动使用 API 的人更容易弄清楚发生了什么。
在大多数情况下,这些将被称为 status 和 status_code
,前者是人性化的字符串表示,后者是固定的数字值。
代码始终为 3 位数,范围如下
100 到 199:资源状态(已启动、已停止、就绪、…)
200 到 399:正向操作结果
400 到 599:负向操作结果
600 到 999:将来使用
当前状态代码列表¶
代码 |
含义 |
---|---|
100 |
操作已创建 |
101 |
已启动 |
102 |
已停止 |
103 |
正在运行 |
104 |
正在取消 |
105 |
挂起 |
106 |
正在启动 |
107 |
正在停止 |
108 |
正在中止 |
109 |
正在冻结 |
110 |
已冻结 |
111 |
已解冻 |
112 |
错误 |
113 |
就绪 |
200 |
成功 |
400 |
失败 |
401 |
已取消 |
递归¶
为了优化大型列表的查询,递归已针对集合实现。可以将 recursion
参数传递给针对集合的 GET 查询。
默认值为 0,这意味着将返回集合成员 URL。将其设置为 1 将使这些 URL 被它们指向的对象(通常是另一个 JSON 对象)替换。
递归是通过简单地将指向作业(URL)的任何指针替换为对象本身来实现的。
过滤¶
为了根据特定值过滤结果,已针对集合实现过滤。可以将 filter
参数传递给针对集合的 GET 查询。
实例、镜像和存储卷端点可以使用过滤。
过滤器没有默认值,这意味着将返回找到的所有结果。以下是用作过滤器参数的语言
?filter=field_name eq desired_field_assignment
该语言遵循 OData 约定,用于构建 REST API 过滤逻辑。 过滤还支持逻辑运算符:非(not
)、等于(eq
)、不等于(ne
)、和(and
)、或(or
)。 过滤器以左结合性进行计算。 包含空格的值可以用引号括起来。 也支持嵌套过滤。 例如,要根据配置中的字段进行过滤,您需要传递
?filter=config.field_name eq desired_field_assignment
要根据设备属性进行过滤,您需要传递
?filter=devices.device_name.field_name eq desired_field_assignment
以下是一些上述不同过滤方法的 GET 查询示例
containers?filter=name eq "my container" and status eq Running
containers?filter=config.image.os eq ubuntu or devices.eth0.nictype eq bridged
images?filter=Properties.os eq Centos and not UpdateSource.Protocol eq simplestreams
异步操作¶
任何可能需要超过一秒才能完成的操作都必须在后台执行,并将后台操作 ID 返回给客户端。
然后,客户端可以轮询状态更新或使用长轮询 API 等待通知。
通知¶
基于 WebSockets 的 API 可用于通知,存在不同的通知类型以限制发送到客户端的流量。
建议客户端在触发远程操作之前始终订阅操作通知类型,这样它就不必轮询其状态。
PUT 与 PATCH¶
Incus API 支持 PUT 和 PATCH 来修改现有对象。
PUT 用新定义替换整个对象,通常在通过 GET 获取当前对象状态后调用。
为了避免竞争条件,应从 GET 响应中读取 ETag 标头并将其作为 If-Match 发送给 PUT 请求。 如果对象在 GET 和 PUT 之间被修改,这将导致 Incus 失败该请求。
PATCH 可用于通过仅指定要更改的属性来修改对象内的单个字段。 要取消设置键,将其设置为为空通常就可以了,但在某些情况下,PATCH 无法正常工作,需要使用 PUT 代替。
API 结构¶
Incus 具有一个自动生成的 Swagger 规范,用于描述其 API 端点。 此 API 规范的 YAML 版本可以在 rest-api.yaml
中找到。 请参阅 REST API,以获取其便捷的 Web 渲染版本。