跟踪迁移中的 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_idproject_id,类似于实例操作记录。

在一个新的微版本中,在以下 API 中公开 user_idproject_id 字段

  • GET /os-migrations

  • GET /servers/{server_id}/migrations

  • GET /servers/{server_id}/migrations/{migration_id}

此外,GET /os-migrations 请求将添加可选的 user_idproject_id 查询参数,用于按用户或项目过滤迁移。

备选方案

如上所述,生成迁移记录的每个操作也会有一个实例操作,并且实例操作会记录发起请求的 user_id 和 project_id。但是,实例操作记录和迁移记录之间没有其他直接链接,因此尝试使用操作将该信息与迁移关联可能会很复杂且容易出错,尤其是在同一天多次移动服务器的情况下。由于迁移记录是 API 中的顶级资源,例如服务器,因此在创建它们时包含 user_id/project_id 就像服务器一样是有意义的。

数据模型影响

user_idproject_id 列添加到 migrations 表中。模式将与 instancesinstance_actions 表中的相同

user_id = Column(String(255))
project_id = Column(String(255))

这些列将允许为空,因为现有的记录将没有这些列的值。

REST API 影响

在一个新的微版本中,在以下 API 响应中公开 user_idproject_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_idproject_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_useraction_initiator_project 字段。

其他最终用户影响

更新 python-novaclient 以支持新的微版本(如果将来 python-openstackclient 增长了服务器迁移资源 CLI)。

性能影响

其他部署者影响

开发人员影响

升级影响

无。数据库中的新列将允许为空,迁移对象的字段也将允许为空,API 响应可以返回空值。不会添加数据迁移来填充现有迁移的值。

实现

负责人

主要负责人

张斌

功能联络人

功能联络人

mriedem

工作项

  • user_idproject_id 添加到 migrations 表和迁移版本对象。

  • 修改 API 以在公开迁移资源的 GET 响应中公开 user_idproject_id 字段。 此外,将 user_idproject_id 查询参数添加到 GET /os-migrations 以过滤结果。

  • 添加相关测试

  • 新微版本的文档。

依赖项

测试

  • 添加与负面场景相关的单元测试。

  • 添加相关的功能测试 (API 示例)。

此更改不需要 Tempest 测试。

文档影响

更新 API 参考以支持新的微版本。

参考资料

历史

修订版

发布名称

描述

Train

引入

Ussuri

重新提出