本作品采用知识共享署名 3.0 非移植许可协议授权。 http://creativecommons.org/licenses/by/3.0/legalcode
二级区域¶
概述 Designate 中二级区域概念的支持。
术语¶
术语 |
含义 |
|---|---|
axfr |
完整区域更新 (AXFR) |
zone |
二级区域 - 从给定的主服务器传输其状态/数据的区域 |
问题描述¶
我们希望支持二级区域,以便为更高层级的功能(如传入 (A|I)XFR、联合等)奠定基础(这些将是单独的规范)。
提议的变更¶
我们在 Designate 中引入一个新的二级区域概念,该区域具有外部主服务器。这意味着 Designate 将充当从服务器。
在 MiniDNS 中,我们添加了对入站 AXFR 和 NOTIFY 的支持。
在池中,二级区域将与主区域一样放置。
API 变更¶
记录集 API 端点应禁止任何创建、更新、删除操作。
状态字段与主区域相同。
新的区域参数¶
参数 |
类型 |
必需 |
默认值 |
描述 |
|---|---|---|---|---|
type |
ENUM(PRIMARY, SECONDARY) |
否 |
false |
主区域或二级区域 |
masters |
列表 |
否 |
无 |
区域主服务器 |
transferred_at |
日期时间 |
无 |
上次成功传输时间 |
创建二级区域¶
在创建新区域时,managed_resource_email 用作初始 email。
version 字段将为 1,因为它尚未传输,并且 transferred_at 为 null。
POST /v2/zones HTTP/1.1
Host: 127.0.0.1:9001
Accept: application/json
Content-Type: application/json
{
"zone": {
"name": "example.org.",
"description": "This is an example zone.",
"masters": ["10.0.0.1", "10.0.0.2:5354"],
"type": "SECONDARY",
}
}
HTTP/1.1 201 Created
Content-Type: application/json
{
"zone": {
"id": "a86dba58-0043-4cc6-a1bb-69d5e86f3ca3",
"pool_id": "572ba08c-d929-4c70-8e42-03824bb24ca2",
"project_id": "4335d1f0-f793-11e2-b778-0800200c9a66",
"name": "example.org.",
"email": "managed@foo.co",
"serial": 1404757531,
"status": "ACTIVE",
"description": "This is an example zone.",
"masters": ["10.0.0.1", "10.0.0.2:5354"],
"type": "SECONDARY",
"transferred_at": null,
"version": 1,
"created_at": "2014-07-07T18:25:31.275934",
"updated_at": null,
"links": {
"self": "https://127.0.0.1:9001/v2/zones/a86dba58-0043-4cc6-a1bb-69d5e86f3ca3"
}
}
}
获取二级区域¶
检索具有指定 ID 的二级区域。
对未传输区域进行 GET 操作的示例
GET /v2/zones/a86dba58-0043-4cc6-a1bb-69d5e86f3ca3 HTTP/1.1
Host: 127.0.0.1:9001
Accept: application/json
Content-Type: application/json
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
{
"zone": {
"id": "a86dba58-0043-4cc6-a1bb-69d5e86f3ca3",
"pool_id": "572ba08c-d929-4c70-8e42-03824bb24ca2",
"project_id": "4335d1f0-f793-11e2-b778-0800200c9a66",
"name": "example.org.",
"email": "managed@foo.co",
"serial": 1404757531,
"status": "ACTIVE",
"description": "This is an example zone.",
"masters": ["10.0.0.1", "10.0.0.2:5354"],
"type": "SECONDARY",
"transferred_at": null,
"version": 1,
"created_at": "2014-07-07T18:25:31.275934",
"updated_at": null,
"links": {
"self": "https://127.0.0.1:9001/v2/zones/a86dba58-0043-4cc6-a1bb-69d5e86f3ca3"
}
}
}
列出二级区域¶
要按区域类型过滤,请将 type=<PRIMARY|SECONDARY> 作为查询参数。
下面是尚未传输的区域和已传输区域的示例。
GET /v2/zones?type=SECONDARY HTTP/1.1
Host: 127.0.0.1:9001
Accept: application/json
Content-Type: application/json
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
{
"zones": [{
"id": "a86dba58-0043-4cc6-a1bb-69d5e86f3ca3",
"pool_id": "572ba08c-d929-4c70-8e42-03824bb24ca2",
"project_id": "4335d1f0-f793-11e2-b778-0800200c9a66",
"name": "example.org.",
"email": "managed@foo.co",
"serial": 2014120100,
"status": "ACTIVE",
"description": "This is an example zone.",
"masters": ["10.0.0.1", "10.0.0.2:5354"],
"type": "SECONDARY",
"transferred_at": "2014-07-07T18:25:31.275934",
"version": 2,
"created_at": "2014-07-07T18:25:31.275934",
"updated_at": "2014-07-07T18:25:31.275934",
"links": {
"self": "https://127.0.0.1:9001/v2/zones/a86dba58-0043-4cc6-a1bb-69d5e86f3ca3"
}
}, {
"id": "fdd7b0dc-52a3-491e-829f-41d18e1d3ada",
"pool_id": "572ba08c-d929-4c70-8e42-03824bb24ca2",
"project_id": "4335d1f0-f793-11e2-b778-0800200c9a66",
"name": "example.net.",
"email": "managed@foo.co",
"serial": 1404756682,
"status": "ACTIVE",
"description": "This is another example zone.",
"masters": ["10.0.0.1", "10.0.0.2:5354"],
"type": "SECONDARY",
"transferred_at": null,
"version": 1,
"created_at": "2014-07-07T18:22:08.287743",
"updated_at": null,
"links": {
"self": "https://127.0.0.1:9001/v2/zones/fdd7b0dc-52a3-491e-829f-41d18e1d3ada"
}
}],
"links": {
"self": "https://127.0.0.1:9001/v2/zones"
}
}
更新二级区域¶
更改现有区域的指定属性。
在下面的示例中,我们将其中一个主服务器更新为 10.0.0.3。
注意:对于二级区域,仅以下字段可编辑。
参数 |
描述 |
|---|---|
description |
区域描述 |
masters |
主服务器 |
PATCH /v2/zones/a86dba58-0043-4cc6-a1bb-69d5e86f3ca3 HTTP/1.1
Host: 127.0.0.1:9001
Accept: application/json
Content-Type: application/json
{
"zone": {
"masters": ["10.0.0.1", 10.0.0.3:1053"]
}
}
HTTP/1.1 200 OK
Content-Type: application/json
{
"zone": {
"id": "a86dba58-0043-4cc6-a1bb-69d5e86f3ca3",
"pool_id": "572ba08c-d929-4c70-8e42-03824bb24ca2",
"project_id": "4335d1f0-f793-11e2-b778-0800200c9a66",
"name": "example.org.",
"serial": 0,
"status": "ACTIVE",
"description": "This is an example zone.",
"masters": ["10.0.0.1", "10.0.0.3:1053"],
"type": "SECONDARY",
"transferred_at": "2014-07-07T18:25:31.275934",
"version": 1,
"created_at": "2014-07-07T18:25:31.275934",
"updated_at": null,
"links": {
"self": "https://127.0.0.1:9001/v2/zones/a86dba58-0043-4cc6-a1bb-69d5e86f3ca3"
}
}
}
删除二级区域¶
DELETE /v2/zones/a86dba58-0043-4cc6-a1bb-69d5e86f3ca3 HTTP/1.1
Host: 127.0.0.1:9001
HTTP/1.1 204 No Content
Central 变更¶
禁止更改区域从 PRIMARY <> SECONDARY。
添加一个定期任务,循环遍历二级区域,查看它们的 transferred_at 并调用 MDNS 以触发新的 AXFR,以保持区域更新。
Storage 变更¶
修改表 - domains¶
列 |
类型 |
可为空? |
唯一? |
注意事项 |
操作 |
|---|---|---|---|---|---|
type |
ENUM(PRIMARY, SECONDARY) |
否 |
否 |
区域类型 |
添加 |
transferred_at |
DATETIME |
是(未传输) |
否 |
上次传输时间 |
添加 |
新表 - domain_attributes¶
一个新表,用于存储不需要位于 domains 表上的任何元数据/属性。
domain_id、key、value 上的索引。
列 |
类型 |
可为空? |
唯一? |
注意事项 |
操作 |
|---|---|---|---|---|---|
id |
UUID |
no |
是 |
此属性的 ID |
添加 |
domain_id |
指向 Domain UUID 的外键 |
no |
否 |
此属性所属的 Domain ID |
添加 |
键 |
ENUM(masters) |
no |
否 |
区域类型 |
添加 |
value |
VARCHAR |
no |
否 |
区域的主服务器 |
添加 |
MiniDNS 变更¶
区域创建¶
当前,当创建区域时,会向 mdns 发送通知,我们将在其中插入并执行 AXFR(如果 zone.type 是 SECONDARY)。
NOTIFY¶
我们需要更改 __call__ 以将 NOTIFY 传递给 self._handle_notify()。
接收 NOTIFY
查询 NOTIFY 的 SOURCE 以获取 SOA
比较响应序列号与本地序列号,如果不匹配,则继续下一步。
向发送 NOTIFY 的服务器执行 AXFR。
调用 dnsutils.from_dnspython 以获取 Designate 版本的 Domain。
使用来自 #5 的数据调用 Central 方法以更新域。
新 - RequestHandler._handle_notify(context, request)¶
处理通知并最终转交给执行 AXFR。
参数 |
描述 |
必需 |
|---|---|---|
context |
安全上下文信息。 |
是 |
请求 |
DNS 请求 |
是 |
新 - Service.zone_sync(context, zone, master_addr=None)¶
MDNS 中任何需要执行 AXFR 的方法使用的函数。
参数 |
描述 |
必需 |
|---|---|---|
context |
安全上下文信息。 |
是 |
zone |
一个 objects.Domain 对象 |
是 |
master_addr |
用于 AXFR 的地址 |
否 |
未来工作¶
以下内容不在本次范围内。
未来应添加一个 /zones/<id>/tasks 或类似的任务,以允许通过 API 进行“强制”AXFR。
一个任务,用于从 SECONDARY 切换到 PRIMARY。
实现¶
负责人¶
里程碑¶
- 完成目标里程碑
Kilo-1
工作项¶
在存储中添加新列
扩展 Zones API 以允许二级区域的 CRUD
扩展 Central 逻辑以检查它是主区域/二级区域。