This work is licensed under a Creative Commons Attribution 3.0 Unported License. http://creativecommons.org/licenses/by/3.0/legalcode

Expose recordsets endpoint

https://blueprints.launchpad.net/designate/+spec/expose-recordsets-api

Problem description

Currently the /recordsets endpoint is a sub-resource of /zones. But there is a need to list all the records for a tenant in a single API call, so that doing filtering across all the records under a tenant will be much easier.

Proposed change

Designate will have a new API endpoint /v2/recordsets.

  • A single recordset can be retrieved via a GET call to /v2/recordsets/{recordset_id}, which reponds a 301 and redirects to the canonical location /v2/zones/{zone_id}/recordsets/{recordset_id}. The “self” link in the response body points to that location as well.
  • All recordsets across all the zones owned by a tenant can be listed via a GET call to /v2/recordsets, response will be paginated in this case if necessary.
  • Filtering on all recordsets under a tenant will be supported, for example /v2/recordsets?name=foo.

API Changes

API changes will be mainly about exposing the new API endpoint in controllers.

Example single recordset retrieval request:

GET /v2/recordsets/f7b10e9b-0cae-4a91-b162-562bc6096648 HTTP/1.1
Host: 127.0.0.1:9001
Accept: application/json
Content-Type: application/json

{
  "description": "This is an example recordset.",
  "links": {
      "self": "https://127.0.0.1:9001/v2/zones/2150b1bf-dee2-4221-9d85-11f7886fb15f/recordsets/f7b10e9b-0cae-4a91-b162-562bc6096648"
  },
  "updated_at": null,
  "records": [
      "10.1.0.2"
  ],
  "ttl": 3600,
  "id": "f7b10e9b-0cae-4a91-b162-562bc6096648",
  "name": "www.example.org.",
  "zone_id": "2150b1bf-dee2-4221-9d85-11f7886fb15f",
  "zone_name": "example.org.",
  "created_at": "2014-10-24T19:59:44.000000",
  "version": 1,
  "type": "A"
}

Example all recordset of a tenant retrieval request:

GET /v2/recordsets HTTP/1.1
Host: 127.0.0.1:9001
Accept: application/json
Content-Type: application/json

{
  "recordsets": [
      {
          "description": null,
          "links": {
              "self": "https://127.0.0.1:9001/v2/zones/2150b1bf-dee2-4221-9d85-11f7886fb15f/recordsets/65ee6b49-bb4c-4e52-9799-31330c94161f"
          },
          "updated_at": null,
          "records": [
              "ns1.devstack.org."
          ],
          "action": "NONE",
          "ttl": null,
          "status": "ACTIVE",
          "id": "65ee6b49-bb4c-4e52-9799-31330c94161f",
          "name": "example.org.",
          "zone_id": "2150b1bf-dee2-4221-9d85-11f7886fb15f",
          "zone_name": "example.org.",
          "created_at": "2014-10-24T19:59:11.000000",
          "version": 1,
          "type": "NS"
      },
      {
          "description": null,
          "links": {
              "self": "https://127.0.0.1:9001/v2/zones/2150b1bf-dee2-4221-9d85-11f7886fb15f/recordsets/14500cf9-bdff-48f6-b06b-5fc7491ffd9e"
          },
          "updated_at": "2014-10-24T19:59:46.000000",
          "records": [
              "ns1.devstack.org. jli.ex.com. 1458666091 3502 600 86400 3600"
          ],
          "action": "NONE",
          "ttl": null,
          "status": "ACTIVE",
          "id": "14500cf9-bdff-48f6-b06b-5fc7491ffd9e",
          "name": "example.org.",
          "zone_id": "2150b1bf-dee2-4221-9d85-11f7886fb15f",
          "zone_name": "example.org.",
          "created_at": "2014-10-24T19:59:12.000000",
          "version": 1,
          "type": "SOA"
      },
      {
          "name": "jjli.com.",
          "id": "12caacfd-f0fc-4bcb-aa24-c42769897822",
          "type": "SOA",
          "zone_name": "jjli.com.",
          "action": "NONE",
          "ttl": null,
          "status": "ACTIVE",
          "description": null,
          "links": {
              "self": "http://127.0.0.1:9001/v2/zones/b8d7eaf1-e5c7-4b15-be6e-4b2809f47ec3/recordsets/12caacfd-f0fc-4bcb-aa24-c42769897822"
          },
          "created_at": "2016-03-22T16:12:35.000000",
          "updated_at": "2016-03-22T17:01:31.000000",
          "records": [
              "ns1.devstack.org. jli.ex.com. 1458666091 3502 600 86400 3600"
          ],
          "zone_id": "b8d7eaf1-e5c7-4b15-be6e-4b2809f47ec3",
          "version": 2
      },
      {
          "name": "jjli.com.",
          "id": "f39c51d1-ec2c-48a8-b9f7-877d56b7b82a",
          "type": "NS",
          "zone_name": "jjli.com.",
          "action": "NONE",
          "ttl": null,
          "status": "ACTIVE",
          "description": null,
          "links": {
              "self": "http://127.0.0.1:9001/v2/zones/b8d7eaf1-e5c7-4b15-be6e-4b2809f47ec3/recordsets/f39c51d1-ec2c-48a8-b9f7-877d56b7b82a"
          },
          "created_at": "2016-03-22T16:12:35.000000",
          "updated_at": null,
          "records": [
              "ns1.devstack.org."
          ],
          "zone_id": "b8d7eaf1-e5c7-4b15-be6e-4b2809f47ec3",
          "version": 1
       },
  ],
  "metadata": {
    "total_count": 4
  },
  "links": {
      "self": "https://127.0.0.1:9001/v2/recordsets"
  }
}

