From 4a7a46fd8cb053c63455f07e83074578ad1ecb8f Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Tue, 11 Dec 2012 16:47:55 +0000 Subject: Add support for libvirt domain XML config Libvirt domains can have system metadata defined in a XML element. For the x86 platform with KVM guests, this can then be used to populate the SMBIOS data tables Acme Acme Wile Coyote c7a5fdbd-edaf-9455-926a-d65c16db1809 Change-Id: Ib4980ddc2f558921893a7e208e304ba59636e430 Signed-off-by: Daniel P. Berrange --- nova/tests/test_libvirt_config.py | 80 ++++++++++++++++++++++++++++++++++++ nova/virt/libvirt/config.py | 85 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 165 insertions(+) diff --git a/nova/tests/test_libvirt_config.py b/nova/tests/test_libvirt_config.py index c332ce7c3..f95d904c7 100644 --- a/nova/tests/test_libvirt_config.py +++ b/nova/tests/test_libvirt_config.py @@ -303,6 +303,74 @@ class LibvirtConfigGuestCPUTest(LibvirtConfigBaseTest): """) +class LibvirtConfigGuestSysinfoTest(LibvirtConfigBaseTest): + + def test_config_simple(self): + obj = config.LibvirtConfigGuestSysinfo() + + xml = obj.to_xml() + self.assertXmlEqual(xml, """ + + """) + + def test_config_bios(self): + obj = config.LibvirtConfigGuestSysinfo() + obj.bios_vendor = "Acme" + obj.bios_version = "6.6.6" + + xml = obj.to_xml() + self.assertXmlEqual(xml, """ + + + Acme + 6.6.6 + + + """) + + def test_config_system(self): + obj = config.LibvirtConfigGuestSysinfo() + obj.system_manufacturer = "Acme" + obj.system_product = "Wile Coyote" + obj.system_version = "6.6.6" + obj.system_serial = "123456" + obj.system_uuid = "c7a5fdbd-edaf-9455-926a-d65c16db1809" + + xml = obj.to_xml() + self.assertXmlEqual(xml, """ + + + Acme + Wile Coyote + 6.6.6 + 123456 + c7a5fdbd-edaf-9455-926a-d65c16db1809 + + + """) + + def test_config_mixed(self): + obj = config.LibvirtConfigGuestSysinfo() + obj.bios_vendor = "Acme" + obj.system_manufacturer = "Acme" + obj.system_product = "Wile Coyote" + obj.system_uuid = "c7a5fdbd-edaf-9455-926a-d65c16db1809" + + xml = obj.to_xml() + self.assertXmlEqual(xml, """ + + + Acme + + + Acme + Wile Coyote + c7a5fdbd-edaf-9455-926a-d65c16db1809 + + + """) + + class LibvirtConfigGuestDiskTest(LibvirtConfigBaseTest): def test_config_file(self): @@ -680,6 +748,10 @@ class LibvirtConfigGuestTest(LibvirtConfigBaseTest): obj.acpi = True obj.apic = True + obj.sysinfo = config.LibvirtConfigGuestSysinfo() + obj.sysinfo.bios_vendor = "Acme" + obj.sysinfo.system_version = "1.0.0" + disk = config.LibvirtConfigGuestDisk() disk.source_type = "file" disk.source_path = "/tmp/img" @@ -695,6 +767,14 @@ class LibvirtConfigGuestTest(LibvirtConfigBaseTest): demo 104857600 2 + + + Acme + + + 1.0.0 + + linux diff --git a/nova/virt/libvirt/config.py b/nova/virt/libvirt/config.py index 69864645c..dcf5aeb40 100644 --- a/nova/virt/libvirt/config.py +++ b/nova/virt/libvirt/config.py @@ -337,6 +337,86 @@ class LibvirtConfigGuestCPU(LibvirtConfigCPU): return cpu +class LibvirtConfigGuestSysinfo(LibvirtConfigObject): + + def __init__(self, **kwargs): + super(LibvirtConfigGuestSysinfo, self).__init__(root_name="sysinfo", + **kwargs) + + self.type = "smbios" + self.bios_vendor = None + self.bios_version = None + self.system_manufacturer = None + self.system_product = None + self.system_version = None + self.system_serial = None + self.system_uuid = None + + def format_dom(self): + sysinfo = super(LibvirtConfigGuestSysinfo, self).format_dom() + + sysinfo.set("type", self.type) + + bios = None + system = None + + if self.bios_vendor is not None: + if bios is None: + bios = etree.Element("bios") + info = etree.Element("entry", name="vendor") + info.text = self.bios_vendor + bios.append(info) + + if self.bios_version is not None: + if bios is None: + bios = etree.Element("bios") + info = etree.Element("entry", name="version") + info.text = self.bios_version + bios.append(info) + + if self.system_manufacturer is not None: + if system is None: + system = etree.Element("system") + info = etree.Element("entry", name="manufacturer") + info.text = self.system_manufacturer + system.append(info) + + if self.system_product is not None: + if system is None: + system = etree.Element("system") + info = etree.Element("entry", name="product") + info.text = self.system_product + system.append(info) + + if self.system_version is not None: + if system is None: + system = etree.Element("system") + info = etree.Element("entry", name="version") + info.text = self.system_version + system.append(info) + + if self.system_serial is not None: + if system is None: + system = etree.Element("system") + info = etree.Element("entry", name="serial") + info.text = self.system_serial + system.append(info) + + if self.system_uuid is not None: + if system is None: + system = etree.Element("system") + info = etree.Element("entry", name="uuid") + info.text = self.system_uuid + system.append(info) + + if bios is not None: + sysinfo.append(bios) + if system is not None: + sysinfo.append(system) + + return sysinfo + + class LibvirtConfigGuestDevice(LibvirtConfigObject): def __init__(self, **kwargs): @@ -589,6 +669,7 @@ class LibvirtConfigGuest(LibvirtConfigObject): self.acpi = False self.apic = False self.clock = None + self.sysinfo = None self.os_type = None self.os_loader = None self.os_kernel = None @@ -647,6 +728,10 @@ class LibvirtConfigGuest(LibvirtConfigObject): root.set("type", self.virt_type) self._format_basic_props(root) + + if self.sysinfo is not None: + root.append(self.sysinfo.format_dom()) + self._format_os(root) self._format_features(root) -- cgit