从 Zaqar 中移除池组

https://blueprints.launchpad.net/zaqar/+spec/remove-pool-group-from-zaqar

移除池组在池和风味资源中的使用。

问题描述

目前池组在池和风味资源中使用,但池组仅支持与风味的 1:1 映射。由于我们可以直接将 1 个风味映射到 N 个池,因此没有必要保留它。另一个问题是,目前没有 API 来处理池组资源,这给运维人员维护带来了很大的困扰。

为了向用户澄清,此 bp 建议从 Zaqar 中移除无用的池组,仅保留池资源。

为了向后兼容,我们将把这项工作分成两个步骤

  1. 在 Queens 版本中,我们同时支持使用池组的旧方式和不使用它的新方式。池组将被标记,以告知用户它很快将变得无用并在 R 版本中移除。

  2. 在 Rocky 版本中,我们将完全移除池组,并在风味和池中仅保留新方式。

提议的变更

  1. 修改池和风味操作 API

    • 移除风味操作 API 中的组:例如创建、更新、显示、列表。

    • 移除池操作 API 中的组:例如创建、更新、显示、列表。

..note

This changes isn't going to happen in Queens release for backward
compatibility, we keep the pool_group this circle and mark it will be
useless in Zaqar log and remove the pool group totally in R release.
  1. 修改 zaqar 服务器中与组相关的逻辑代码

    例如,现在在创建队列时,我们首先基于组找到所有池,然后选择合适的池(pool = select.weighted (pools))来创建队列。

    我们修改为如下:基于风味找到所有池,然后选择合适的池来创建队列。

    等等。

  2. 修改风味和池资源的数据模型,详情请参见数据模型影响。

  3. 修改 zaqar 客户端中与组相关的逻辑代码

    • openstack messaging flavor create

    • openstack messaging flavor update

    • openstack messaging pool create

    • openstack messaging pool update

..note

Like the changes in Zaqar APIs, this change is also going to do in R
release.

缺点

备选方案

数据模型影响

