Designate/蓝图/记录集
本提案是 designate v2 的更新记录集。
提案 1
我们将只有记录,没有记录集,无论是显式的(如 designate v2 当前的情况)还是隐式的(如 designate v1 当前的情况)。TTL 的检查在创建/更新时完成。
创建记录
/zones/<zone_id>/records
示例请求:POST /zones/89acac79-38e7-497d-807c-a011e1310438/records
Host: example.com Accept: application/json Content-Type: application/json
{
"name": "www.example.com.",
"type": "A",
"data": "192.0.2.3"
"TTL": 200
}
当创建记录时,它将根据 domain_id、name 和 type 获取记录。如果不存在,则创建它。如果存在一个或多个,则所有 TTL 应该相同。如果不是,则返回错误。错误详细信息将包括当前记录或当前记录的 TTL。
当没有记录已经存在,并且如果 2 个用户同时尝试创建具有相同类型和名称的记录时,第一个记录将被按原样添加。第二个记录被检查 TTL,如果不同,则返回错误。错误详细信息将包括当前记录或当前记录的 TTL。
修改记录
/zones/<zone_id>/records/<record_id>
示例请求:PATCH /zones/89acac79-38e7-497d-807c-a011e1310438/records/2e32e609-3a4f-45ba-bdef-e50eacd345ad
Host: example.com Accept: application/json Content-Type: application/json
{
"name": "www.example.com.",
"type": "A",
"data": "192.0.2.5"
"TTL":500
}
当修改记录时 - TTL 值将与基于 domain_id、新名称和类型的现有记录进行检查。如果 TTL 不相同,则返回错误。错误详细信息将包括当前记录或当前记录的 TTL。
为了修改具有相同名称和类型的记录的所有 TTL,我们可以在 json body 中有一个新的字段,称为“modify-rrset”。如果设置为 TRUE,则修改与旧名称和旧类型匹配的所有记录。或者,我们可以有一个参数,例如 ?modify-rrset。如果设置为 TRUE,则修改与旧名称和旧类型匹配的所有记录。
如果我们有 2 个 A 记录
2e32e609-3a4f-45ba-bdef-e50eacd345ad www.example.com A 192.0.2.5 200seconds 3e32e609-3a4f-45ba-bdef-e50eacd345ae www.example.com A 192.0.2.6 200seconds
要修改这些记录的 TTL,我们将向以下记录之一发送以下请求
示例请求:PATCH /zones/89acac79-38e7-497d-807c-a011e1310438/records/2e32e609-3a4f-45ba-bdef-e50eacd345ad?modify-rrset=true
Host: example.com Accept: application/json Content-Type: application/json
{
"ttl": 500
}
或者,请求可以是如下所示
示例请求:PATCH /zones/89acac79-38e7-497d-807c-a011e1310438/records/2e32e609-3a4f-45ba-bdef-e50eacd345ad
Host: example.com Accept: application/json Content-Type: application/json
{
"ttl": 500,
"modify-rrset": true
}
在此请求处理后,2 个 A 记录将如下所示
2e32e609-3a4f-45ba-bdef-e50eacd345ad www.example.com A 192.0.2.5 500seconds 3e32e609-3a4f-45ba-bdef-e50eacd345ae www.example.com A 192.0.2.6 500seconds
提案 2
提案 - 隐式处理 TTL
本提案将完全隐藏记录集的概念,并隐式处理记录集中不同的 TTL。不要做任何特殊的事情,像 BIND 那样处理记录集中具有不同 TTL 的记录。BIND 将使用最低记录的 TTL 发送记录集。因此,需要更改的是让 mini-DNS 以这种方式处理它。
例如,BIND 中的主服务器在其区域中具有以下条目
ttltest1 600 A 192.168.0.250 ttltest1 1200 A 192.168.0.251
辅助从服务器将显示
$TTL 600 ; 10 minutes
ttltest1 A 192.168.0.250
A 192.168.0.251
我们需要为用户记录这种行为,但不需要额外的 API 更改。
提案 3
记录/记录集重新设计方案 2
本提案是更改 designate v2 中创建记录集和记录的方式。它不是完整的规范。它仅用于演示概念。
将只有一个资源名称,即记录或记录集。我们可以决定保留哪个。因此,您看到的所有“records”都可以更改为“recordsets”,如果这样不那么令人困惑的话。
创建记录
/zones/<zone_id>/records
{
"name": "example.com.",
"type": "A",
"data": "192.0.2.3"
}
创建记录时,它将检查是否具有相同名称和类型的记录存在。如果不存在,则正常创建新记录。如果找到匹配项,则将记录的数据添加到关联的数据表中。(有关更多信息,请参见下面的表描述)。
返回显示如下
{
"name": "example.com",
"type": "A:,
"ttl": 3600,
"data": {
"0.0.0.1"
"0.0.0.2"
},
"created_at": datestamp,
"updated_at": null
}
修改记录
需要一个 PUT 和一个 PATCH。
/zones/<zone_id>/records/<record_id>
示例请求
PATCH /zones/89acac79-38e7-497d-807c-a011e1310438/records/2e32e609-3a4f-45ba-bdef-e50eacd345ad Host: example.com Accept: application/json Content-Type: application/json
{
"data": "192.0.2.5"
}
这将添加新的 IP 地址到现有的地址。
示例请求:PUT /zones/89acac79-38e7-497d-807c-a011e1310438/records/2e32e609-3a4f-45ba-bdef-e50eacd345ad
Host: example.com Accept: application/json Content-Type: application/json
{
"data": "192.0.2.5",
"data": "192.0.2.6"
}
这将用新的数据替换所有现有数据。
删除记录
将删除整个记录,包括所有数据。
提案 4
保留记录集,放弃记录
创建记录集
POST /zones/<zone_id>/recordsets
请求
{
"name": "example.com.",
"type": "A",
"records": [
"192.0.2.1",
"192.0.2.2"
]
}
响应
{
"name": "example.com.",
"type": "A",
"records": [
"192.0.2.1",
"192.0.2.2"
],
....,
"created_at": datestamp,
"updated_at": null
}
修改记录集 / 添加记录
PATCH /zones/<zone_id>/recordsets/<recordset_id>
预先存在的 RRSet 有 "192.0.2.1", "192.0.2.2"
请求(标准)
{
"records": [
"192.0.2.1",
"192.0.2.2",
"192.0.2.3"
]
}
请求(JSON Patch / RFC6902)
{
"op": "add", "path": "/records", "value": "192.0.2.3"
}
响应
{
"name": "example.com.",
"type": "A",
"records": [
"192.0.2.1",
"192.0.2.2",
"192.0.2.3"
],
....,
"created_at": datestamp,
"updated_at": datestamp
}
删除记录
PATCH /zones/<zone_id>/recordsets/<recordset_id>
预先存在的 RRSet 有 "192.0.2.1", "192.0.2.2", "192.0.2.3"
请求(标准)
{
"records": [
"192.0.2.1",
"192.0.2.2"
]
}
请求(JSON Patch / RFC6902)
{
"op": "remove", "path": "/records", "value": "192.0.2.3"
}
响应
{
"name": "example.com.",
"type": "A",
"records": [
"192.0.2.1",
"192.0.2.2"
],
....,
"created_at": datestamp,
"updated_at": datestamp
}
删除记录集
DELETE /zones/<zone_id>/recordsets/<recordset_id>
请求
EMPTY
响应
EMPTY