跳转到: 导航, 搜索

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。