修复标签属性消失

https://blueprints.launchpad.net/nova/+spec/fix-tag-attribute-disappearing

在实例启动时虚拟设备角色标签的上下文中,一个错误 [1] 导致从 2.33 版本开始,block_device_mapping_v2 的标签属性不再被接受,从 2.37 版本开始,networks 的标签属性也不再被接受。换句话说,块设备只能在 2.32 版本中被标记,网络接口只能在 2.32 和 2.36 版本之间(包括 2.32 和 2.36)被标记。本规范引入一个新的 API 微版本,将标签属性重新添加到 block_device_mapping_v2 和 networks 中。

问题描述

对于 block_device_mapping_v2,问题源于 [2] 中的相等比较的使用。它导致 Nova API 仅在微版本 2.32 中接受标签属性。当然,意图是在 2.32 或更高版本中支持标签,但实现上的错误被作者、审查者和测试遗漏了。

在 networks 的情况下,微版本 2.37 为实例启动请求体中的 network 项目引入了一个新的选项 [3]。除了先前允许的包含 port、uuid 或 fixed_ip 中的一个的字典之外,一个新的字符串选项 - 要么 ‘auto’ 或 ‘none’ - 也被接受。在编写此更改的模式时,必须复制并包含以前的模式作为这两个选项之一。正是这种复制引入了错误:标签项目没有与模式的其余部分一起复制。

用例

作为最终用户,我希望块设备角色标签能够在微版本 2.32 之后继续工作。

作为最终用户,我希望网络接口角色标签能够在微版本 2.37 之后继续工作。

提议的变更

本规范建议在 api-ref 和 reno 中记录此错误,同时在新的 API 微版本中将标签属性重新添加到 block_device_mapping_v2 和 networks 中。

为了防止未来出现同类错误,微版本将作为 APIVersionRequest 对象传递给扩展,并且 APIVersionRequest 的 __eq__ 运算符将被移除。这将阻止未来的代码进行版本相等比较。

原始错误被遗漏的原因之一是功能测试仅在它们所关注的特定微版本上运行。也就是说,2.32 的测试仅针对 2.32 运行。虽然让每个新微版本的测试类都从先前微版本的测试类继承(例如,ServersSampleJson232Test 继承自 ServersSampleJson231Test)是浪费的,但本规范建议将所有 API 示例测试都针对 2.latest 运行。这将确保在微版本时间线上的任何单个点上都不会发生意外破坏。

备选方案

由于需要将标签属性重新引入 API,根据 Nova 项目策略,需要一个新的微版本。因此没有其他选择。

数据模型影响

无。

REST API 影响

本规范仅影响 POST /servers 方法的主体。标签属性被重新添加到 networks 和 block_device_mapping_v2 项目中。

Networks 示例

{
    "server": {
        "name": "nic-tagging",
        "imageRef": "70a599e0-31e7-49b7-b260-868f441e862b",
        "flavorRef": "http://openstack.example.com/flavors/1",
        "networks": {
            "uuid": "a0ef4e02-9150-418c-b4cf-cf4a86e92bf1",
            "tag": "nic1"
        }
    }
}

Block device mapping 示例

{
    "server": {
        "name": "nic-tagging",
        "imageRef": "70a599e0-31e7-49b7-b260-868f441e862b",
        "flavorRef": "http://openstack.example.com/flavors/1",
        "block_device_mapping_v2": [{
            "boot_index": "0",
            "uuid": "ac408821-c95a-448f-9292-73986c790911",
            "source_type": "image",
            "volume_size": "25",
            "destination_type": "volume",
            "delete_on_termination": true,
            "tag": "disk1"
        }]
    }
}

安全影响

无。

通知影响

无。

其他最终用户影响

Python-novaclient 将更新以适应 2.33 和 2.37 中标签属性的消失。它也将更新以使用重新引入标签属性的新微版本。

性能影响

无。

其他部署者影响

无。

开发人员影响

无。

实现

负责人

主要负责人

Artom Lifshitz (notartom)

其他贡献者

工作项

  • 实现一个新的 API 微版本,将标签属性重新引入到 networks 和 block_device_mapping_v2 中。

  • 调用扩展时,将版本作为 APIVersionRequest 对象传递,而不是字符串。

  • 将所有 API 示例测试都针对 2.latest 运行,除非 API 功能已被移除。

依赖项

无。

测试

将为新的 API 微版本添加一个功能测试。现有的 Tempest 测试 [4] 将被修改为测试 2.32 和重新引入标签属性的新微版本。

文档影响

API 参考将更新以记录错误以及新的 API 微版本。发布说明也将这样做。

参考资料

历史

修订

发布名称

描述

Ocata

引入