本作品采用知识共享署名 3.0 非移植许可协议授权。 http://creativecommons.org/licenses/by/3.0/legalcode

项目间区域所有权转移

https://blueprints.launchpad.net/designate/+spec/zone-migration-between-tenants

对于许多项目,它们的组织需求和结构可能会发生变化。这些变化导致需要将区域从一个项目移动到另一个项目,而不会中断域名解析。

问题描述

允许将区域及其关联的记录集和记录从一个项目移动到另一个项目。

这将移除原始所有项目的修改区域的能力。

这也可以允许一个项目创建一个子域,并将所有权转移到另一个项目。(例如,example.net 的 IT 团队允许开发人员管理 dev-env.example.net 中的记录)

我们允许使用范围限定(仅限于定义的项目)和无范围限定(任何具有 ID 和访问密钥的人都可以接受请求)两种方式。

术语

术语

含义

zone

DNS 区域(也称为 DNS 域名)

project

OpenStack keystone 项目(也称为租户)

transfer

从一个项目转移所有权到另一个项目的方法(不是传统的 DNS AFXR 区域传输)

提议的变更

新的 API 端点

参数

描述

必需

zone_id

要传输的 DNS 区域的 ID

description

传输的描述

target_project_id

将此共享请求限制到指定项目

否 - 默认为所有项目

POST /v2/zones/<zone-id>/tasks/transfer-requests

这会为由请求项目拥有的区域创建一个传输请求。

它会返回一个 ID 和一个访问密钥,这些信息应该通过非同步方式(例如通过电子邮件/IM 等)传达给接收方。他们需要这两个信息才能接受传输

重要

在任何时候,每个区域只能有一个活动的传输请求

POST /v2/zones/c11ae7e0-f558-11e3-a3ac-0800200c9a66/tasks/transfer-requests HTTP/1.1
Accept: application/json
Content-Type: application/json

{
    "transfer_request":{
        "description":"Transfer to Developers",
        "target_project_id":"88cbc4c7-1dee-40be-804c-ecf86962198c"
    }
}
HTTP/1.1 201 Created
Content-Type: application/json; charset=UTF-8
Location: /v2/zones/c11ae7e0-f558-11e3-a3ac-0800200c9a66/tasks/transfers/cddda8f0-f558-11e3-a3ac-0800200c9a66

{
    "transfer_request":{
        "id":"cddda8f0-f558-11e3-a3ac-0800200c9a66",
        "key":"tSzpOAoUYXhuKDyugHV4",
        "target_project_id":"88cbc4c7-1dee-40be-804c-ecf86962198c",
        "description":"Transfer dev-env.example.net to Developers",
        "status":"PENDING",
        "links":{
            "self" : "/v2/zones/tasks/transfer-requests/cddda8f0-f558-11e3-a3ac-0800200c9a66"
        }
    }
}

这会创建传输请求,接收方可以按照以下详细说明接受该请求。

GET /v2/zones/<zone-id>/tasks/transfer-requests

这显示了针对此区域的来自请求项目的未决传输请求。

GET /v2/zones/c11ae7e0-f558-11e3-a3ac-0800200c9a66/tasks/transfer-requests HTTP/1.1
HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8

{
    "transfer_requests":[
        {
            "transfer_request":{
                "id":"cddda8f0-f558-11e3-a3ac-0800200c9a66",
                "zone_id":"c11ae7e0-f558-11e3-a3ac-0800200c9a66",
                "target_project_id":"88cbc4c7-1dee-40be-804c-ecf86962198c",
                "description":"Transfer to Developers",
                "status":"PENDING",
                "links":{
                        "self" : "/v2/zones/tasks/transfer-requests/cddda8f0-f558-11e3-a3ac-0800200c9a66"
                }
            }
        }
    ]
}

GET /v2/zones/tasks/transfer-requests

这显示了当前由调用用户项目拥有的区域的传输请求

GET /v2/zones/tasks/transfer-requests HTTP/1.1
HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8

{
    "transfer-requests":[
        {
            "transfer_request":{
                "id":"cddda8f0-f558-11e3-a3ac-0800200c9a66",
                "zone_id":"c11ae7e0-f558-11e3-a3ac-0800200c9a66",
                "target_project_id":"88cbc4c7-1dee-40be-804c-ecf86962198c",
                "description":"Transfer to Developers",
                "status":"PENDING",
                "links":{
                    "self" : "/v2/zones/tasks/transfer-requests/cddda8f0-f558-11e3-a3ac-0800200c9a66"
                }
            }
        },
        {
            "transfer_request":{
                "id":"102e64fb-8fae-4c5e-9246-96a642822e03",
                "zone_id":"05e94130-6356-4687-b5ac-36374f99bf2d",
                "description":"Transfer *.www.example.net to web team",
                "status":"PENDING",
                "links":{
                    "self": "/v2/zones/tasks/transfer-requests/102e64fb-8fae-4c5e-9246-96a642822e03"
                }
            }
        }
    ]
}

