风味描述

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

在风味资源上暴露一个描述字段,以便操作员可以用用户可以理解的术语来描述风味,而无需依赖冗长的名称或用户需要理解额外的规格。

问题描述

管理员只能通过名称和 ID 字段来描述风味,通常希望避免在这些类型的字段中放置过多的细节,特别是对于定义使用该风味创建的实例行为的额外规格,例如,裸机节点,或在多超visor部署中的不同超visor的宿主机聚合。

用例

作为管理员,我希望为我的风味提供简单的名称,但详细描述每个风味有什么特别之处,尤其是在它具有额外的规格或某些限制时。

提议的变更

这相当简单,只需修改 flavors API,以便在创建或更新风味时允许指定描述字段,并在显示风味详细信息时返回描述。

Microversion 2.47 更改了服务器响应体中嵌入的风味的外观,显示完整的风味详细信息,而不仅仅是 id/link。尽管如此,我们不会在服务器响应体中包含嵌入的风味描述。

备选方案

使用名称或 ID 字段,它们都是字符串,但如问题描述中所述,这可能会变得混乱。

数据模型影响

一个新的可为空的 description TEXT 列将被添加到 API 数据库中的 flavors 表中,最大长度为 65535。

由于我们不会在此字段上进行索引或过滤,因此将其设为 TEXT(65536 字节)而不是 TINYTEXT(256 字节)字段并不是什么大问题。

注意

我们将风味序列化版本存储在 instance_extras 表中的实例记录中,并且这是一个 TEXT 列。由于我们不会在 API 中公开嵌入的实例风味描述,我们将从 instance_extras 表中存储的序列化版本中删除风味描述。

REST API 影响

以下所有更改都将在一个新的 microversion 中发生。

  • POST /flavors

    允许在创建风味时请求和响应中包含一个 description 字段。

    schema 将与 2.19 microversion 中 POST /servers 的描述字段中的 maxLength 将为 65535 相同。

    以下示例并不特别有趣,因为描述字段的真正价值在于描述风味的行为或限制,这在它具有与宿主机聚合关联的额外规格时更为重要,这发生在风味最初创建之后。

    请求示例

    {
      "flavor": {
          "name": "2vcpu-1024ram-10disk-baremetal-10gb",
          "description": "Baremetal flavor with 10GB network card.",
          "ram": 1024,
          "vcpus": 2,
          "disk": 10,
          "id": "f68c1474-4ba6-4291-bbdc-2c7865c0f33f"
      }
    }
    

    响应示例

    {
      "flavor": {
          "OS-FLV-DISABLED:disabled": false,
          "disk": 10,
          "OS-FLV-EXT-DATA:ephemeral": 0,
          "os-flavor-access:is_public": true,
          "id": "f68c1474-4ba6-4291-bbdc-2c7865c0f33f",
          "links": [
              {
                  "href": "http://openstack.example.com/v2/6f70656e737461636b20342065766572/flavors/f68c1474-4ba6-4291-bbdc-2c7865c0f33f",
                  "rel": "self"
              },
              {
                  "href": "http://openstack.example.com/6f70656e737461636b20342065766572/flavors/f68c1474-4ba6-4291-bbdc-2c7865c0f33f",
                  "rel": "bookmark"
              }
          ],
          "name": "2vcpu-1024ram-10disk-baremetal-10gb",
          "description": "Baremetal flavor with 10GB network card.",
          "ram": 1024,
          "swap": "",
          "rxtx_factor": 1.0,
          "vcpus": 2
      }
    }
    
  • GET /flavors, GET /flavors/detail 和 GET /flavors/{flavor_id}

    在获取风味详细信息时,在响应中添加一个必需的 description 字段。如果风味没有描述,将返回 None。

    GET /flavors 响应示例

    {
       "flavors": [
           {
              "id": "f68c1474-4ba6-4291-bbdc-2c7865c0f33f",
              "links": [
                  {
                      "href": "http://openstack.example.com/v2/6f70656e737461636b20342065766572/flavors/f68c1474-4ba6-4291-bbdc-2c7865c0f33f",
                      "rel": "self"
                  },
                  {
                      "href": "http://openstack.example.com/6f70656e737461636b20342065766572/flavors/f68c1474-4ba6-4291-bbdc-2c7865c0f33f",
                      "rel": "bookmark"
                  }
              ],
              "name": "2vcpu-1024ram-10disk-baremetal-10gb",
              "description": "Baremetal flavor with 10GB network card."
           }
       ]
     }
    

    GET /flavors/detail 响应示例

    {
      "flavors": [
          {
             "OS-FLV-DISABLED:disabled": false,
             "disk": 10,
             "OS-FLV-EXT-DATA:ephemeral": 0,
             "os-flavor-access:is_public": true,
             "id": "f68c1474-4ba6-4291-bbdc-2c7865c0f33f",
             "links": [
                 {
                     "href": "http://openstack.example.com/v2/6f70656e737461636b20342065766572/flavors/f68c1474-4ba6-4291-bbdc-2c7865c0f33f",
                     "rel": "self"
                 },
                 {
                     "href": "http://openstack.example.com/6f70656e737461636b20342065766572/flavors/f68c1474-4ba6-4291-bbdc-2c7865c0f33f",
                     "rel": "bookmark"
                 }
             ],
             "name": "2vcpu-1024ram-10disk-baremetal-10gb",
             "description": "Baremetal flavor with 10GB network card.",
             "ram": 1024,
             "swap": "",
             "rxtx_factor": 1.0,
             "vcpus": 2
          }
      ]
    }
    

    GET /flavors/{flavor_id} 响应示例

    {
      "flavor": {
          "OS-FLV-DISABLED:disabled": false,
          "disk": 10,
          "OS-FLV-EXT-DATA:ephemeral": 0,
          "os-flavor-access:is_public": true,
          "id": "f68c1474-4ba6-4291-bbdc-2c7865c0f33f",
          "links": [
              {
                  "href": "http://openstack.example.com/v2/6f70656e737461636b20342065766572/flavors/f68c1474-4ba6-4291-bbdc-2c7865c0f33f",
                  "rel": "self"
              },
              {
                  "href": "http://openstack.example.com/6f70656e737461636b20342065766572/flavors/f68c1474-4ba6-4291-bbdc-2c7865c0f33f",
                  "rel": "bookmark"
              }
          ],
          "name": "2vcpu-1024ram-10disk-baremetal-10gb",
          "description": "Baremetal flavor with 10GB network card.",
          "ram": 1024,
          "swap": "",
          "rxtx_factor": 1.0,
          "vcpus": 2
      }
    }
    
  • PUT /flavors/{flavor_id}

    添加一个 PUT API 来更新风味 description 字段。这对于现有的风味很有用,也适用于新的风味,因为必须在风味最初创建之后添加额外的规格,这可能会影响最终的描述。此外,风味额外的规格可能会发生变化,这可能会影响与宿主机聚合的调度行为,在这种情况下,描述也可能需要更新。

    请求和响应中都需要 description 字段。

    注意

    唯一可以更新的字段是 description 字段。Nova 历史上有意不包含更新风味的 API,因为这对于已经使用该风味创建的实例来说会令人困惑。更改风味的任何其他方面都需要删除和/或创建新的风味。

    请求示例

    {
      "flavor": {
          "description": "Baremetal flavor with 10GB network card."
      }
    }
    

    响应示例

    {
      "flavor": {
          "OS-FLV-DISABLED:disabled": false,
          "disk": 10,
          "OS-FLV-EXT-DATA:ephemeral": 0,
          "os-flavor-access:is_public": true,
          "id": "f68c1474-4ba6-4291-bbdc-2c7865c0f33f",
          "links": [
              {
                  "href": "http://openstack.example.com/v2/6f70656e737461636b20342065766572/flavors/f68c1474-4ba6-4291-bbdc-2c7865c0f33f",
                  "rel": "self"
              },
              {
                  "href": "http://openstack.example.com/6f70656e737461636b20342065766572/flavors/f68c1474-4ba6-4291-bbdc-2c7865c0f33f",
                  "rel": "bookmark"
              }
          ],
          "name": "2vcpu-1024ram-10disk-baremetal-10gb",
          "description": "Baremetal flavor with 10GB network card.",
          "ram": 1024,
          "swap": "",
          "rxtx_factor": 1.0,
          "vcpus": 2
      }
    }
    

