风味描述¶
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.create、flavor.update 和 flavor.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 |
引入 |