Merge "Support setting a machine type to enable ARMv7/AArch64 guests to boot"
This commit is contained in:
@@ -1417,6 +1417,77 @@ class LibvirtConnTestCase(test.TestCase):
|
||||
image_meta, disk_info)
|
||||
self.assertEqual(cfg.os_cmdline, "fake_os_command_line")
|
||||
|
||||
def test_get_guest_config_armv7(self):
|
||||
def get_host_capabilities_stub(self):
|
||||
cpu = vconfig.LibvirtConfigGuestCPU()
|
||||
cpu.arch = "armv7l"
|
||||
|
||||
caps = vconfig.LibvirtConfigCaps()
|
||||
caps.host = vconfig.LibvirtConfigCapsHost()
|
||||
caps.host.cpu = cpu
|
||||
return caps
|
||||
|
||||
self.flags(virt_type="kvm",
|
||||
group="libvirt")
|
||||
|
||||
instance_ref = db.instance_create(self.context, self.test_instance)
|
||||
disk_info = blockinfo.get_disk_info(CONF.libvirt.virt_type,
|
||||
instance_ref)
|
||||
|
||||
self.stubs.Set(libvirt_driver.LibvirtDriver,
|
||||
"get_host_capabilities",
|
||||
get_host_capabilities_stub)
|
||||
|
||||
conn = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), True)
|
||||
cfg = conn.get_guest_config(instance_ref,
|
||||
_fake_network_info(self.stubs, 1),
|
||||
None, disk_info)
|
||||
self.assertEqual(cfg.os_mach_type, "vexpress-a15")
|
||||
|
||||
def test_get_guest_config_aarch64(self):
|
||||
def get_host_capabilities_stub(self):
|
||||
cpu = vconfig.LibvirtConfigGuestCPU()
|
||||
cpu.arch = "aarch64"
|
||||
|
||||
caps = vconfig.LibvirtConfigCaps()
|
||||
caps.host = vconfig.LibvirtConfigCapsHost()
|
||||
caps.host.cpu = cpu
|
||||
return caps
|
||||
|
||||
self.flags(virt_type="kvm",
|
||||
group="libvirt")
|
||||
|
||||
instance_ref = db.instance_create(self.context, self.test_instance)
|
||||
disk_info = blockinfo.get_disk_info(CONF.libvirt.virt_type,
|
||||
instance_ref)
|
||||
|
||||
self.stubs.Set(libvirt_driver.LibvirtDriver,
|
||||
"get_host_capabilities",
|
||||
get_host_capabilities_stub)
|
||||
|
||||
conn = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), True)
|
||||
cfg = conn.get_guest_config(instance_ref,
|
||||
_fake_network_info(self.stubs, 1),
|
||||
None, disk_info)
|
||||
self.assertEqual(cfg.os_mach_type, "virt")
|
||||
|
||||
def test_get_guest_config_machine_type_through_image_meta(self):
|
||||
self.flags(virt_type="kvm",
|
||||
group='libvirt')
|
||||
|
||||
conn = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), True)
|
||||
instance_ref = db.instance_create(self.context, self.test_instance)
|
||||
|
||||
disk_info = blockinfo.get_disk_info(CONF.libvirt.virt_type,
|
||||
instance_ref)
|
||||
|
||||
image_meta = {"properties": {"hw_machine_type":
|
||||
"fake_machine_type"}}
|
||||
cfg = conn.get_guest_config(instance_ref,
|
||||
_fake_network_info(self.stubs, 1),
|
||||
image_meta, disk_info)
|
||||
self.assertEqual(cfg.os_mach_type, "fake_machine_type")
|
||||
|
||||
def _test_get_guest_config_ppc64(self, device_index):
|
||||
"""Test for nova.virt.libvirt.driver.LibvirtDriver.get_guest_config.
|
||||
"""
|
||||
|
||||
@@ -1148,6 +1148,28 @@ class LibvirtConfigGuestTest(LibvirtConfigBaseTest):
|
||||
</devices>
|
||||
</domain>""")
|
||||
|
||||
def test_config_machine_type(self):
|
||||
obj = config.LibvirtConfigGuest()
|
||||
obj.virt_type = "kvm"
|
||||
obj.memory = 100 * units.Mi
|
||||
obj.vcpus = 2
|
||||
obj.name = "demo"
|
||||
obj.uuid = "b38a3f43-4be2-4046-897f-b67c2f5e0147"
|
||||
obj.os_type = "hvm"
|
||||
obj.os_mach_type = "fake_machine_type"
|
||||
xml = obj.to_xml()
|
||||
|
||||
self.assertXmlEqual(xml, """
|
||||
<domain type="kvm">
|
||||
<uuid>b38a3f43-4be2-4046-897f-b67c2f5e0147</uuid>
|
||||
<name>demo</name>
|
||||
<memory>104857600</memory>
|
||||
<vcpu>2</vcpu>
|
||||
<os>
|
||||
<type machine="fake_machine_type">hvm</type>
|
||||
</os>
|
||||
</domain>""")
|
||||
|
||||
def test_ConfigGuest_parse_devices(self):
|
||||
xmldoc = """ <domain type="kvm">
|
||||
<devices>
|
||||
|
||||
@@ -1109,6 +1109,7 @@ class LibvirtConfigGuest(LibvirtConfigObject):
|
||||
self.os_init_path = None
|
||||
self.os_boot_dev = []
|
||||
self.os_smbios = None
|
||||
self.os_mach_type = None
|
||||
self.devices = []
|
||||
|
||||
def _format_basic_props(self, root):
|
||||
@@ -1124,7 +1125,10 @@ class LibvirtConfigGuest(LibvirtConfigObject):
|
||||
|
||||
def _format_os(self, root):
|
||||
os = etree.Element("os")
|
||||
os.append(self._text_node("type", self.os_type))
|
||||
type_node = self._text_node("type", self.os_type)
|
||||
if self.os_mach_type is not None:
|
||||
type_node.set("machine", self.os_mach_type)
|
||||
os.append(type_node)
|
||||
if self.os_kernel is not None:
|
||||
os.append(self._text_node("kernel", self.os_kernel))
|
||||
if self.os_loader is not None:
|
||||
|
||||
@@ -3074,6 +3074,22 @@ class LibvirtDriver(driver.ComputeDriver):
|
||||
guest.sysinfo = self.get_guest_config_sysinfo(instance)
|
||||
guest.os_smbios = vconfig.LibvirtConfigGuestSMBIOS()
|
||||
|
||||
# The underlying machine type can be set as an image attribute,
|
||||
# or otherwise based on some architecture specific defaults
|
||||
if (image_meta is not None and image_meta.get('properties') and
|
||||
image_meta['properties'].get('hw_machine_type')
|
||||
is not None):
|
||||
guest.os_mach_type = \
|
||||
image_meta['properties']['hw_machine_type']
|
||||
else:
|
||||
# For ARM systems we will default to vexpress-a15 for armv7
|
||||
# and virt for aarch64
|
||||
if caps.host.cpu.arch == "armv7l":
|
||||
guest.os_mach_type = "vexpress-a15"
|
||||
|
||||
if caps.host.cpu.arch == "aarch64":
|
||||
guest.os_mach_type = "virt"
|
||||
|
||||
if CONF.libvirt.virt_type == "lxc":
|
||||
guest.os_init_path = "/sbin/init"
|
||||
guest.os_cmdline = CONSOLE
|
||||
|
||||
Reference in New Issue
Block a user