实例风味 REST API

https://blueprints.launchpad.net/nova/+spec/instance-flavor-api

替换现有 flavor 属性在 server 表示中的方式,以包含存储与实例一起的大部分风味信息,而不是当前的风味 ID 和链接。

问题描述

我们的 server 资源 REST 表示包含指向用于创建该服务器的其他资源(风味和镜像)的链接。这些链接指向全局 REST 表示 /v2.1/flavor/{id}

但是,风味可能会被删除,因此该资源可能不再可用。此外,风味 extra_specs 可能会被修改,因此当前的 extra_specs 可能不再代表用于启动实例的内容。

在 Nova 内部,我们在首次创建实例时将风味信息与实例一起存储,以防止此类删除/修改。

为了向用户提供相同的保证,我们应该在所有服务器表示中输出风味信息。

用例

作为用户,我希望始终能够从 API 获取有关实例内存、已分配磁盘、风味 extra_specs 和其他元数据的信息。

提议的变更

提出一个新的微版本,它修改了以下调用

GET /v2.1/servers/detail
GET /v2.1/servers/{server_id}
POST /v2.1/servers/{server_id}/action (rebuild action)
PUT /v2.1/servers/{server_id}

在所有情况下,现有的 flavor 属性值将被一个字典替换,该字典包含显示风味时可见的大部分信息,其中包含一个嵌套字典用于 extra_specs。

以下字段将从风味响应中删除

  • links - 作为子资源,持久链接似乎不太重要

  • id - 我们选择不暴露风味 ID,因为它可能已过期

  • os-flavor-access:is_public - 不相关,这仅限于实例范围

  • OS-FLV-DISABLED:disabled - 不相关,这仅限于实例范围

  • rxtx_factor - 仅对 nova-networks 有用,并且在不久的将来将被弃用/删除

在任何情况下,如果风味信息具有奇特的键,因为被认为是扩展,我们将规范化这些键。例如 OS-FLV-EXT-DATA:ephemeral 将变为 ephemeral

最后,风味 name 字段将显示在 original_name 键下。它很可能已过期,但确定对最终用户有用。

服务器资源中风味数据的可见性将由与显示风味详细信息时用于显示风味 extra_specs 相同的策略规则控制。

备选方案

  • 不允许删除正在使用的风味或删除/修改正在使用的风味 extra_specs。这会影响 Cells v2,我们希望避免这种情况。

  • 添加一个新的风味子资源,如本规范的原始版本所述。

数据模型影响

无。

REST API 影响

  • URLs

    • /v2.1/servers/{server_id}

  • 请求方法

    • GET

    • PUT

  • 原始 JSON 响应

    {
        "server": {
            "flavor": {
                "id": "1860e252-6851-439b-95f9-873b8d5f880d",
                "links": [
                    {
                        "href": "http://192.168.204.2:18774/9d4087df61314635a096a86a28aac6f8/flavors/1860e252-6851-439b-95f9-873b8d5f880d",
                        "rel": "bookmark"
                    }
                ]
            },
            <other stuff>
        }
    }
    
  • 提议的 JSON 响应

    {
        "server": {
            "flavor": {
                "disk": 1,
                "ephemeral": 0,
                "ram": 512,
                "swap": "",
                "vcpus": 1,
                "original_name": "m1.small",
                "extra_specs": {
                    "hw:cpu_model": "SandyBridge",
                    "hw:mem_page_size": "2048",
                    "hw:cpu_policy": "dedicated"
                }
            },
            <other stuff>
        }
    }
    
  • URL

  • /v2.1/servers/detail

  • 请求方法

    • GET

  • 原始 JSON 响应

    {
        "servers": [
            {
                "flavor": {
                    "id": "1860e252-6851-439b-95f9-873b8d5f880d",
                    "links": [
                        {
                            "href": "http://192.168.204.2:18774/9d4087df61314635a096a86a28aac6f8/flavors/1860e252-6851-439b-95f9-873b8d5f880d",
                            "rel": "bookmark"
                        }
                    ]
                },
                <other stuff>
            }
        ]
    }
    
  • 提议的 JSON 响应

    {
        "servers": [
            {
                "flavor": {
                    "disk": 1,
                    "ephemeral": 0,
                    "ram": 512,
                    "swap": "",
                    "vcpus": 1,
                    "original_name": "m1.small",
                    "extra_specs": {
                        "hw:cpu_model": "SandyBridge",
                        "hw:mem_page_size": "2048",
                        "hw:cpu_policy": "dedicated"
                    }
                },
                <other stuff>
            }
        ]
    }
    
  • URL

  • /v2.1/servers/{server_id}/action (重建操作)

  • 请求方法

    • POST

  • 原始 JSON 响应

    {
        "server": {
            "flavor": {
                "id": "1860e252-6851-439b-95f9-873b8d5f880d",
                "links": [
                    {
                        "href": "http://192.168.204.2:18774/9d4087df61314635a096a86a28aac6f8/flavors/1860e252-6851-439b-95f9-873b8d5f880d",
                        "rel": "bookmark"
                    }
                ]
            },
            <other stuff>
        }
    }
    
  • 提议的 JSON 响应

    {
        "server": {
            "flavor": {
                "disk": 1,
                "ephemeral": 0,
                "ram": 512,
                "swap": "",
                "vcpus": 1,
                "original_name": "m1.small",
                "extra_specs": {
                    "hw:cpu_model": "SandyBridge",
                    "hw:mem_page_size": "2048",
                    "hw:cpu_policy": "dedicated"
                }
            },
            <other stuff>
        }
    }
    

安全影响

无。

通知影响

无。

其他最终用户影响

无。

性能影响

无。

其他部署者影响

无。

开发人员影响

任何当前使用风味信息的人可能需要调整到这种新模型。

实现

负责人

主要负责人

Chris Friesen (cfriesen)

工作项

  • 将微版本更改添加到 提议的更改 部分中概述的 API 中。

  • 单元测试和功能 api-samples 测试。

  • Tempest 更改用于微版本服务器响应模式更改。

依赖项

测试

测试将在树中进行,包括示例/功能测试。

Tempest 很可能需要更新,以调整 服务器响应验证模式 以适应新的微版本。

文档影响

需要更新 API 文档。

参考资料

最初的方法是使用新的子资源。最近,一次 IRC 讨论重新提出了这个概念,但达成共识是直接将信息嵌入到服务器表示中。

IRC 聊天的日志可在以下网址查看:http://eavesdrop.openstack.org/irclogs/%23openstack-nova/%23openstack-nova.2017-02-09.log.html

这也在 Pike PTG 上讨论过:http://lists.openstack.org/pipermail/openstack-dev/2017-March/113171.html