将控制台转换为使用对象框架¶
https://blueprints.launchpad.net/nova/+spec/convert-consoles-to-objects
使控制台使用对象框架——当前的控制台代码没有利用框架对象,而是提供了一些类型(console/type.py)来处理它们。这些类型不提供任何处理版本控制、RPC 或任何使其有用的方法的功能。
问题描述¶
当前代码没有提供任何处理版本控制的机制。此外,由于 RPC 无法处理从 Python 对象类型派生的类,我们需要在 RPC 调用之间处理一个“connect_info”字典,并且没有提供任何方法来跨进程共享控制台的状态。
另一个问题在于令牌,memcached 不是数据库,无法保证尊重过期时间,令牌可能会在限制之前过期(驱逐)。通过使用框架对象,我们可以有机会将整个 Console 对象的状态与数据库中的有效令牌一起存储,并在进程之间共享状态。
例如,bug 1425640 需要知道用户从多个角度连接到特定端口的时间:从计算节点,返回下一个定义的未连接端口;从代理,拒绝已连接端口上的新连接;从 API,让用户知道没有更多可用端口。
我们还将通过仅在将干净的令牌返回给用户后,将令牌的 SHA-1 值存储在数据库中来增强安全性。然后,当用户请求连接控制台时,传递的令牌将被哈希并与数据库中存储的值进行比较以进行验证。
将引入一个新的选项“console_tokens_backend”,允许操作员在不同的后端之间切换。此规范的范围将允许 2 个后端(memcached、数据库)。memcached 后端将为了遗留兼容性而实现,但处于弃用状态,仅支持一个版本。
用例¶
开发人员可以在添加新的控制台或功能时利用框架对象。
项目优先级¶
无
提议的变更¶
定义一个新的 ConsoleConnection 对象
将驱动程序转换为返回 ConsoleConnection
移除对 connect_info 字典的使用
定义模式和 API 以在数据库中存储 ConsoleConnection 对象
更新代码以将带有有效令牌的 ConsoleConnection 存储在数据库中,而不是缓存中。
定义一个定期任务来清理数据库中存储的过期对象;为了平衡负载并避免长时间阻塞数据库,每个计算节点将负责清理其托管的客户的 connection_info。
修复 bug 1425640
备选方案¶
继续使用 memcached 作为后端将使连接信息行为不可预测,因为对象可能会被驱逐。此外,为了解决问题 1425640 和 1455252,必须进行扫描以列出可用的端口,这在使用 memcached 时很困难,除非添加特定代码来维护存储键的列表。
数据模型影响¶
需要定义一个新的 ConsoleConnection 模型,并具有属性
instance:引用控制台的实例
host:用于处理主机名的字符串字段
port:用于处理服务编号的整数字段
token_hash:用于处理令牌或 null 的字符串字段
access_url:用于处理访问或 null 的字符串字段
options:用于处理特定信息(例如 usetls、internal_access_path、mode…)的字典字段
expires:指示令牌过期时间的日期时间或 null
数据库模式
CREATE TABLE console_connection (
instance_uuid CHAR(36) NOT NULL,
host VARCHAR(255) NOT NULL,
port INT NOT NULL,
token_hash CHAR(40),
access_url VARCHAR(255),
options TEXT,
expires DATETIME,
PRIMARY KEY (instance_uuid, host, port),
INDEX (token, instance_uuid),
FOREIGN KEY (instance_uuid)
REFERENCES instances(uuid)
ON DELETE CASCADE
);
注意
预计从存储在 memcached 中的序列化字典连接信息升级到数据库时,不会进行迁移。升级期间,已经连接到控制台的客户端将保持其连接,直到代理重启。在此步骤中,我们预计 consoleauth 服务也已重启。先前断开连接的用户可以使用相同的令牌重新连接控制台(如果尚未过期)。
REST API 影响¶
无
安全影响¶
从令牌的角度来看,我们可以期望更好的安全性,因为当前令牌存储在 memcached 中,memcached 不提供任何安全层。现在只有令牌的哈希值才会存储在数据库中,并且安全策略也将得到增强,与存储在数据库中的其他关键组件相同。
通知影响¶
无
其他最终用户影响¶
当 proxyclient 重新启动时,用户将从我们的控制台断开连接,但如果尚未过期,应该使用相同的令牌重新连接到它。
性能影响¶
数据库负载将增加,但我们可以预期 DBA 的影响最小。
其他部署者影响¶
在重启代理服务之前,必须重启 consoleauth 服务。当代理重启时,客户端将从控制台断开连接。Memcached 将继续作为后端工作,直到弃用期(一个版本)。建议操作员切换到数据库后端(请参阅选项:console_tokens_backend)。
开发人员影响¶
无
实现¶
负责人¶
- 主要负责人
sahid-ferdjaoui
工作项¶
将代码转换为使用对象框架
更新 consoleauth 以利用数据库来处理令牌
修复 bug 1425640
依赖项¶
无
测试¶
当前代码已经通过功能测试和单元测试进行了测试,由于我们没有提供任何新功能,因此可以认为代码将得到充分的测试覆盖。
文档影响¶
无
参考资料¶
无