CellsV2 - 密钥对 API 数据库迁移

https://blueprints.launchpad.net/nova/+spec/cells-keypairs-api-db

当前位于 nova 数据库中的密钥对数据库表必须迁移到 API 数据库。这是因为密钥对在 API 中暴露,并且必须跨越 cells。

问题描述

目前 key_pairs 表位于 cell 数据库中。由于密钥对是一个在 API 中暴露的概念,因此必须将其移动到 API 数据库。

用例

作为开发者,我需要确保所有适用于多个 cell 分区的数据都存储在全局 API 数据库中。

提议的变更

将在 API 数据库中创建一个新的 key_pairs 数据库模型

class KeyPair(API_BASE):
    """Represents a public key pair for ssh / WinRM."""
    __tablename__ = 'key_pairs'
    __table_args__ = (
        schema.UniqueConstraint("user_id", "name",
                            name="uniq_key_pairs0user_id0name"),
    )
    id = Column(Integer, primary_key=True, nullable=False)

    name = Column(String(255), nullable=False)

    user_id = Column(String(255))

    fingerprint = Column(String(255))
    public_key = Column(MediumText())
    type = Column(Enum('ssh', 'x509', name='keypair_types'),
                  nullable=False, server_default='ssh')

将修改 KeyPair 对象以使用新的 API 数据库模型。目前在数据库 API 中与密钥对相关的函数将被移动到 KeyPair 对象。

迁移到 API 数据库将遵循合并 flavor 迁移系列建立的现有模式。

元数据服务当前直接读取 key_pairs 表。我们希望在表移动到 API 数据库后防止这种情况发生。相反,整个 KeyPair 对象将被序列化到 instance_extra 表中。这将需要一个额外的列

keypair = orm.deferred(Column(Text))

将执行数据库迁移以在 instance extra 中包含此新列。如果需要插入密钥对,将在创建 instance 对象时填充该列。它将从元数据服务中读取。

备选方案

我不认为将密钥对表放在 API 数据库中有替代方案。将密钥对信息传递给元数据服务的替代方案可以是向 instance 对象添加一个字段来存储 key_type。已经存在用于存储 key_namekey_data 的字段。不建议使用此替代方案,因为它涉及修改 instance 对象,并延续了重复对象字段的现有不良做法。

数据模型影响

由于将在 API 数据库中创建许多新表,因此数据模型会产生很大的影响。上述部分中已经详细说明了数据模型。

REST API 影响

安全影响

通知影响

其他最终用户影响

性能影响

其他部署者影响

部署者必须知道密钥对数据在升级时正在迁移,但这应该发生在他们正常的升级操作期间。

开发人员影响

实现

负责人

主要负责人

<dms@danplanet.com>

其他贡献者

工作项

  • keypairs 创建新的数据库表和数据库迁移。

  • 更新 KeyPair 对象以使用新的模型。

  • 创建迁移方法以将数据移动到 API 数据库。

  • 修改 nova-compute 服务以使用 instance-extra 中的密钥对信息。

依赖项

测试

  • 为 API db 中的数据库访问函数添加所需的单元测试。

  • 为密钥对数据迁移添加功能测试。

  • 为元数据服务中的密钥对数据访问添加新的单元测试。

文档影响

CellsV2 之外没有其他文档。在 CellsV2 文档中应该有一个已迁移表的列表。

参考资料

历史

修订版

发布名称

描述

Newton

引入