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 类。
任何其他看似相关的移动内容 :-)
依赖项¶
无
测试¶
由于预计这项工作不会有任何功能上的变化,因此现有的测试覆盖率应该足够。随着代码的移动,现有的单元测试需要进行一些重构,并且将在适当的时候编写更多的单元测试。
文档影响¶
无
参考资料¶
无