diff options
| author | Vishvananda Ishaya <vishvananda@gmail.com> | 2012-09-27 20:33:17 +0000 |
|---|---|---|
| committer | Vishvananda Ishaya <vishvananda@gmail.com> | 2012-09-27 22:57:23 +0000 |
| commit | 81fa6f717d6e32a4cfc2c734e228e60b204da045 (patch) | |
| tree | d5329440ecc47ee308d5b7108ee6390a5a7e422a /nova | |
| parent | 0d565de78b5cc8ecdd18e10444ec731db46b48eb (diff) | |
| download | nova-81fa6f717d6e32a4cfc2c734e228e60b204da045.tar.gz nova-81fa6f717d6e32a4cfc2c734e228e60b204da045.tar.xz nova-81fa6f717d6e32a4cfc2c734e228e60b204da045.zip | |
libvirt: allows attach and detach from all domains
Previously attaching/detaching from a shutoff domain would fail.
Fixes bug 1057730
Change-Id: I876872700da125cb078746401b1b80da265880ff
Diffstat (limited to 'nova')
| -rw-r--r-- | nova/tests/fakelibvirt.py | 9 | ||||
| -rw-r--r-- | nova/virt/libvirt/driver.py | 32 |
2 files changed, 25 insertions, 16 deletions
diff --git a/nova/tests/fakelibvirt.py b/nova/tests/fakelibvirt.py index e4328a00b..b933b004a 100644 --- a/nova/tests/fakelibvirt.py +++ b/nova/tests/fakelibvirt.py @@ -69,8 +69,11 @@ VIR_DOMAIN_SHUTOFF = 5 VIR_DOMAIN_CRASHED = 6 VIR_DOMAIN_XML_SECURE = 1 + VIR_DOMAIN_UNDEFINE_MANAGED_SAVE = 1 +VIR_DOMAIN_AFFECT_CURRENT = 0 + VIR_CPU_COMPARE_ERROR = -1 VIR_CPU_COMPARE_INCOMPATIBLE = 0 VIR_CPU_COMPARE_IDENTICAL = 1 @@ -334,11 +337,17 @@ class Domain(object): self._def['devices']['disks'] += [disk_info] return True + def attachDeviceFlags(self, xml, _flags): + self.attachDevice(xml) + def detachDevice(self, xml): disk_info = _parse_disk_info(etree.fromstring(xml)) disk_info['_attached'] = True return disk_info in self._def['devices']['disks'] + def detachDeviceFlags(self, xml, _flags): + self.detachDevice(xml) + def XMLDesc(self, flags): disks = '' for disk in self._def['devices']['disks']: diff --git a/nova/virt/libvirt/driver.py b/nova/virt/libvirt/driver.py index 7e828163c..75a257a92 100644 --- a/nova/virt/libvirt/driver.py +++ b/nova/virt/libvirt/driver.py @@ -636,9 +636,16 @@ class LibvirtDriver(driver.ComputeDriver): if FLAGS.libvirt_type == 'lxc': self._attach_lxc_volume(conf.to_xml(), virt_dom, instance_name) + # TODO(danms) once libvirt has support for LXC hotplug, + # replace this re-define with use of the + # VIR_DOMAIN_AFFECT_LIVE & VIR_DOMAIN_AFFECT_CONFIG flags with + # attachDevice() + domxml = virt_dom.XMLDesc(libvirt.VIR_DOMAIN_XML_SECURE) + self._conn.defineXML(domxml) else: try: - virt_dom.attachDevice(conf.to_xml()) + flags = (libvirt.VIR_DOMAIN_AFFECT_CURRENT) + virt_dom.attachDeviceFlags(conf.to_xml(), flags) except Exception, ex: if isinstance(ex, libvirt.libvirtError): errcode = ex.get_error_code() @@ -653,13 +660,6 @@ class LibvirtDriver(driver.ComputeDriver): connection_info, mount_device) - # TODO(danms) once libvirt has support for LXC hotplug, - # replace this re-define with use of the - # VIR_DOMAIN_AFFECT_LIVE & VIR_DOMAIN_AFFECT_CONFIG flags with - # attachDevice() - domxml = virt_dom.XMLDesc(libvirt.VIR_DOMAIN_XML_SECURE) - self._conn.defineXML(domxml) - @staticmethod def _get_disk_xml(xml, device): """Returns the xml for the disk mounted at device""" @@ -698,20 +698,20 @@ class LibvirtDriver(driver.ComputeDriver): raise exception.DiskNotFound(location=mount_device) if FLAGS.libvirt_type == 'lxc': self._detach_lxc_volume(xml, virt_dom, instance_name) + # TODO(danms) once libvirt has support for LXC hotplug, + # replace this re-define with use of the + # VIR_DOMAIN_AFFECT_LIVE & VIR_DOMAIN_AFFECT_CONFIG flags with + # detachDevice() + domxml = virt_dom.XMLDesc(libvirt.VIR_DOMAIN_XML_SECURE) + self._conn.defineXML(domxml) else: - virt_dom.detachDevice(xml) + flags = (libvirt.VIR_DOMAIN_AFFECT_CURRENT) + virt_dom.detachDeviceFlags(xml, flags) finally: self.volume_driver_method('disconnect_volume', connection_info, mount_device) - # TODO(danms) once libvirt has support for LXC hotplug, - # replace this re-define with use of the - # VIR_DOMAIN_AFFECT_LIVE & VIR_DOMAIN_AFFECT_CONFIG flags with - # detachDevice() - domxml = virt_dom.XMLDesc(libvirt.VIR_DOMAIN_XML_SECURE) - self._conn.defineXML(domxml) - @exception.wrap_exception() def _attach_lxc_volume(self, xml, virt_dom, instance_name): LOG.info(_('attaching LXC block device')) |