GET /v2/zones/tasks/transfer-request/<transfer-id>

这显示了传输详细信息。如果设置了“target_project_id”,则此信息将仅限于该项目。

“key”将仅显示给拥有正在传输的区域的项目。

GET /v2/zones/tasks/transfer-requests/cddda8f0-f558-11e3-a3ac-0800200c9a66 HTTP/1.1
HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8

{
    "transfer_request":{
        "id":"cddda8f0-f558-11e3-a3ac-0800200c9a66",
        "key":"tSzpOAoUYXhuKDyugHV4",
        "target_project_id":"88cbc4c7-1dee-40be-804c-ecf86962198c",
        "zone_id":"c11ae7e0-f558-11e3-a3ac-0800200c9a66",
        "description":"Transfer dev-env.example.net to Developers",
        "status":"PENDING",
        "links":{
            "self": "/v2/zones/tasks/transfer-requests/cddda8f0-f558-11e3-a3ac-0800200c9a66"
        }
    }
}

POST /v2/zones/tasks/transfer-accept/

这是接受传输的方式。接受项目使用 key 向传输 URI 发送 POST 请求。如果成功,API 会返回一个 location header 给用户,其中包含区域的 API 位置。

POST /v2/zones/tasks/transfer-accept HTTP/1.1
Accept: application/json
Content-Type: application/json

{
    "transfer_accept":{
        "key":"tSzpOAoUYXhuKDyugHV4",
        "transfer_request_id":"cddda8f0-f558-11e3-a3ac-0800200c9a66"
    }
}
HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8

{
    "transfer_accept": {
        "id": "1c914bb0-f580-11e3-a3ac-0800200c9a66",
        "zone_id": "c11ae7e0-f558-11e3-a3ac-0800200c9a66",
        "status": "COMPLETE",
        "links": {
            "self": "/v2/zones/tasks/transfer-accept/1c914bb0-f580-11e3-a3ac-0800200c9a66",
            "zone": "/v2/zones/c11ae7e0-f558-11e3-a3ac-0800200c9a66"
    }
}

对传输请求实体进行进一步的 GET 操作将显示以下内容

GET /v2/zones/tasks/transfer-request/<transfer-id> HTTP/1.1
Accept: application/json
HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8

{
    "transfer_request":{
        "id":"cddda8f0-f558-11e3-a3ac-0800200c9a66",
        "key":"tSzpOAoUYXhuKDyugHV4",
        "target_project_id":"88cbc4c7-1dee-40be-804c-ecf86962198c",
        "zone_id":"c11ae7e0-f558-11e3-a3ac-0800200c9a66",
        "description":"Transfer dev-env.example.net to Developers",
        "status":"COMPLETE",
        "links":{
            "self": "/v2/zones/<zone-id>/tasks/transfer-requests/cddda8f0-f558-11e3-a3ac-0800200c9a66"
        }
    }
}

DELETE /v2/zones/<zone-id>/tasks/transfer-requests/<request-id>

这允许用户取消传输请求。只能在传输发生之前执行此操作,并且不会导致传输回滚。

DELETE /v2/zones/tasks/transfer-requests/cddda8f0-f558-11e3-a3ac-0800200c9a66 HTTP/1.1
HTTP/1.1 204 No Content

Central 变更

新的中央方法,用于允许对传输请求进行 CRUD 操作。中央方法应使用当前使用的更新方法来更改引用区域的项目所有权

Storage 变更

新表 - ZoneTransferRequestTasks

类型

可为空?

唯一?

注意事项

id

uuid

zone_id

uuid

VARCHAR

description

VARCHAR

project_id

uuid

创建 ZoneTransferRequest 的项目

target_project_id

uuid

status

ENUM(PENDING,COMPLETE,DELETED,ERROR)

新表 - ZoneTransferAcceptTasks

类型

可为空?

唯一?

注意事项

id

uuid

zone_id

uuid

project_id

uuid

接受传输请求的项目的 ID

transfer_request_id

uuid

status

ENUM(COMPLETE,ERROR)

实现

负责人

主要负责人

https://launchpad.net/~grahamhayes

里程碑

完成目标里程碑

Juno-2

工作项

  • 任务子 API

  • 两个任务(请求和接受)的 CRUD

  • 将区域移动到新的租户

依赖项

参考资料