跳转到: 导航, 搜索

Designate/蓝图/搜索 API

概述

目前,此规范是一个非常粗略的草案。它主要来自 过滤 API 的内容,这些内容被移到此处,因为它们不属于过滤 API。

Gerrit补丁 []
Launchpad蓝图 []

总结

变更的快速概述

API 变更

与过滤一样,搜索将作为 URL 选项实现。对于

此外,在适用情况下,特权用户(支持和管理员)可以通过在他们的 GET 请求中指定附加参数 all_tenants=true 来执行跨所有租户的搜索。

按地址搜索是一个特殊情况,已经进行了大量的讨论。这主要是因为租户可能希望在其所有记录上搜索地址(这些记录可能分布在多个区域集中,在多个区域中),或者在单个区域集中搜索。此外,管理员需要能够搜索所有租户的记录中的地址。已经提出了几种解决方案,下面讨论了一种暂定的方法

  • 为管理员专用创建一个 /records 端点,以搜索所有租户中的地址。使用原始的 /zones/{id}/recordsets 端点来搜索单个租户中的地址,在单个区域内。但是,让租户搜索其所有区域中的地址尚不清楚。也许 /records 端点可以用于此目的,并使用 all_tenants 选项来区分在单个租户和所有租户中搜索?

为了说明,下面是一个表格,显示以上述不同方式构造的 IP 地址 ADDR 的搜索。所有这些请求都是 GET 请求。

一个记录集(过滤) 整个租户(搜索) 所有租户(搜索)
/zones/{zone-id}/recordsets/{recordset-id}/records?address=ADDR /records?address=ADDR /records?address=ADDR&all_tenants=true


HTTP API 的变更列表

动词 资源 描述
GET /zones?name=example.com&match-type=exact&all_tenants=true 返回名称与指定过滤器(“name”)完全匹配的区域,跨所有租户。注意:只有管理员和支持人员才能跨所有租户搜索。
GET /zones/{zone-id}/recordsets?address=10.1.2.3&match-type=exact 从为此租户指定的区域返回与指定 IP 地址完全匹配的地址记录集。
GET /zones/ipaddresses?address=172.192.112.82&match-type=exact&all_tenants=true 从属于所有租户的所有区域返回与指定 IP 地址完全匹配的地址记录集。
GET /zones/ipaddresses?address=172.192.112.82&match-type=exact 从属于此租户的所有区域返回与指定 IP 地址完全匹配的地址记录集。
GET,

PUT, PATH, POST, DELETE

/zones/ipaddresses 无操作。
PUT, PATH, POST, DELETE /zones/ipaddresses?address=172.192.112.82 无操作。

这些应该通过 /zone/{zone-id}/recordsets/ 来完成

调用示例 (HTTP 方法)

请求

 GET /v2/zones?name=example.com&match-type=exact&all_tenants=true HTTP/1.1
 Host: dns.provider.com
 Accept: application/json
 X-Auth-Token: KeyStoneAuth_*****
 X-Tenant-ID:

响应

 {
  "zone": {
    "id": "a86dba58-0043-4cc6-a1bb-69d5e86f3ca3",
    "pool_id": "7d62d10d-3a16-4828-85dd-7b3fdc0ba989",
    "project_id": "4335d1f0-f793-11e2-b778-0800200c9a66",
    "name": "example.com.",
    "email": "joe@example.com.",
    "ttl": 7200,
    "serial": 1351800588,
    "status": "ACTIVE",
    "version": 1,
    "created_at": "...",
    "updated_at": null,
    "links": {
      "self": "https://dns.provider.com/v2/zones/a86dba58-0043-4cc6-a1bb-69d5e86f3ca3"
    }
  }
 }

特权用户在一个租户中搜索

请求:

 GET /v2/zones?name=example.com&match-type=exact HTTP/1.1
 Host: dns.provider.com
 Accept: application/json
 X-Auth-Token: KeyStoneAuth_*****
 X-Tenant-ID: 12345

响应

(空 - 此租户没有域 example.com)

 {
  "zone": {
  }
 }

客户跨所有租户搜索

当 API 中的策略检查显示租户 1234 没有特权跨所有租户搜索时,抛出异常

客户在一个租户中搜索

请求

 GET /v2/zones?name=exp.com&match-type=exact HTTP/1.1
 Host: dns.provider.com
 Accept: application/json
 X-Auth-Token: KeyStoneAuth_*****
 X-Tenant-ID: 12345