安全影响

将为 PUT /flavors/{flavor_id} API 添加一个新的策略规则,并且默认设置为仅限管理员。

管理员希望将有关风味的任何细节保持在足够高的水平,以抽象其部署或拓扑的低级细节,从而避免泄露宿主机聚合的细节,但这并不是什么新鲜事。

通知影响

带有新可为空描述字段的 flavor.createflavor.updateflavor.delete 版本化通知将被更新。

其他最终用户影响

python-novaclient CLI 和 API 绑定将被更新,以允许创建、更新和显示带有描述字段的风味详细信息。

性能影响

其他部署者影响

开发人员影响

实现

负责人

主要负责人

Matt Riedemann <mriedem.os@gmail.com>

工作项

  • 更新 API 数据库模式,将可为空的 TEXT 描述列添加到 flavors 表中。

  • 将描述字段添加到 Flavor 版本化对象,并确保它未序列化并存储在 instance_extras.flavor 列中。

  • 为 REST API 添加一个 microversion,以创建、更新和显示带有描述的风味。

  • python-novaclient 的 CLI 和 API 绑定更改。

依赖项

测试

  • 负面场景的单元测试

    • 在新的 microversion 之前创建一个带有描述的风味。

    • 创建一个/更新一个描述过长的风味。

    • 在不指定描述的情况下更新风味。

    • 尝试在新的 microversion 之前更新风味描述。

    • 创建一个带有长度为 65535 的描述的风味,并使用它来创建一个实例,并确保嵌入的 instance.flavor 不包含 instance_extras 表中的描述。

    • 创建一个带有描述的风味,使用该风味创建一个服务器,从 API 获取服务器详细信息,并确保服务器响应体中不包含风味描述。

  • 新的 microversion 的功能 API 示例测试。

文档影响

将更新计算 REST API 参考以供新的 microversion 使用。

还将更新 flavors admin guide

参考资料

Queens PTG 讨论:https://etherpad.openstack.org/p/nova-ptg-queens

历史

修订版

发布名称

描述

Queens

引入