Example recordset filtering request:

GET /v2/recordsets?data=192.168* HTTP/1.1
Host: 127.0.0.1:9001
Accept: application/json
Content-Type: application/json

{
  "metadata": {
    "total_count": 2
  },
  "links": {
    "self": "http://127.0.0.1:9001/v2/recordsets?data=192.168%2A"
  },
  "recordsets": [
    {
      "name": "ohoh.uyudbbgxdf.com.",
      "id": "a48588c5-5093-4585-b0fc-3e399d169c01",
      "type": "A",
      "zone_name": "uyudbbgxdf.com.",
      "action": "NONE",
      "ttl": null,
      "status": "ACTIVE",
      "description": null,
      "links": {
        "self": "http://127.0.0.1:9001/v2/zones/601a25f0-5c4d-4058-8d9c-e6a78f5ffbb8/recordsets/a48588c5-5093-4585-b0fc-3e399d169c01"
      },
      "created_at": "2016-04-04T20:11:08.000000",
      "updated_at": null,
      "records": [
        "192.168.0.1"
      ],
      "zone_id": "601a25f0-5c4d-4058-8d9c-e6a78f5ffbb8",
      "version": 1
    },
    {
      "name": "jli-1.uyudbbgxdf.com.",
      "id": "f2c7a0f6-8ec7-4d14-b8ec-2a55a8129160",
      "type": "A",
      "zone_name": "uyudbbgxdf.com.",
      "action": "NONE",
      "ttl": null,
      "status": "ACTIVE",
      "description": null,
      "links": {
        "self": "http://127.0.0.1:9001/v2/zones/601a25f0-5c4d-4058-8d9c-e6a78f5ffbb8/recordsets/f2c7a0f6-8ec7-4d14-b8ec-2a55a8129160"
      },
      "created_at": "2016-04-04T22:21:03.000000",
      "updated_at": null,
      "records": [
        "192.168.6.6"
      ],
      "zone_id": "601a25f0-5c4d-4058-8d9c-e6a78f5ffbb8",
      "version": 1
    }
  ]
}

Central Changes

Central changes will include changing functions for finding recordsets from storage in central.service to support corresponding calls from api layer.

Storage Changes

Corresponding changes to support the API change.

Other Changes

None

Alternatives

None

Implementation

Assignee(s)

None

Milestones

newton-1

Work Items

  • Make code changes to api, central and storage
  • Add unit and functional tests.

Dependencies

None