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_name 和 key_data 的字段。不建议使用此替代方案,因为它涉及修改 instance 对象,并延续了重复对象字段的现有不良做法。
数据模型影响¶
由于将在 API 数据库中创建许多新表,因此数据模型会产生很大的影响。上述部分中已经详细说明了数据模型。
REST API 影响¶
无
安全影响¶
无
通知影响¶
无
其他最终用户影响¶
无
性能影响¶
无
其他部署者影响¶
部署者必须知道密钥对数据在升级时正在迁移,但这应该发生在他们正常的升级操作期间。
开发人员影响¶
无
实现¶
负责人¶
- 主要负责人
- 其他贡献者
无
工作项¶
为
keypairs创建新的数据库表和数据库迁移。更新
KeyPair对象以使用新的模型。创建迁移方法以将数据移动到 API 数据库。
修改 nova-compute 服务以使用 instance-extra 中的密钥对信息。
依赖项¶
无
测试¶
为 API db 中的数据库访问函数添加所需的单元测试。
为密钥对数据迁移添加功能测试。
为元数据服务中的密钥对数据访问添加新的单元测试。
文档影响¶
CellsV2 之外没有其他文档。在 CellsV2 文档中应该有一个已迁移表的列表。
参考资料¶
无
历史¶
发布名称 |
描述 |
|---|---|
Newton |
引入 |