summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--nova/tests/test_libvirt.py144
-rw-r--r--nova/virt/libvirt/driver.py43
2 files changed, 181 insertions, 6 deletions
diff --git a/nova/tests/test_libvirt.py b/nova/tests/test_libvirt.py
index de0745654..0abf16801 100644
--- a/nova/tests/test_libvirt.py
+++ b/nova/tests/test_libvirt.py
@@ -769,6 +769,150 @@ class LibvirtConnTestCase(test.TestCase):
vconfig.LibvirtConfigGuestDisk)
self.assertEquals(cfg.devices[3].target_dev, 'vdd')
+ def test_get_guest_config_with_vnc(self):
+ self.flags(libvirt_type='kvm',
+ vnc_enabled=True,
+ use_usb_tablet=False)
+ self.flags(enabled=False, group='spice')
+
+ conn = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), True)
+ instance_ref = db.instance_create(self.context, self.test_instance)
+
+ cfg = conn.get_guest_config(instance_ref, [], None, None)
+ self.assertEquals(len(cfg.devices), 5)
+ self.assertEquals(type(cfg.devices[0]),
+ vconfig.LibvirtConfigGuestDisk)
+ self.assertEquals(type(cfg.devices[1]),
+ vconfig.LibvirtConfigGuestDisk)
+ self.assertEquals(type(cfg.devices[2]),
+ vconfig.LibvirtConfigGuestSerial)
+ self.assertEquals(type(cfg.devices[3]),
+ vconfig.LibvirtConfigGuestSerial)
+ self.assertEquals(type(cfg.devices[4]),
+ vconfig.LibvirtConfigGuestGraphics)
+
+ self.assertEquals(cfg.devices[4].type, "vnc")
+
+ def test_get_guest_config_with_vnc_and_tablet(self):
+ self.flags(libvirt_type='kvm',
+ vnc_enabled=True,
+ use_usb_tablet=True)
+ self.flags(enabled=False, group='spice')
+
+ conn = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), True)
+ instance_ref = db.instance_create(self.context, self.test_instance)
+
+ cfg = conn.get_guest_config(instance_ref, [], None, None)
+ self.assertEquals(len(cfg.devices), 6)
+ self.assertEquals(type(cfg.devices[0]),
+ vconfig.LibvirtConfigGuestDisk)
+ self.assertEquals(type(cfg.devices[1]),
+ vconfig.LibvirtConfigGuestDisk)
+ self.assertEquals(type(cfg.devices[2]),
+ vconfig.LibvirtConfigGuestSerial)
+ self.assertEquals(type(cfg.devices[3]),
+ vconfig.LibvirtConfigGuestSerial)
+ self.assertEquals(type(cfg.devices[4]),
+ vconfig.LibvirtConfigGuestInput)
+ self.assertEquals(type(cfg.devices[5]),
+ vconfig.LibvirtConfigGuestGraphics)
+
+ self.assertEquals(cfg.devices[4].type, "tablet")
+ self.assertEquals(cfg.devices[5].type, "vnc")
+
+ def test_get_guest_config_with_spice_and_tablet(self):
+ self.flags(libvirt_type='kvm',
+ vnc_enabled=False,
+ use_usb_tablet=True)
+ self.flags(enabled=True,
+ agent_enabled=False,
+ group='spice')
+
+ conn = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), True)
+ instance_ref = db.instance_create(self.context, self.test_instance)
+
+ cfg = conn.get_guest_config(instance_ref, [], None, None)
+ self.assertEquals(len(cfg.devices), 6)
+ self.assertEquals(type(cfg.devices[0]),
+ vconfig.LibvirtConfigGuestDisk)
+ self.assertEquals(type(cfg.devices[1]),
+ vconfig.LibvirtConfigGuestDisk)
+ self.assertEquals(type(cfg.devices[2]),
+ vconfig.LibvirtConfigGuestSerial)
+ self.assertEquals(type(cfg.devices[3]),
+ vconfig.LibvirtConfigGuestSerial)
+ self.assertEquals(type(cfg.devices[4]),
+ vconfig.LibvirtConfigGuestInput)
+ self.assertEquals(type(cfg.devices[5]),
+ vconfig.LibvirtConfigGuestGraphics)
+
+ self.assertEquals(cfg.devices[4].type, "tablet")
+ self.assertEquals(cfg.devices[5].type, "spice")
+
+ def test_get_guest_config_with_spice_and_agent(self):
+ self.flags(libvirt_type='kvm',
+ vnc_enabled=False,
+ use_usb_tablet=True)
+ self.flags(enabled=True,
+ agent_enabled=True,
+ group='spice')
+
+ conn = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), True)
+ instance_ref = db.instance_create(self.context, self.test_instance)
+
+ cfg = conn.get_guest_config(instance_ref, [], None, None)
+ self.assertEquals(len(cfg.devices), 6)
+ self.assertEquals(type(cfg.devices[0]),
+ vconfig.LibvirtConfigGuestDisk)
+ self.assertEquals(type(cfg.devices[1]),
+ vconfig.LibvirtConfigGuestDisk)
+ self.assertEquals(type(cfg.devices[2]),
+ vconfig.LibvirtConfigGuestSerial)
+ self.assertEquals(type(cfg.devices[3]),
+ vconfig.LibvirtConfigGuestSerial)
+ self.assertEquals(type(cfg.devices[4]),
+ vconfig.LibvirtConfigGuestChannel)
+ self.assertEquals(type(cfg.devices[5]),
+ vconfig.LibvirtConfigGuestGraphics)
+
+ self.assertEquals(cfg.devices[4].target_name, "com.redhat.spice.0")
+ self.assertEquals(cfg.devices[5].type, "spice")
+
+ def test_get_guest_config_with_vnc_and_spice(self):
+ self.flags(libvirt_type='kvm',
+ vnc_enabled=True,
+ use_usb_tablet=True)
+ self.flags(enabled=True,
+ agent_enabled=True,
+ group='spice')
+
+ conn = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), True)
+ instance_ref = db.instance_create(self.context, self.test_instance)
+
+ cfg = conn.get_guest_config(instance_ref, [], None, None)
+ self.assertEquals(len(cfg.devices), 8)
+ self.assertEquals(type(cfg.devices[0]),
+ vconfig.LibvirtConfigGuestDisk)
+ self.assertEquals(type(cfg.devices[1]),
+ vconfig.LibvirtConfigGuestDisk)
+ self.assertEquals(type(cfg.devices[2]),
+ vconfig.LibvirtConfigGuestSerial)
+ self.assertEquals(type(cfg.devices[3]),
+ vconfig.LibvirtConfigGuestSerial)
+ self.assertEquals(type(cfg.devices[4]),
+ vconfig.LibvirtConfigGuestInput)
+ self.assertEquals(type(cfg.devices[5]),
+ vconfig.LibvirtConfigGuestChannel)
+ self.assertEquals(type(cfg.devices[6]),
+ vconfig.LibvirtConfigGuestGraphics)
+ self.assertEquals(type(cfg.devices[7]),
+ vconfig.LibvirtConfigGuestGraphics)
+
+ self.assertEquals(cfg.devices[4].type, "tablet")
+ self.assertEquals(cfg.devices[5].target_name, "com.redhat.spice.0")
+ self.assertEquals(cfg.devices[6].type, "vnc")
+ self.assertEquals(cfg.devices[7].type, "spice")
+
def test_get_guest_cpu_config_none(self):
self.flags(libvirt_cpu_mode="none")
conn = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), True)
diff --git a/nova/virt/libvirt/driver.py b/nova/virt/libvirt/driver.py
index 4312086a8..557818a99 100644
--- a/nova/virt/libvirt/driver.py
+++ b/nova/virt/libvirt/driver.py
@@ -196,6 +196,7 @@ CONF.import_opt('default_ephemeral_format', 'nova.virt.driver')
CONF.import_opt('use_cow_images', 'nova.virt.driver')
CONF.import_opt('live_migration_retry_count', 'nova.compute.manager')
CONF.import_opt('vncserver_proxyclient_address', 'nova.vnc')
+CONF.import_opt('server_proxyclient_address', 'nova.spice', group='spice')
DEFAULT_FIREWALL_DRIVER = "%s.%s" % (
libvirt_firewall.__name__,
@@ -1786,19 +1787,49 @@ class LibvirtDriver(driver.ComputeDriver):
consolepty.type = "pty"
guest.add_device(consolepty)
- if CONF.vnc_enabled and CONF.libvirt_type not in ('lxc', 'uml'):
- if CONF.use_usb_tablet and guest.os_type == vm_mode.HVM:
- tablet = vconfig.LibvirtConfigGuestInput()
- tablet.type = "tablet"
- tablet.bus = "usb"
- guest.add_device(tablet)
+ # We want a tablet if VNC is enabled,
+ # or SPICE is enabled and the SPICE agent is disabled
+ # NB: this implies that if both SPICE + VNC are enabled
+ # at the same time, we'll get the tablet whether the
+ # SPICE agent is used or not.
+ need_usb_tablet = False
+ if CONF.vnc_enabled:
+ need_usb_tablet = CONF.use_usb_tablet
+ elif CONF.spice.enabled and not CONF.spice.agent_enabled:
+ need_usb_tablet = CONF.use_usb_tablet
+
+ if need_usb_tablet and guest.os_type == vm_mode.HVM:
+ tablet = vconfig.LibvirtConfigGuestInput()
+ tablet.type = "tablet"
+ tablet.bus = "usb"
+ guest.add_device(tablet)
+
+ if CONF.spice.enabled and CONF.spice.agent_enabled and \
+ CONF.libvirt_type not in ('lxc', 'uml', 'xen'):
+ channel = vconfig.LibvirtConfigGuestChannel()
+ channel.target_name = "com.redhat.spice.0"
+ guest.add_device(channel)
+
+ # NB some versions of libvirt support both SPICE and VNC
+ # at the same time. We're not trying to second guess which
+ # those versions are. We'll just let libvirt report the
+ # errors appropriately if the user enables both.
+ if CONF.vnc_enabled and CONF.libvirt_type not in ('lxc', 'uml'):
graphics = vconfig.LibvirtConfigGuestGraphics()
graphics.type = "vnc"
graphics.keymap = CONF.vnc_keymap
graphics.listen = CONF.vncserver_listen
guest.add_device(graphics)
+ if CONF.spice.enabled and \
+ CONF.libvirt_type not in ('lxc', 'uml', 'xen'):
+ graphics = vconfig.LibvirtConfigGuestGraphics()
+ graphics.type = "spice"
+ graphics.keymap = CONF.spice.keymap
+ graphics.listen = CONF.spice.server_listen
+ guest.add_device(graphics)
+
return guest
def to_xml(self, instance, network_info, image_meta=None, rescue=None,