响应

 {
  "zone": {
    "id": "a66dba58-0043-4cc6-a1bb-69d5e86f3ca3",
    "pool_id": "6d62d10d-3a16-4828-85dd-7b3fdc0ba989",
    "project_id": "5335d1f0-f793-11e2-b778-0800200c9a66",
    "name": "exp.com.",
    "email": "jane@exp.com.",
    "ttl": 7200,
    "serial": 1351800588,
    "status": "ACTIVE",
    "version": 1,
    "created_at": "...",
    "updated_at": null,
    "links": {
      "self": "https://dns.provider.com/v2/zones/c86dba58-0043-4cc6-a1bb-69d5e86f3cc1"
    }
  }
 }

特权用户搜索指向特定 IP 地址的记录,跨所有租户

请求

 GET /v2/zones/ipaddresses?address=172.192.112.82&match-type=exact&all_tenants=true HTTP/1.1
 Host: dns.provider.com
 Accept: application/json
 X-Auth-Token: KeyStoneAuth_*****
 X-Tenant-ID:

响应

 {
    "records": [
        {
         "type": "A",
         "address": "172.192.112.82",
         “id”: “9e27811d-0320-4179-abb7-0e00e371e25b”,
         "zone_id": "a86dba58-0043-4cc6-a1bb-69d5e86f3ca3",
         “name”: "www.example.org.",
         "links": {
           "self": "https://dns.provider.com/v2/zones/986dba58-0043-4cc6-a1bb-69d5e86f3ca9/recordsets/dedf6879-fd9a-41d6-a7c2-eeac316fa7b3"
    }
    },
        {
        "type": "A",
        "address": "172.192.112.82",
        “id”: “4e27811d-0320-4179-abb7-0e00e371e25c”,
        "zone_id": "b46dba58-0043-4cc6-a1bb-69d5e86f3cc1",
        “name”: "exp.com.",
        "links": {
         "self": "https://dns.provider.com/v2/zones/436dba58-0043-4cc6-a1bb-69d5e86f3ca9/recordsets/dedf6879-fd9a-41d6-a7c2-eeac316fa7d2"
    }
    }
 ] }


特权用户搜索指向特定 IP 地址的记录,在给定租户中

请求

 GET /v2/zones/ipaddresses?address=172.192.112.82&match-type=exact HTTP/1.1
 Host: dns.provider.com
 Accept: application/json
 X-Auth-Token: KeyStoneAuth_*****
 X-Tenant-ID: 31476

响应

 {
    "records": [
           {
            "type": "A",
            "address": "172.192.112.82",
            “id”: “4e27811d-0320-4179-abb7-0e00e371e25c”,
            "zone_id": "b46dba58-0043-4cc6-a1bb-69d5e86f3cc1",
            “name”: "exp.com.",
            "links": {
              "self": https://dns.provider.com/v2/zones/436dba58-0043-4cc6-a1bb-69d5e86f3ca9/recordsets/dedf6879-fd9a-41d6-a7c2-eeac316fa7d2 
            }
    }
 ] }

客户搜索指向特定 IP 地址的记录,跨所有租户

异常 - 没有客户可以跨所有租户搜索

客户搜索指向特定 IP 地址的记录,在其自身空间内

请求

 GET /v2/zones/ipaddresses?address=172.192.112.82&match-type=exact HTTP/1.1
 Host: dns.provider.com
 Accept: application/json
 X-Auth-Token: KeyStoneAuth_*****
 X-Tenant-ID: 44441

响应

 {
    "records": [
           {
            "type": "A",
            "address": "172.192.112.82",
            “id”: “9e27811d-0320-4179-abb7-0e00e371e25b”,
            "zone_id": "a86dba58-0043-4cc6-a1bb-69d5e86f3ca3",
            “name”: "www.example.org.",
            "links": {
                 "self": "https://dns.provider.com/v2/zones/986dba58-0043-4cc6-a1bb-69d5e86f3ca9/recordsets/dedf6879-fd9a-41d6-a7c2-eeac316fa7b3"
         }
     }
 ] }

其他内容

all_tenants 的验证步骤:2. 在 middleware.py:KeystoneMiddleware::process_request() 中,在构建 DesignateContext 期间

    • 确定 all_tenants 设置为 True,表示打算对所有租户执行此操作
      • 执行策略检查(在 API 中,在传递到 Central 之前)
        • 如果确认用户具有跨所有租户执行此操作的权利,
          • 设置 context.all_tenants=True
          • 让请求继续传递到 Central
        • 如果无法确认用户具有跨所有租户执行操作的权利,则拒绝请求并显示适当的消息

数据库更改

数据库模式变更的描述

例如 -

姓名 数据类型 长度 可为空 详情
id VARCHAR 36 主键,生成的UUID
name VARCHAR 255 要列入黑名单的域名
version INTEGER - Designate API 版本
created_at DATETIME - 创建的 UTC 时间
updated_at DATETIME - 创建的 UTC 时间
description VARCHAR 160 UTF-8 文本字段