Merge "libvirt: Enable console and log for system z guests"

This commit is contained in:
Jenkins
2014-12-04 18:16:49 +00:00
committed by Gerrit Code Review
4 changed files with 124 additions and 4 deletions
@@ -1035,6 +1035,43 @@ class LibvirtConfigGuestConsoleTest(LibvirtConfigBaseTest):
self.assertXmlEqual(xml, """
<console type="pty"/>""")
def test_config_target_type(self):
obj = config.LibvirtConfigGuestConsole()
obj.type = "pty"
obj.target_type = "sclp"
xml = obj.to_xml()
self.assertXmlEqual(xml, """
<console type="pty">
<target type="sclp"/>
</console>
""")
def test_config_type_file_with_target_type(self):
obj = config.LibvirtConfigGuestConsole()
obj.type = "file"
obj.target_type = "sclplm"
obj.source_path = "/var/lib/nova/instances/uuid/console.log"
xml = obj.to_xml()
self.assertXmlEqual(xml, """
<console type="file">
<source path="/var/lib/nova/instances/uuid/console.log"/>
<target type="sclplm"/>
</console>
""")
def test_config_target_port(self):
obj = config.LibvirtConfigGuestConsole()
obj.target_port = 0
xml = obj.to_xml()
self.assertXmlEqual(xml, """
<console type="pty">
<target port="0"/>
</console>
""")
class LibvirtConfigGuestChannelTest(LibvirtConfigBaseTest):
def test_config_spice_minimal(self):
@@ -2148,6 +2148,75 @@ class LibvirtConnTestCase(test.NoDBTestCase):
self.assertEqual(cfg.devices[3].type, "vnc")
self.assertEqual(cfg.devices[4].type, "xen")
@mock.patch.object(objects.Flavor, 'get_by_id')
def test_get_guest_config_with_type_kvm_on_s390(self, mock_flavor):
self.flags(vnc_enabled=False)
self.flags(virt_type='kvm',
use_usb_tablet=False,
group='libvirt')
host_arch = arch.S390X
self._stub_host_capabilities_cpu_arch(host_arch)
self._stub_guest_cpu_config_arch(host_arch)
instance_ref = self._get_flavor_mocked_test_instance(mock_flavor)
cfg = self._get_guest_config_via_fake_api(instance_ref)
self.assertIsInstance(cfg.devices[0],
vconfig.LibvirtConfigGuestDisk)
self.assertIsInstance(cfg.devices[1],
vconfig.LibvirtConfigGuestDisk)
log_file_device = cfg.devices[2]
self.assertIsInstance(log_file_device,
vconfig.LibvirtConfigGuestConsole)
self.assertEqual("sclplm", log_file_device.target_type)
self.assertEqual("file", log_file_device.type)
terminal_device = cfg.devices[3]
self.assertIsInstance(terminal_device,
vconfig.LibvirtConfigGuestConsole)
self.assertEqual("sclp", terminal_device.target_type)
self.assertEqual("pty", terminal_device.type)
self.assertEqual("s390-ccw-virtio", cfg.os_mach_type)
self.assertEqual("s390x", cfg.cpu.arch)
def _stub_host_capabilities_cpu_arch(self, cpu_arch):
def get_host_capabilities_stub(self):
cpu = vconfig.LibvirtConfigGuestCPU()
cpu.arch = cpu_arch
caps = vconfig.LibvirtConfigCaps()
caps.host = vconfig.LibvirtConfigCapsHost()
caps.host.cpu = cpu
return caps
self.stubs.Set(libvirt_driver.LibvirtDriver,
"_get_host_capabilities",
get_host_capabilities_stub)
def _stub_guest_cpu_config_arch(self, cpu_arch):
def get_guest_cpu_config(self):
cpu = vconfig.LibvirtConfigGuestCPU()
cpu.arch = cpu_arch
return cpu
self.stubs.Set(libvirt_driver.LibvirtDriver,
"_get_guest_cpu_model_config",
get_guest_cpu_config)
def _get_flavor_mocked_test_instance(self, mock_flavor):
instance = objects.Instance(**self.test_instance)
flavor = instance.get_flavor()
flavor.extra_specs = {}
mock_flavor.return_value = flavor
return instance
def _get_guest_config_via_fake_api(self, instance):
conn = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), True)
disk_info = blockinfo.get_disk_info(CONF.libvirt.virt_type,
instance)
return conn._get_guest_config(instance, [], {}, disk_info)
@mock.patch.object(objects.Flavor, 'get_by_id')
def test_get_guest_config_with_type_xen_pae_hvm(self, mock_flavor):
self.flags(vnc_enabled=True)
+8 -2
View File
@@ -1432,12 +1432,18 @@ class LibvirtConfigGuestChar(LibvirtConfigGuestCharBase):
super(LibvirtConfigGuestChar, self).__init__(**kwargs)
self.target_port = None
self.target_type = None
def format_dom(self):
dev = super(LibvirtConfigGuestChar, self).format_dom()
if self.target_port is not None:
dev.append(etree.Element("target", port=str(self.target_port)))
if self.target_port is not None or self.target_type is not None:
target = etree.Element("target")
if self.target_port is not None:
target.set("port", str(self.target_port))
if self.target_type is not None:
target.set("type", self.target_type)
dev.append(target)
return dev
+10 -2
View File
@@ -3582,7 +3582,11 @@ class LibvirtDriver(driver.ComputeDriver):
# client app is connected. Thus we can't get away
# with a single type=pty console. Instead we have
# to configure two separate consoles.
consolelog = vconfig.LibvirtConfigGuestSerial()
if guest.cpu.arch in (arch.S390, arch.S390X):
consolelog = vconfig.LibvirtConfigGuestConsole()
consolelog.target_type = "sclplm"
else:
consolelog = vconfig.LibvirtConfigGuestSerial()
consolelog.type = "file"
consolelog.source_path = self._get_console_log_path(instance)
guest.add_device(consolelog)
@@ -3790,7 +3794,11 @@ class LibvirtDriver(driver.ComputeDriver):
# Create the serial console char devices
self._create_serial_console_devices(guest, instance, flavor,
image_meta)
consolepty = vconfig.LibvirtConfigGuestSerial()
if caps.host.cpu.arch in (arch.S390, arch.S390X):
consolepty = vconfig.LibvirtConfigGuestConsole()
consolepty.target_type = "sclp"
else:
consolepty = vconfig.LibvirtConfigGuestSerial()
else:
consolepty = vconfig.LibvirtConfigGuestConsole()