本作品采用知识共享署名 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) |
否 |
否 |
实现¶
负责人¶
里程碑¶
- 完成目标里程碑
Juno-2
工作项¶
任务子 API
两个任务(请求和接受)的 CRUD
将区域移动到新的租户
依赖项¶
无