将控制台转换为使用对象框架

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

依赖项

测试

当前代码已经通过功能测试和单元测试进行了测试,由于我们没有提供任何新功能,因此可以认为代码将得到充分的测试覆盖。

文档影响

参考资料