nova.network.linux_net 重构

https://blueprints.launchpad.net/nova/+spec/linux-net-refactor

负责 Nova 许多网络方面的 nova.network.linux_net 模块相当庞大,在代码维护和可移植性方面不够灵活,因此可以进行重构。

此外,提高 linux_net.py 模块的灵活性将是支持 FreeBSD 主机的重要一步,有关详细信息请参阅邮件列表讨论 [1]。

问题描述

目前,nova.network.linux_net 负责许多不同的事情

  • 网络接口管理(操作桥接、添加/删除接口等代码)

  • 防火墙/Iptables 管理

  • dnsmasq 管理

linux_net.py 文件几乎有 2k 行代码,这不算特别大,但可以更小。

其中一些部分是灵活的,允许覆盖类,例如 linuxnet_interface_driver。另一些部分则不然,例如 IptablesManager。即使对于允许覆盖的类,也有消费者直接使用它,例如 virt.libvirt.vif 直接使用 LinuxBridgeInterfaceDriver。

此外,有一些相对相似的块执行相同的功能,可以组合成函数,例如,LinuxBridgeInterfaceDriver 和 NeutronLinuxBridgeInterfaceDriver 使用几乎相同的代码来创建桥接。

通过重构 linux_net.py 模块,可以提高代码的可维护性、可读性和可移植性。

用例

从这项更改中受益的唯一受众是使用 linux_net.py 的开发人员以及正在寻找扩展 Nova 以使用新的接口管理、防火墙和相关机制的开发人员。

项目优先级

提议的变更

建议的方法是

目前 libvirt.vif 中 linux_net 的使用方式如下

  • 使用的方法如下:- create_tap_dev() - create_ovs_vif_port() - create_ivs_vif_port() - device_exists() - delete_net_dev()

  • linux_net.LinuxBridgeInterfaceDriver 方法的使用:- ensure_vlan_bridge() - ensure_bridge()

可以注意到这个接口相当复杂,实际上它同时负责两件事

  • 提供 Nova 网络 API 逻辑

  • 提供 OS 级别网络设备管理的辅助工具

为了使其更具可移植性,建议将 OS 级别辅助工具分离到其自身的实体中,并允许为特定平台使用自定义实现。

例如,它将如下所示

"""
nova.network.netdev module
"""

def get_driver():
    "Method returning platfrom specific implementation"
    if our_os == "Linux":
        return LinuxNetDevDriver
    else
        # not implemented

# network device helpers
def create_bridge(brname):
    return get_driver().create_bridge(brname)

# other methods go here

"""
nova.network.netdev.driver
"""

class NetDevDriver(object):
    """A class that defines an interface for
    OS-level network device manipulation"""

    def create_bridge(self, brname):
        raise NotImplementedError

    # other methods go here


"""
nova.netowrk.netdev.linux
"""

class LinuxNetDevDriver(NetDevDriver):
    """A class that implements NetDevDriver
    interface for Linux"""

    def create_bridge(self, brname):
        # Linux impl goes here

    # other methods

计划是

  • 将 linux_net 中的辅助函数移动到 netdev

  • 将这些辅助函数的消费者从 linux_net 转换为使用新的 netdev 辅助工具

  • 删除 linux_net 中旧的辅助工具实现

  • 将 Iptables 相关类移动到其自身的模块 firewall,并允许覆盖为实际使用的类,以便可以使用其他防火墙软件包

  • 将 dnsmasq 相关代码移动到其自身的模块 dhcp

备选方案

数据模型影响

REST API 影响

安全影响

通知影响

其他最终用户影响

性能影响

其他部署者影响

由于将引入允许指定要使用的防火墙类的选项,部署者将能够集成第三方防火墙软件包。由于此选项将默认设置为 IptablesManager,因此当前部署不会发生任何更改。

开发人员影响

开发人员将拥有更具可读性、可维护性和可扩展性的 linux_net.py

实现

负责人

主要负责人

novel

工作项

  • 重构接口管理代码

  • 分离防火墙代码

  • 分离 dnsmasq 管理代码

依赖项

测试

将相应地更新单元测试。

文档影响

参考资料

[1]: http://lists.openstack.org/pipermail/openstack-dev/2015-June/066342.html

历史

修订版

发布名称

描述

Liberty

引入