将风味表添加到 API 数据库

https://blueprints.launchpad.net/nova/+spec/flavor-cell-api

CellsV2 需要存储风味信息以启动实例。由于此信息将位于 Cell API 中,因此需要在 API 数据库中创建与风味相关的表。

问题描述

风味是虚拟硬件模板,Nova 在创建新实例时会使用它们,例如。在 CellsV1 中,风味存储在父单元和子单元中。保持所有单元之间信息的同步需要大量的手动工作。

风味是一个全局概念,应该只存储在一个数据库中。因此,CellsV2 的风味相关表将仅在 API 数据库中创建。

用例

  • 运营商希望将他们的部署划分为单元,以实现扩展、故障域和构建原因。在划分后,风味信息需要在 API 级别存储。

项目优先级

Nova CellV2 在自由软件项目中具有优先地位。

提议的变更

通过此规范,我们建议在 API 数据库中创建所有与风味相关的表。它们是

* instance_types
* instance_type_extra_specs
* instance_type_projects

表名将分别更改为 flavors、flavor_extra_specs 和 flavor_projects,但表模式将保持不变。

风味对象将被修改为与 API 数据库中的表进行交互。create() 和 save() 方法将被更新为使用 API 数据库表。

get_by_*() 方法将被修改为查询 API 数据库,如果未找到风味,则查询 nova 数据库。get_all() 方法将被修改为显示所有风味,这将是 API 数据库和 nova 数据库中存在的风味的联合。它将查询 API 数据库,然后查询 nova 数据库以获取尚未存在于 API 数据库中的风味。

destroy() 方法将从两个数据库中删除风味。这将确保所有与风味相关的操作都在新表上完成,并且旧的风味也会在被使用时主动迁移到新表。nova 中现有的风味表将继续保留,但不再访问,并且可以在后续版本中删除。

在过渡阶段,与 cellV1 和 V2 对应的数据库将同时存在,并且将编写测试以确保 CellsV2 中的风味表与 CellV1 中的模型相同。任何对表的更改都应应用于两个数据库。

为了将现有的风味数据迁移到建议的 cellsV2 表,将添加一个新的“nova-manage”命令。

此命令将从顶级单元数据库复制风味条目到新的 API 数据库。它不接受任何参数,执行时会读取风味表(instance_types、instance_type_extra_specs 和 instance_type_projects)中的数据,并将其放入 API 数据库中对应的表中(如果它不存在)。

备选方案

我们可以继续在 api 和 cell 级别同时存储风味,或者只在 compute cell 级别存储风味。这两种方法都会引入风味管理方面的额外复杂性。

数据模型影响

将在 ‘nova_api’ 数据库中创建三个新表,如下所示。相应的模式如下详细说明:

  • ‘flavors’::
    CREATE TABLE flavors (

    created_at datetime DEFAULT NULL, updated_at datetime DEFAULT NULL, deleted_at datetime DEFAULT NULL, name varchar(255) DEFAULT NULL, id int(11) NOT NULL AUTO_INCREMENT, memory_mb int(11) NOT NULL, vcpus int(11) NOT NULL, swap int(11) NOT NULL, vcpu_weight int(11) DEFAULT NULL, flavorid varchar(255) DEFAULT NULL, rxtx_factor float DEFAULT NULL, root_gb int(11) DEFAULT NULL, ephemeral_gb int(11) DEFAULT NULL, disabled tinyint(1) DEFAULT NULL, is_public tinyint(1) DEFAULT NULL, deleted int(11) DEFAULT NULL)

    此表将在 (name, deleted) 和 (flavorid, deleted) 属性上具有唯一约束

  • ‘flavors_extra_specs’:

    CREATE TABLE `flavor_extra_specs` (
        `created_at` datetime DEFAULT NULL,
        `updated_at` datetime DEFAULT NULL,
        `deleted_at` datetime DEFAULT NULL,
        `id` int(11) NOT NULL AUTO_INCREMENT,
        `flavor_id` int(11) NOT NULL,
        `key` varchar(255) DEFAULT NULL,
        `value` varchar(255) DEFAULT NULL,
        `deleted` int(11) DEFAULT NULL)
    
    This table will have a unique constraint on (flavor_id, key,
    deleted) attribute and an index on (flavor_id, key)
    
  • ‘flavor_projects’:

    CREATE TABLE `flavor_projects` (
        `created_at` datetime DEFAULT NULL,
        `updated_at` datetime DEFAULT NULL,
        `deleted_at` datetime DEFAULT NULL,
        `id` int(11) NOT NULL AUTO_INCREMENT,
        `flavor_id` int(11) NOT NULL,
        `project_id` varchar(255) DEFAULT NULL,
        `deleted` int(11) DEFAULT NULL)
    
    This table will have a unique constraint on (flavor_id, project_id,
    deleted) attribute
    

REST API 影响

安全影响

通知影响

其他最终用户影响

性能影响

其他部署者影响

将向部署者提供一个新的 nova-manage 命令,以将风味迁移到 cellsV2 DB API 建议的表。对于任何现有的部署(单元或非单元),都需要运行此命令一次。

开发人员影响

实现

负责人

主要负责人

mvineetmenon

其他贡献者

工作项

  • 在 API 数据库中创建新的数据库表 ‘flavors’、‘flavor_extra_specs’ 和 ‘flavor_projects’。

  • 修改风味对象以与 API 数据库交互

  • 在 nova-manage 中创建一个新命令,用于将风味从 cellsV1 迁移到 cellsV2

依赖项

测试

由于这被设计为 Nova 的内部重构,没有用户可见的更改,因此当前的 Tempest 或功能测试套件应该足够。

此外,需要编写测试以确保数据模型不会从 cellsV1 模型中使用的模型更改。

这些测试应保留到最终迁移到 cellsV2 为止。

文档影响

记录 nova-manage 命令,以将风味从顶级单元数据库迁移到 cellsV2 API-DB。

参考资料

https://etherpad.openstack.org/p/kilo-nova-cells