对于 sqlalchemy

  • 在 R 版本中删除 PoolGroup 表。

  • 修改 Flavors 表

    丢弃 pool_group 字段,但在 Q 版本中不删除该字段,以便

    与后续版本兼容:CREATE TABLE Flavors ( name varchar(64) NOT NULL, project varchar(64) DEFAULT NULL, pool_group varchar(64) NOT NULL, capabilities text, PRIMARY KEY (name), ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

  • 修改 Pools 表

    丢弃 group 字段,但在 Q 版本中不删除该字段,以便

    与后续版本兼容;添加 flavor 字段,此 flavor 字段等于风味的 name 字段:CREATE TABLE Pools ( name varchar(64) NOT NULL, group varchar(64) DEFAULT NULL, uri varchar(255) NOT NULL, weight int(11) NOT NULL, options text, flavor varchar(64) DEFAULT NULL, PRIMARY KEY (name), UNIQUE KEY uri (uri), CONSTRAINT Pools_flavor_fk FOREIGN KEY (flavor) REFERENCES fla (name) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

  • 风味和池表迁移策略

    1. 查询所有池,然后处理每条记录如下

    2. 查找 Flavors.name,其中 Flavors.pool_group = Pools.group

    3. 修改 Pools.flavor = Flavors.name

  1. 对于 mongodb

  • 升级策略类似。我们需要引入一个脚本来实现数据迁移。

..note

Since we decide to remove the pool_group totally in Rocky, that then we need
to provide a script to help users to migrate the data and remove the
pool_group column from db table.

REST API 影响

1. 创建风味 API 创建风味时的 Request JSON

PUT: /v2/flavors/{flavor_name}

{
  "pool_group": "testgroup",  # remove pool_group in Rocky release
  "pool_list": [pool1, pool2]
}

创建风味时的 Response JSON

Normal response codes: 201

Error response codes:
•BadRequest (400)
•Unauthorized (401)
•Forbidden (403)

2. 更新风味 API 更新风味时的 Request JSON

 PATCH: /v2/flavors/{flavor_name}

{
   "pool_group": "testgroup",  # remove pool_group in Rocky release
   "pool_list": [pool1, pool2, pool3]
}

更新风味时的 Response JSON

{
  "href": "/v2/flavors/testflavor",
  "pool_group": "testgroup",# remove pool_group in Rocky release
  "name": "testflavor",
  "capabilities": [
    "FIFO",
    "CLAIMS",
    "DURABILITY",
    "AOD",
    "HIGH_THROUGHPUT"
  ],
  "pool_list": [pool1, pool2, pool3]
}
 Normal response codes: 200

 Error response codes:
 •BadRequest (400)
 •Unauthorized (401)
 •Forbidden (403)
 •Not Found (404)
 •ServiceUnavailable (503)

3. 显示风味详情 API 显示风味详情时的 Response JSON

GET: /v2/flavors/{flavor_name}

{
  "href": "/v2/flavors/testflavor",
  "pool_group": "testgroup", # remove pool_group in Rocky release
  "capabilities": [
    "FIFO",
    "CLAIMS",
    "DURABILITY",
    "AOD",
    "HIGH_THROUGHPUT"
  ],
  "pool_list": [pool1, pool2],
  "name": "testflavor"
}

显示风味详情时的 Response JSON

Normal response codes: 200

Error response codes:
•BadRequest (400)
•Unauthorized (401)
•Forbidden (403)
•Not Found (404)
•ServiceUnavailable (503)

4. 列出风味 API 列出风味时的 Response JSON

GET: /v2/flavors

{
  "flavors": [
    {
      "href": "/v2/flavors/test_flavor1",
      "pool_group": "testgroup", # remove pool_group in Rocky release
      "name": "test_flavor1",
      "pool": "testgroup",       # remove pool_group in Rocky release
      "pool_list": [pool1, pool2]
    },
    {
      "href": "/v2/flavors/test_flavor2",
      "pool_group": "testgroup", # remove pool_group in Rocky release
      "name": "test_flavor2",
      "pool": "testgroup",       # remove pool_group in Rocky release
      "pool_list": [pool3, pool4]
    }
  ],
  "links": [
    {
      "href": "/v2/flavors?marker=test_flavor2",
      "rel": "next"
    }
  ]
}

列出风味时的 Response JSON

Normal response codes: 200

Error response codes:
•Unauthorized (401)
•Forbidden (403)

5. 创建池 API 创建池时的 Request JSON

 PUT: /v2/pools/{pool_name}

{
    "weight": 100,
    "uri": "mongodb://127.0.0.1:27017",
    "options":{
        "max_retry_sleep": 1
    },
    "group": "poolgroup", # remove pool_group in Rocky release
    "flavor": "testflavor"
}

创建池时的 Response JSON

Normal response codes: 201

Error response codes:
•BadRequest (400)
•Unauthorized (401)
••Conflict (409)

6. 更新池 API 更新池时的 Request JSON

PATCH: /v2/pools/{pool_name}

{
   "weight": 60,
   "uri": "mongodb://127.0.0.1:27017",
   "options":{
       "max_retry_sleep": 1
   },
   "group": "newpoolgroup", # remove pool_group in Rocky release
   "flavor": "testflavor1"
}

更新池时的 Response JSON

{
  "href": "/v2/pools/test_pool",
  "group": "newpoolgroup", # remove pool_group in Rocky release
  "name": "test_pool",
  "weight": 60,
  "uri": "mongodb://127.0.0.1:27017",
  "flavor": "testflavor1"
}
 Normal response codes: 200

 Error response codes:
 •BadRequest (400)
 •Unauthorized (401)
 •Not Found (404)
 •ServiceUnavailable (503)

7. 显示池详情 API 显示池详情时的 Response JSON

GET: /v2/pools/{pool_name}

{
  "href": "/v2/pools/test_pool",
  "group": "testpoolgroup", # remove pool_group in Rocky release
  "flavor": "flavor1",
  "name": "test_pool",
  "weight": 100,
  "uri": "mongodb://127.0.0.1:27017"
}

显示池详情时的 Response JSON

Normal response codes: 200

Error response codes:
•BadRequest (400)
•Unauthorized (401)
•ServiceUnavailable (503)

8. 列出池 API 列出池时的 Response JSON

GET: /v2/pools

{
  "pools": [
    {
      "href": "/v2/pools/test_pool1",
      "group": "poolgroup", # remove pool_group in Rocky release
      "flavor": "flavor1",
      "name": "test_pool1",
      "weight": 60,
      "uri": "mongodb://192.168.1.10:27017"
    },
    {
      "href": "/v2/pools/test_pool2",
      "group": "poolgroup", # remove pool_group in Rocky release
      "flavor": "flavor1",
      "name": "test_pool2",
      "weight": 40,
      "uri": "mongodb://192.168.1.20:27017"
    }
  ],
  "links": [
    {
      "href": "/v2/pools?marker=test_pool2",
      "rel": "next"
    }
  ]
}

列出池时的 Response JSON

Normal response codes: 200

Error response codes:
•Unauthorized (401)
•Not Found (404)

我们使用 v2 接口,只需在风味 API 中添加 pool_list,并在池 API 中添加风味即可。这可以与旧方式兼容。

  1. 旧方式

    • 在池 API 和风味 API 中配置组;

  2. 新方式

    • 在风味 API 中配置 pool_list

    • 将池添加到风味

      1. 方法一:更新风味 API 中的 pool_list

      2. 方法二:在池 API 中使用风味配置池。

实现

负责人

主要负责人

wanghao<sxmatch1986@gmail.com>

二级分配人

gengchc2 <geng.changcai2@zte.com.cn>

里程碑

完成目标里程碑

Queens 和 Rocky

工作项

  1. 修改池和风味操作 API。

  2. 修改 zaqar 服务器中与组相关的逻辑代码。

  3. 修改风味、池和池组的数据模型。

  4. 修改 zaqar 客户端中与组相关的逻辑代码。

依赖项

测试

需要创建单元测试和 Tempest 测试来覆盖代码更改。

文档影响

Zaqar API 文档需要更新,以反映 REST API 的更改。

参考资料