跟踪迁移中的 user_id/project_id¶
https://blueprints.launchpad.net/nova/+spec/add-user-id-field-to-the-migrations-table
该蓝图建议跟踪发起服务器迁移的用户 user_id 和项目 project_id,并在 API 中公开这些值。
问题描述¶
默认情况下,所有创建迁移记录的服务器操作(实时迁移、冷迁移、调整大小、撤离)除了调整大小之外,都是由管理员发起的,而管理员可能不拥有该服务器。在同一个管理员项目中,可能有多个用户迁移(或撤离)服务器。迁移 API 没有公开有关实际迁移服务器的用户信息,这对于审计非常重要。实例操作 API 会记录发起用户/项目,但尝试将实例操作与迁移关联可能会很复杂且容易出错,尤其是在同一天对同一服务器进行多次迁移时。
用例¶
作为(管理员)用户,我希望能够在实例迁移历史记录中了解谁在操作实例,而无需尝试从迁移和实例操作 API 中拼接这些信息。
提议的变更¶
在创建迁移记录时,存储来自请求上下文的 user_id 和 project_id,类似于实例操作记录。
在一个新的微版本中,在以下 API 中公开 user_id 和 project_id 字段
GET /os-migrations
GET /servers/{server_id}/migrations
GET /servers/{server_id}/migrations/{migration_id}
此外,GET /os-migrations 请求将添加可选的 user_id 和 project_id 查询参数,用于按用户或项目过滤迁移。
备选方案¶
如上所述,每个生成迁移记录的操作也会有一个实例操作,并且实例操作会记录发起请求的用户 user_id 和项目 project_id。但是,实例操作记录和迁移记录之间没有其他直接链接,因此尝试使用操作将该信息与迁移关联可能会很复杂且容易出错,尤其是在同一天多次移动服务器时。由于迁移记录是 API 中的顶级资源,例如服务器,因此在创建它们时包含 user_id/project_id 就像服务器一样是有意义的。
数据模型影响¶
将 user_id 和 project_id 列添加到 migrations 表中。模式将与 instances 和 instance_actions 表中的相同
user_id = Column(String(255))
project_id = Column(String(255))
这些列将允许为空,因为现有的记录将没有这些列的值。
REST API 影响¶
在一个新的微版本中,在以下 API 响应中公开 user_id 和 project_id 参数
GET /os-migrations
{ "migrations": [ { "created_at": "2012-10-29T13:42:02.000000", "dest_compute": "compute2", "dest_host": "1.2.3.4", "dest_node": "node2", "id": 1234, "instance_uuid": "8600d31b-d1a1-4632-b2ff-45c2be1a70ff", "new_instance_type_id": 2, "old_instance_type_id": 1, "source_compute": "compute1", "source_node": "node1", "status": "done", "updated_at": "2012-10-29T13:42:02.000000", "migration_type": "migration", "uuid": "42341d4b-346a-40d0-83c6-5f4f6892b650", "user_id": "ef9d34b4-45d0-4530-871b-3fb535988394", "project_id": "011ee9f4-8f16-4c38-8633-a254d420fd54" } ] }
GET /servers/{server_id}/migrations
{ "migrations": [ { "created_at": "2016-01-29T13:42:02.000000", "dest_compute": "compute2", "dest_host": "1.2.3.4", "dest_node": "node2", "id": 1, "server_uuid": "4cfba335-03d8-49b2-8c52-e69043d1e8fe", "source_compute": "compute1", "source_node": "node1", "status": "running", "memory_total_bytes": 123456, "memory_processed_bytes": 12345, "memory_remaining_bytes": 111111, "disk_total_bytes": 234567, "disk_processed_bytes": 23456, "disk_remaining_bytes": 211111, "updated_at": "2016-01-29T13:42:02.000000", "uuid": "12341d4b-346a-40d0-83c6-5f4f6892b650", "user_id": "ef9d34b4-45d0-4530-871b-3fb535988394", "project_id": "011ee9f4-8f16-4c38-8633-a254d420fd54" } ] }
GET /servers/{server_id}/migrations/{migration_id}
{ "migration": { "created_at": "2016-01-29T13:42:02.000000", "dest_compute": "compute2", "dest_host": "1.2.3.4", "dest_node": "node2", "id": 1, "server_uuid": "4cfba335-03d8-49b2-8c52-e69043d1e8fe", "source_compute": "compute1", "source_node": "node1", "status": "running", "memory_total_bytes": 123456, "memory_processed_bytes": 12345, "memory_remaining_bytes": 111111, "disk_total_bytes": 234567, "disk_processed_bytes": 23456, "disk_remaining_bytes": 211111, "updated_at": "2016-01-29T13:42:02.000000", "uuid": "12341d4b-346a-40d0-83c6-5f4f6892b650", "user_id": "ef9d34b4-45d0-4530-871b-3fb535988394", "project_id": "011ee9f4-8f16-4c38-8633-a254d420fd54" } }
该键将始终返回,但对于较旧的记录,该值可能为空。
GET /os-migrations API 也会有可选的 user_id 和 project_id 查询参数,用于按用户和/或项目过滤迁移
GET /os-migrations?user_id=ef9d34b4-45d0-4530-871b-3fb535988394
GET /os-migrations?project_id=011ee9f4-8f16-4c38-8633-a254d420fd54
GET /os-migrations?user_id=ef9d34b4-45d0-4530-871b-3fb535988394&project_id=011ee9f4-8f16-4c38-8633-a254d420fd54
安全影响¶
无
通知影响¶
无。InstanceActionPayload 已经包含 action_initiator_user 和 action_initiator_project 字段。
其他最终用户影响¶
更新 python-novaclient 以支持新的微版本(如果将来 python-openstackclient 增长了服务器迁移资源 CLI)。
性能影响¶
无
其他部署者影响¶
无
开发人员影响¶
无
升级影响¶
无。数据库中的新列将允许为空,迁移对象上的字段也将允许为空,API 响应可以返回空值。不会添加数据迁移来填充现有迁移的值。
实现¶
负责人¶
- 主要负责人
张斌
工作项¶
将
user_id和project_id添加到migrations表和迁移版本对象。修改 API 以在公开迁移资源的 GET 响应中公开
user_id和project_id字段。 此外,将user_id和project_id查询参数添加到GET /os-migrations中,用于过滤结果。添加相关测试
新微版本的文档。
依赖项¶
无
测试¶
添加与负面场景相关的单元测试。
添加相关的功能测试 (API 示例)。
此更改不需要 Tempest 测试。
文档影响¶
更新 API 参考以支持新的微版本。
参考资料¶
无
历史¶
发布名称 |
描述 |
Train |
引入 |