端口扩展,用于创建硬件卸载端口

Launchpad bug: https://bugs.launchpad.net/neutron/+bug/2013228

RFE 的目标是创建一个新的端口扩展,以允许创建具有硬件卸载功能的端口。

问题描述

RFE [1] 引入了创建可以使用 Open vSwitch 中实现的硬件卸载支持的端口的功能 [2]。此功能在以下补丁集中实现(最初针对 ML2/OVS):[3][4][5]

为了创建具有硬件卸载功能的端口,需要定义 VNIC 类型并在端口绑定配置文件中设置一个特定值

openstack port create --vnic-type direct \
    --binding-profile '{"capabilities": ["switchdev"]}' port_hwol

这种创建端口的方法存在一些缺点

  • 端口绑定配置文件字段默认情况下是仅管理员参数。此字段中包含的值可能引用主机的 PCI 地址,不应由非管理员用户修改。

  • 实际上,此参数不应由 Neutron 写入,而应仅在端口绑定时由 Nova 写入。

提议的变更

此 RFE 建议创建一个新的端口扩展,名为“port-hardware-offload”,它将取代在创建端口时手动定义端口绑定配置文件信息的需要;请注意,这仅指端口创建过程。此 API 扩展由一个字符串参数组成,默认值为“None”。此字符串将是硬件卸载类型;OpenStack Neutron 和 Nova 当前仅支持“switchdev” [6]。API 允许的字符串将限制为一组定义的常量。

此新的字符串参数将与端口信息字典一起传递给 Nova。Nova 将使用此参数而不是端口绑定配置文件信息来命令 os-vif 创建相应的 Layer 1 端口(devlink 端口 [3] [7])。

由于这种 Nova-Neutron 通信,此 RFE 将分两个步骤实现

  • 第一步将仅实现 Neutron 和 OSC(以及 OpenstackSDK 位)代码。传递给 Nova 的端口字典将包含此 RFE 添加的新参数以及端口绑定配置文件,当新参数不为“None”时,Neutron 会在内部添加端口绑定配置文件。

  • 第二步涉及 Nova 的实现。此更改意味着 Nova 可以读取端口新参数并创建相应的端口。Neutron 传递的端口绑定配置文件信息将不再相关。

注意

如在 Neutron 驱动程序会议上展示此新功能时讨论的那样,此 RFE 的范围仅涉及第一步。Nova 代码更改将在其他 RFE 和规范中涵盖。

客户端影响

OSC 和 OpenstackSDK 项目将更新,以便能够使用此新扩展创建端口。端口创建示例

openstack port create --vnic-type direct \
    --hardware-offload-type switchdev port_hwol

当显示端口资源时,新的字符串字段将可见。

此规范不涵盖 Nova 从读取端口绑定配置文件到使用端口定义中新参数提供程序的迁移。如第一节所述,只要在端口创建命令中提供了“hardware-offload-type”,Neutron 仍将填充端口绑定配置文件。为了阻止用户使用旧方法创建端口,OSC 将检查端口绑定配置文件中是否提供了“capabilities”键,并在命令行中打印警告,鼓励用户使用“hardware-offload-type”参数创建端口。

REST API 影响

拟议属性

RESOURCE_ATTRIBUTE_MAP = {
    port.COLLECTION_NAME: {
        "hardware_offload_type": {
            'allow_post': True,
            'allow_put': False,
            'convert_to': converters.convert_to_string,
            'default': None,
            'is_visible': True,
            'is_filter': True,
            'validate': {
                'type:values': constants.VALID_HWOL_TYPES}
        }
    }
}

示例 REST 调用

POST /v2.0/ports
{
    "port": {
       ...
       "hardware_offload_type": "switchdev"
}

Response:
{
    "port": {
        "id": "<id>",
        ...
        "hardware_offload_type": "switchdev"
    }
}

数据模型影响

此 RFE 建议在 ports 中创建一个子表,名为 port_hardware_offload

端口硬件卸载

属性

类型

CRUD

描述

port_id

uuid-str

CR

端口对象的唯一标识符

hardware_offload_type

str

CR

指示硬件卸载类型的字符串

安全影响

默认情况下,此新字段将仅由管理员可写。但是,管理员可以考虑更改规则所有者,并允许任何项目用户创建定义此参数的端口

policy.DocumentedRuleDefault(
    name='create_port:hardware_offload_type',
    check_str=base.ADMIN,
    scope_types=['project'],
    operations=ACTION_POST
)

由于问题描述中提供的理由,完全不建议对规则“create_port:binding:profile”进行此规则更改。

性能影响

在构建端口 OVO 时,端口资源视图现在需要 ports 表和 ports_hardware_offload 表之间的新“JOIN”操作。但是,这两个表之间存在 1:1 的关系,并且从子表检索的数据最少(两列)。

其他影响

无。

实现

负责人

主要负责人

Rodolfo Alonso Hernandez <ralonsoh@redhat.com> (IRC: ralonsoh)

工作项

  • API 实现(neutron-lib 和 Neutron)。

  • 数据库迁移(Neutron)

  • CLI 实现(OpenstackSDK 和 OSC)

  • 文档。

  • 测试和 CI 相关更改。

测试

  • 单元/功能测试。

  • 全栈 API 测试。

文档影响

用户文档

记录创建硬件卸载端口的新方法并弃用旧方法。

参考资料