Libvirt驱动类重构

https://blueprints.launchpad.net/nova/+spec/libvirt-driver-class-refactor

libvirt driver.py 类正在变得越来越大和复杂。该类与其他 libvirt 类之间存在循环依赖。这项工作旨在将一些功能拆分到新的类中

问题描述

libvirt driver.py 类随着时间的推移变得越来越大。这增加了代码的复杂性,并导致更大的测试套件。

driver.py 类承担着许多不同的用例。主要它是计算管理器类使用的接口。然而,它还包含许多用于处理 libvirt 连接和主机操作系统以及处理来宾实例配置的辅助 API。许多这些辅助程序被其他 libvirt 模块(例如 vif、volume 和 image 后端驱动程序)需要。这导致 driver.py 和其他 libvirt 模块之间存在循环依赖。例如,LibvirtDriver 使用 NWFilterFirewall,但还需要传递一个“get_connection”回调,以便 NWFilterFirewall 可以从 LibvirtDriver 类获取 libvirt 连接。还有许多类似的依赖关系。

提议的变更

计划在代码库中引入两个新模块

  • host.py - 此模块将封装对 libvirt 和主机操作系统状态的访问。它将包含一个“Host”类,该类管理单个 libvirt 连接。它将包含连接到 libvirt、获取域列表、查询主机性能指标等方法(有关具体内容,请参见 work-items 部分)。这与现有的 HostState 类不同,后者只是驱动程序“host_state”方法的简单辅助程序。

  • guest.py - 此模块将封装与 libvirt 来宾域实例的交互。它将包含一个“Guest”类,该类管理单个 libvirt 来宾域。它将包含所有用于在实例启动期间构建来宾 XML 配置的方法,这些方法当前位于 driver.py 中

host.py 和 guest.py 的代码将从现有的 driver.py 类中提取出来。其他 libvirt 模块将根据需要更新以访问新的 API。为了最大程度地降低创建回归的风险,对正在移动的方法的更改将最小化,仅在适当的情况下进行细微的重命名和修复。

预期的最终结果是,libvirt 驱动程序目录中的任何模块都不需要访问 driver.py 文件。它们应该能够使用 host.py 和 guest.py API,从而打破循环依赖。例如,NWFilterFirewall 类可以获得 Host 类的一个实例,而不是回调到 LibvirtDriver 类。

新的结构还应减小 test_driver.py 文件的大小,并能够为 host.py 和 guest.py 中的功能创建更简单、自包含的测试,因为它将与整体 virt 驱动程序 API 分离。

预计不会移动任何配置参数。高级目标是新的 API 不会直接使用任何 Nova 配置参数。相反,LibvirtDriver 将负责读取配置参数,然后设置新类的属性或在适当的情况下传递方法参数。

在工作结束时,libvirt 驱动程序不应有任何功能上的变化。这旨在纯粹是重构工作,对于编写 libvirt 驱动程序代码的人来说是不可见的。

备选方案

什么都不做始终是一个选择,但它并不吸引人,因为它会给我们留下一个不断增长的怪物,随时准备吞噬我们。

数据模型影响

REST API 影响

安全影响

通知影响

其他最终用户影响

性能影响

其他部署者影响

开发人员影响

任何对 driver.py 或 test_driver.py 有补丁的开发人员都可能存在冲突

实现

负责人

主要负责人

berrange

工作项

  • 创建一个 host.py 模块,并将基本的连接处理代码从 driver.py 移动到新的 Host 类中。这将涵盖以下方法

    • _conn_has_min_version

    • _has_min_version

    • _native_thread

    • _dispatch_thread

    • _event_lifecycle_callback

    • _queue_Event

    • _dispatch_events

    • _init_events_pipe

    • _init_events

    • _get_new_connection

    • _close_callback

    • _test_connection

    • _connect

  • 将 HostState 使用的辅助程序移动到 Host 类中。这将涵盖以下方法

    • _get_vcpu_total

    • _get_memory_mb_total

    • _get_vcpu_used

    • _get_memory_mb_used

    • _get_hypervisor_type

    • _get_hypervisor_version

    • _get_hypervisor_hostname

    • _get_cpu_info

    • _get_disk_available_least

  • 创建一个 guest.py 模块,并将创建来宾 XML 配置的代码从 driver.py 移动到新的 Guest 类中。这将涵盖以下方法

    • _get_guest_cpu_model_config

    • _get_guest_cpu_config

    • _get_guest_disk_config

    • _get_guest_storage_config

    • _get_guest_config_sysinfo

    • _get_guest_pci_device

    • _get_guest_config

    • _get_guest_xml

  • 将列出域的代码移动到新的 Host 类中。这将涵盖“_list_instance_domains”方法。

  • 更改 NWFilterFirewall 和 LibvirtBaseVIFDriver,使其接受“Host”对象实例,而不是需要回调到 LibvirtDriver 类。

  • 任何其他看似相关的移动内容 :-)

依赖项

测试

由于预计这项工作不会有任何功能上的变化,因此现有的测试覆盖率应该足够。随着代码的移动,现有的单元测试需要进行一些重构,并且将在适当的时候编写更多的单元测试。

文档影响

参考资料