Designate/Blueprints/Recordset Record API Redesign
目录
概述
| Gerrit补丁 | [] |
|---|---|
| Launchpad蓝图 | [1] |
此蓝图建议移除 Records 资源,仅保留 RecordSets 资源。
Recordsets 和 records 的 API 过于复杂。目前,用户必须先创建一个 recordset 才能创建 record。这导致了令人困惑的用户体验。用户将创建、获取、更新和删除 recordsets。当用户创建 recordset 时,代码将确定它是否应该是一个新的 recordset。如果所有数据都相同,除了 record 之外,将返回一个重复错误,然后用户将通过修改 Recordset 来添加 Record。Record 将不再作为单独的资源可访问,仅作为 recordset 的一部分。
目前,CNAME 和 DNAME 记录类型在技术上不能成为 Recordset,因为它们不能包含多个 record;但是,为了保持一致性,我们将把它们视为 Recordset。
最初,将只提供 PUT 调用,而没有 PATCH 调用。PUT 将替换 Recordset 中的所有数据,因此如果用户想向 Recordset 添加 record,则必须在 PUT 请求中提交整个 record 列表。计划通过另一个蓝图添加 json patch RFC6902。这将使添加、删除和修改 Recordset 中的 record 更加容易。
资源记录集的概念在 RFC 2181, Section 5 中定义。 总结一下,它说,每个 DNS 资源记录 (RR) 都有四个部分:标签、类、类型和数据。 任何具有所有四个相等值的记录都应作为重复记录被拒绝。 但是,大多数记录类型都可以存在于具有相同的标签、类和类型,但具有不同的数据。 这样的记录组被定义为资源记录集 (RRSet)。 查询特定的标签、类和类型,应始终返回关联 RRSet 中的所有记录。 它进一步指出,RRSet 中的所有 RR 应该具有相同的 ttl。
API 资源
当前 API
/zones/{zone id}/recordsets/{recordset id}/records/{record id}
新的 API
/zones/{zone id}/recordsets/{recordset id}
API 细节:创建 / 列出 / 修改 / 删除 Recordset
| 动词 | 资源 | 描述 |
|---|---|---|
| GET | /zones/{zone id}/recordsets | 返回区域的所有 recordsets |
| GET | /zones/{zone id}/recordsets/{recordset id} | 返回区域的特定 recordset |
| POST | /zones/{zone id}/recordsets | 创建一个新的 recordset 或向现有的 recordset 添加一个新的 record |
| PUT | /zones/{zone id}/recordsets/{recordset id} | 用请求中的数据替换当前的 Recordset |
| DELETE | /zones/{zone id}/recordsets/{recordset id} | 删除 recordset 及其所有关联的 record。 |
列出 Recordset(s) (GET)
当未指定 id 时,将返回指定区域的所有 recordsets。请求中不提供 body。当提供 recordset id 时,仅返回该 recordset。请求中不提供 body
响应
{
"recordset" : [
{
"created_at" : "2014-04-29T19:34:21.819615",
"version" : 1,
"zone_id" : "766d7605-4c48-41fa-a9de-76692ed8051c",
"links" : {
"self" : "http://192.168.33.8:9001/v2/zones/766d7605-4c48-41fa-a9de-76692ed8051c/recordsets/06c3a2de-4e23-4143-98ab-6bf6d41ded26"
},
"ttl" : 3600,
"updated_at" : null,
"description" : null,
"type" : "A",
"id" : "06c3a2de-4e23-4143-98ab-6bf6d41ded26",
"name" : "example.com.",
"records" : [
"192.0.1.2",
"192.0.1.3"
],
{
"created_at" : "2014-04-29T22:04:41.000000",
"version" : 1,
"zone_id":"766d7605-4c48-41fa-a9de-76692ed8051c",
"links":{
"self":"http://192.168.33.8:9001/v2/zones/766d7605-4c48-41fa-a9de-76692ed8051c/recordsets/e862ddb2-58ee-431a-a3b5-6881a5e26465"
},
"ttl":null,
"updated_at":null,
"description":null,
"type":"CNAME",
"id":"e862ddb2-58ee-431a-a3b5-6881a5e26465",
"name":"www.example.com.",
"records": [
"example.com."
]
}
],
"links" : {
"self" : "http://192.168.33.8:9001/v2/zones/766d7605-4c48-41fa-a9de-76692ed8051c/recordsets/"
}
}
创建一个 Recordset (POST)
当创建一个新的 Recordset 时,调用者必须提供名称、类型和数据,这些数据因类型而异。如果名称和类型与现有的 RecordSet 相同,则返回码将为 204 Duplicate,即使发送的数据(record)不同。用户必须使用 PUT 来更改 record 信息。不能通过 CREATE 隐式更改它。
请求
{
"recordset" : {
"name" : "foo.example.com.",
"type" : "A",
"ttl" : 3600,
"records" : [
"10.1.0.1"
]
}
}
响应
{
"recordset" : [
{
"created_at" : "2014-05-01T19:34:21.819615",
"version" : 1,
"zone_id" : "766d7605-4c48-41fa-a9de-76692ed8051c",
"links" : {
"self" : "http://192.168.33.8:9001/v2/zones/766d7605-4c48-41fa-a9de-76692ed8051c/recordsets/06c3a2de-4e23-4143-98ab-6bf6d41ded12"
},
"ttl" : 3600,
"updated_at" : null,
"description" : null,
"type" : "A",
"id" : "06c3a2de-4e23-4143-98ab-6bf6d41ded12",
"name" : "foo.example.com.",
"records" : [
"10.1.0.1"
]
}
修改 RecordSet / 修改 Records(PUT)
PUT 请求将替换 RecordSet 中的所有 record。
请求
{
"recordset" : {
"ttl" : 3000
"records" : [
"10.1.0.5"
]
}
}
响应
{
"recordset" : [
{
"created_at" : "2014-05-01T19:34:21.819615",
"version" : 1,
"zone_id" : "766d7605-4c48-41fa-a9de-76692ed8051c",
"links" : {
"self" : "http://192.168.33.8:9001/v2/zones/766d7605-4c48-41fa-a9de-76692ed8051c/recordsets/06c3a2de-4e23-4143-98ab-6bf6d41ded12"
},
"ttl" : 3000,
"updated_at" : 2014-05-04T19:34:21.819615,
"description" : null,
"type" : "A",
"id" : "06c3a2de-4e23-4143-98ab-6bf6d41ded12",
"name" : "foo.example.com.",
"records" : [
"10.1.0.5"
]
}
删除 RecordSet (DELETE)
删除 RecordSet 时,用户必须在 url 中提供 id。与 RecordSet 关联的所有 record 也将被删除。请求 body 和返回 body 都是空的。返回 204。