本作品采用知识共享署名 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_atnull

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()。

  1. 接收 NOTIFY

  2. 查询 NOTIFY 的 SOURCE 以获取 SOA

  3. 比较响应序列号与本地序列号,如果不匹配,则继续下一步。

  4. 向发送 NOTIFY 的服务器执行 AXFR。

  5. 调用 dnsutils.from_dnspython 以获取 Designate 版本的 Domain。

  6. 使用来自 #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。

实现

负责人

主要负责人

<https://launchpad.net/~endre-karlson>

里程碑

完成目标里程碑

Kilo-1

工作项

  • 在存储中添加新列

  • 扩展 Zones API 以允许二级区域的 CRUD

  • 扩展 Central 逻辑以检查它是主区域/二级区域。

依赖项