Designate/蓝图/搜索 API
目录
概述
目前,此规范是一个非常粗略的草案。它主要来自 过滤 API 的内容,这些内容被移到此处,因为它们不属于过滤 API。
| Gerrit补丁 | [] |
|---|---|
| Launchpad蓝图 | [] |
总结
变更的快速概述
API 变更
与过滤一样,搜索将作为 URL 选项实现。对于
此外,在适用情况下,特权用户(支持和管理员)可以通过在他们的 GET 请求中指定附加参数 all_tenants=true 来执行跨所有租户的搜索。
按地址搜索是一个特殊情况,已经进行了大量的讨论。这主要是因为租户可能希望在其所有记录上搜索地址(这些记录可能分布在多个区域集中,在多个区域中),或者在单个区域集中搜索。此外,管理员需要能够搜索所有租户的记录中的地址。已经提出了几种解决方案,下面讨论了一种暂定的方法
- 为管理员专用创建一个 /records 端点,以搜索所有租户中的地址。使用原始的 /zones/{id}/recordsets 端点来搜索单个租户中的地址,在单个区域内。但是,让租户搜索其所有区域中的地址尚不清楚。也许 /records 端点可以用于此目的,并使用 all_tenants 选项来区分在单个租户和所有租户中搜索?
为了说明,下面是一个表格,显示以上述不同方式构造的 IP 地址 ADDR 的搜索。所有这些请求都是 GET 请求。
| 一个记录集(过滤) | 整个租户(搜索) | 所有租户(搜索) |
|---|---|---|
| /zones/{zone-id}/recordsets/{recordset-id}/records?address=ADDR | /records?address=ADDR | /records?address=ADDR&all_tenants=true |
HTTP API 的变更列表
| 动词 | 资源 | 描述 |
|---|---|---|
| GET | /zones?name=example.com&match-type=exact&all_tenants=true | 返回名称与指定过滤器(“name”)完全匹配的区域,跨所有租户。注意:只有管理员和支持人员才能跨所有租户搜索。 |
| GET | /zones/{zone-id}/recordsets?address=10.1.2.3&match-type=exact | 从为此租户指定的区域返回与指定 IP 地址完全匹配的地址记录集。 |
| GET | /zones/ipaddresses?address=172.192.112.82&match-type=exact&all_tenants=true | 从属于所有租户的所有区域返回与指定 IP 地址完全匹配的地址记录集。 |
| GET | /zones/ipaddresses?address=172.192.112.82&match-type=exact | 从属于此租户的所有区域返回与指定 IP 地址完全匹配的地址记录集。 |
| GET, PUT, PATH, POST, DELETE |
/zones/ipaddresses | 无操作。 |
| PUT, PATH, POST, DELETE | /zones/ipaddresses?address=172.192.112.82 | 无操作。 这些应该通过 /zone/{zone-id}/recordsets/ 来完成 |
调用示例 (HTTP 方法)
请求
GET /v2/zones?name=example.com&match-type=exact&all_tenants=true HTTP/1.1 Host: dns.provider.com Accept: application/json X-Auth-Token: KeyStoneAuth_***** X-Tenant-ID:
响应
{
"zone": {
"id": "a86dba58-0043-4cc6-a1bb-69d5e86f3ca3",
"pool_id": "7d62d10d-3a16-4828-85dd-7b3fdc0ba989",
"project_id": "4335d1f0-f793-11e2-b778-0800200c9a66",
"name": "example.com.",
"email": "joe@example.com.",
"ttl": 7200,
"serial": 1351800588,
"status": "ACTIVE",
"version": 1,
"created_at": "...",
"updated_at": null,
"links": {
"self": "https://dns.provider.com/v2/zones/a86dba58-0043-4cc6-a1bb-69d5e86f3ca3"
}
}
}
特权用户在一个租户中搜索
请求:
GET /v2/zones?name=example.com&match-type=exact HTTP/1.1 Host: dns.provider.com Accept: application/json X-Auth-Token: KeyStoneAuth_***** X-Tenant-ID: 12345
响应
(空 - 此租户没有域 example.com)
{
"zone": {
}
}
客户跨所有租户搜索
当 API 中的策略检查显示租户 1234 没有特权跨所有租户搜索时,抛出异常
客户在一个租户中搜索
请求
GET /v2/zones?name=exp.com&match-type=exact HTTP/1.1 Host: dns.provider.com Accept: application/json X-Auth-Token: KeyStoneAuth_***** X-Tenant-ID: 12345
响应
{
"zone": {
"id": "a66dba58-0043-4cc6-a1bb-69d5e86f3ca3",
"pool_id": "6d62d10d-3a16-4828-85dd-7b3fdc0ba989",
"project_id": "5335d1f0-f793-11e2-b778-0800200c9a66",
"name": "exp.com.",
"email": "jane@exp.com.",
"ttl": 7200,
"serial": 1351800588,
"status": "ACTIVE",
"version": 1,
"created_at": "...",
"updated_at": null,
"links": {
"self": "https://dns.provider.com/v2/zones/c86dba58-0043-4cc6-a1bb-69d5e86f3cc1"
}
}
}
特权用户搜索指向特定 IP 地址的记录,跨所有租户
请求
GET /v2/zones/ipaddresses?address=172.192.112.82&match-type=exact&all_tenants=true HTTP/1.1 Host: dns.provider.com Accept: application/json X-Auth-Token: KeyStoneAuth_***** X-Tenant-ID:
响应
{
"records": [
{
"type": "A",
"address": "172.192.112.82",
“id”: “9e27811d-0320-4179-abb7-0e00e371e25b”,
"zone_id": "a86dba58-0043-4cc6-a1bb-69d5e86f3ca3",
“name”: "www.example.org.",
"links": {
"self": "https://dns.provider.com/v2/zones/986dba58-0043-4cc6-a1bb-69d5e86f3ca9/recordsets/dedf6879-fd9a-41d6-a7c2-eeac316fa7b3"
}
},
{
"type": "A",
"address": "172.192.112.82",
“id”: “4e27811d-0320-4179-abb7-0e00e371e25c”,
"zone_id": "b46dba58-0043-4cc6-a1bb-69d5e86f3cc1",
“name”: "exp.com.",
"links": {
"self": "https://dns.provider.com/v2/zones/436dba58-0043-4cc6-a1bb-69d5e86f3ca9/recordsets/dedf6879-fd9a-41d6-a7c2-eeac316fa7d2"
}
}
] }
特权用户搜索指向特定 IP 地址的记录,在给定租户中
请求
GET /v2/zones/ipaddresses?address=172.192.112.82&match-type=exact HTTP/1.1 Host: dns.provider.com Accept: application/json X-Auth-Token: KeyStoneAuth_***** X-Tenant-ID: 31476
响应
{
"records": [
{
"type": "A",
"address": "172.192.112.82",
“id”: “4e27811d-0320-4179-abb7-0e00e371e25c”,
"zone_id": "b46dba58-0043-4cc6-a1bb-69d5e86f3cc1",
“name”: "exp.com.",
"links": {
"self": https://dns.provider.com/v2/zones/436dba58-0043-4cc6-a1bb-69d5e86f3ca9/recordsets/dedf6879-fd9a-41d6-a7c2-eeac316fa7d2
}
}
] }
客户搜索指向特定 IP 地址的记录,跨所有租户
异常 - 没有客户可以跨所有租户搜索
客户搜索指向特定 IP 地址的记录,在其自身空间内
请求
GET /v2/zones/ipaddresses?address=172.192.112.82&match-type=exact HTTP/1.1 Host: dns.provider.com Accept: application/json X-Auth-Token: KeyStoneAuth_***** X-Tenant-ID: 44441
响应
{
"records": [
{
"type": "A",
"address": "172.192.112.82",
“id”: “9e27811d-0320-4179-abb7-0e00e371e25b”,
"zone_id": "a86dba58-0043-4cc6-a1bb-69d5e86f3ca3",
“name”: "www.example.org.",
"links": {
"self": "https://dns.provider.com/v2/zones/986dba58-0043-4cc6-a1bb-69d5e86f3ca9/recordsets/dedf6879-fd9a-41d6-a7c2-eeac316fa7b3"
}
}
] }
其他内容
all_tenants 的验证步骤:2. 在 middleware.py:KeystoneMiddleware::process_request() 中,在构建 DesignateContext 期间
- 确定 all_tenants 设置为 True,表示打算对所有租户执行此操作
- 执行策略检查(在 API 中,在传递到 Central 之前)
- 如果确认用户具有跨所有租户执行此操作的权利,
- 设置 context.all_tenants=True
- 让请求继续传递到 Central
- 如果无法确认用户具有跨所有租户执行操作的权利,则拒绝请求并显示适当的消息
- 如果确认用户具有跨所有租户执行此操作的权利,
- 执行策略检查(在 API 中,在传递到 Central 之前)
- 确定 all_tenants 设置为 True,表示打算对所有租户执行此操作
数据库更改
数据库模式变更的描述
例如 -
| 姓名 | 数据类型 | 长度 | 可为空 | 详情 |
|---|---|---|---|---|
| id | VARCHAR | 36 | 假 | 主键,生成的UUID |
| name | VARCHAR | 255 | 假 | 要列入黑名单的域名 |
| version | INTEGER | - | 假 | Designate API 版本 |
| created_at | DATETIME | - | 假 | 创建的 UTC 时间 |
| updated_at | DATETIME | - | 真 | 创建的 UTC 时间 |
| description | VARCHAR | 160 | 真 | UTF-8 文本字段 |