支持 manila 中的 IPv6 访问

https://blueprints.launchpad.net/manila/+spec/support-ipv6-access

问题描述

目前 IP 访问规则类型仅支持 IPv4。有效的格式为 xxx.xxx.xxx.xxx 或 xxx.xxx.xxx.xxx/xx。当用户希望在 manila 中启用 IPv6 时,这还不够。受影响最大的领域是 API(访问规则)和驱动程序(访问规则 & 导出位置)。

用例

拥有 IPv6 接口的最终用户也希望访问他们的共享,而 manila 当前仅在基于 IP 的访问时支持 IPv4 协议。

提议的变更

  • 支持访问规则中的 IPv6

正如 manila 社区在 IRC 会议(主题 IPv6)[1] 中同意的那样,manila 可以通过为 IP 访问规则类型添加 IPv6 格式验证来解决此需求。将验证方法从我们自己的函数 (_validate_ip_range) 更改为标准模块 ‘ipaddress’(同时支持 IPv4 和 IPv6)。

使用 ipaddress 模块,以下 IPv6 格式都被认为是可接受的

2001:0DB8:02de:0000:0000:0000:0000:0e13   #uncompressed
2001:DB8:2de:0:0:0:0:0e13                 #leading zeros removed
2001:DB8:2de::0e13                #consecutive sections of zeroes omitted
2001:dB8:2De::0E13                #mixed case
2001:dB8::/32                     #network range

manila 会将所有这些转换为小写和压缩格式,这意味着第一个示例的结果将类似于(这也是 RFC5952 [2] 中推荐的规范格式)

2001:db8:2de::e13
  • 支持网络插件中的 IPv6

独立网络插件和 neutron 网络插件(nova 网络插件将被忽略,因为它们正在被弃用)需要进行修改以支持 IPv6。

  1. 网络插件将添加新的布尔型配置选项 ‘network_plugin _ipv4_enabled’ 和 ‘network_plugin_ipv6_enabled’ 来指示其启用的 IP 版本。默认值分别为 ‘True’ 和 ‘False’。最终我们将支持单个网络插件同时启用 IPv4 和 IPv6,但对于 Ocata 阶段,为了限制在当前的 manila 网络插件架构下,只能配置一个选项为 True(IPv4 或 IPv6)。我们还将弃用 ‘standalone_network_plugin_ip _version’,它将等效于 ‘network_plugin_ipv6_enabled=True’ 和 ‘network_plugin_ipv4_enabled=False’,反之亦然。

  2. 网络插件应更新为根据其 IP 版本配置分配网络资源(用户网络和管理网络)。例如,neutron 网络插件仅在 ‘network_plugin_ipv6_enabled = True’ 时才会分配 IPv6 端口。如果未找到具有配置或指定的网络资源的合适资源,则分配过程将因异常而失败。

  • 支持驱动程序中的 IPv6

由于不同驱动程序中导出位置支持的状态各不相同,manila 将引入两个 extra_specs(和驱动程序功能)‘ipv4_support’、‘ipv6_support’,以便后端和用户易于支持和配置。

  1. 为共享类型添加新的可选布尔型 extra_specs ‘ipv4_support’、‘ipv6_support’,指示所需的 IP 版本(省略任一 extra_spec 表示“不关心”该功能的匹配)。

  2. 驱动程序必须使用它们可以支持的 IP 版本报告功能,功能格式与 extra_specs 相同。驱动程序应该考虑两种情况:- DHSS=false,驱动程序仅在实际配置了 IPv4 导出位置时才报告 IPv4 为 True,并且仅在实际配置为支持 IPv6 导出位置时才报告 IPv6 为 True。 - DHSS=true,驱动程序仅在驱动程序和配置的网络插件(用户和管理网络)都具有 IPv4 功能时才报告 IPv4 为 True,IPv6 也是如此。

  3. manila 调度程序将在涉及 IP 版本 extra_specs 时选择具有功能过滤器的正确后端。

  4. 驱动程序必须根据其 IP 版本功能返回导出位置,并且仅允许主机地址出现在导出位置中,不允许主机名。

备选方案

数据模型影响

REST API 影响

此 API 微版本需要更新。

  • allow_access 操作中支持 IPv6 地址和 IPv6 网络。

驱动程序影响

将更新驱动程序,以便使用 IPv4 地址的现有驱动程序将报告 ipv4_support=True。当驱动程序同时支持 IPv4 和 IPv6 时,它们需要根据其功能和存储后端的配置报告其支持版本。 此外,以下函数可能需要更改

  • _update_share_stats

  • create_share

  • delete_share

  • create_share_from_snapshot

  • update_access

  • setup_server

  • manage_existing

  • create_replica

  • promote_replica

  • migration_start

  • migration_complete

  • create_consistency_group

  • create_consistency_group_from_cgsnapshot

此外,驱动程序必须将位置作为地址而不是主机名导出,因为地址是特定的 IPv4 或 IPv6,而主机名可以在任何特定时间解析为 IPv4 或 IPv6 地址。

安全影响

通知影响

其他最终用户影响

  • python-manilaclient 将更改以反映 IP 访问类型验证方法的变化。

    支持 IPv6 的 access-allow 命令将如下所示

    manila access-allow test_share ip "AD80:0:0:0:ABAA:0:C2:2"
    
  • manila-ui 将进行相应的 UI 更改,以处理 IP 访问规则类型有效值。

性能影响

其他部署者影响

部署者必须确保其 IP 版本偏好反映在存储后端上,以便数据接口具有所需的 IPv4 和 IPv6 地址。

开发人员影响

驱动程序接口的更改如上所述。第三方后端将实施这些更改,并在其驱动程序中启用 IPv6(如果他们希望启用 IPv6)时报告其 IPv6 功能(支持矩阵可以在这里找到 [3])。

实现

负责人

主要负责人

工作项

  • 实现核心功能

  • 报告现有 IPv4 驱动程序的 ipv4_support=True 功能

  • 在网络插件中实现 IPv6。

  • 在通用、华为和虚拟驱动程序中实现 IPv6 ACL

  • 实现 tempest 测试

  • 实现场景测试

  • 实现 manila-ui 支持

  • 实现 python-manilaclient 支持

  • 更新 manila API 文档

  • 更新 manila 指南文档中的 IPv6 相关内容

依赖项

测试

  • 单元测试

  • 功能测试

  • Tempest 测试

文档影响

  • 更新用户指南

  • 更新 manila API 文档

  • 更新 manila 开发人员文档中的 IPv6 相关内容

参考资料

[1] http://eavesdrop.openstack.org/meetings/manila/2016/manila.2016-08-25-15.00.log.html [2] https://tools.ietf.org/html/rfc5952#section-4 [3] https://docs.openstack.org/developer/manila/devref/share_back_ends_feature_support_mapping.html