diff options
| author | Jenkins <jenkins@review.openstack.org> | 2012-10-25 02:24:22 +0000 |
|---|---|---|
| committer | Gerrit Code Review <review@openstack.org> | 2012-10-25 02:24:22 +0000 |
| commit | a09e00cfa03ede3eea6d33e692b29907cb8f7b91 (patch) | |
| tree | 3b7fa28b813d7d592c16848d60546c8d50b1ed1b | |
| parent | 1ae3f8a41ea1a930577d1c35c8d4893dca934196 (diff) | |
| parent | 814e7f8c827aa21a87a62594d5b6413bb49e31e1 (diff) | |
| download | nova-a09e00cfa03ede3eea6d33e692b29907cb8f7b91.tar.gz nova-a09e00cfa03ede3eea6d33e692b29907cb8f7b91.tar.xz nova-a09e00cfa03ede3eea6d33e692b29907cb8f7b91.zip | |
Merge "libvirt: persist volume attachments into config"
| -rw-r--r-- | nova/tests/fakelibvirt.py | 7 | ||||
| -rw-r--r-- | nova/tests/test_virt_drivers.py | 12 | ||||
| -rw-r--r-- | nova/virt/libvirt/driver.py | 16 |
3 files changed, 32 insertions, 3 deletions
diff --git a/nova/tests/fakelibvirt.py b/nova/tests/fakelibvirt.py index b933b004a..7c9d5b238 100644 --- a/nova/tests/fakelibvirt.py +++ b/nova/tests/fakelibvirt.py @@ -73,6 +73,8 @@ VIR_DOMAIN_XML_SECURE = 1 VIR_DOMAIN_UNDEFINE_MANAGED_SAVE = 1 VIR_DOMAIN_AFFECT_CURRENT = 0 +VIR_DOMAIN_AFFECT_LIVE = 1 +VIR_DOMAIN_AFFECT_CONFIG = 2 VIR_CPU_COMPARE_ERROR = -1 VIR_CPU_COMPARE_INCOMPATIBLE = 0 @@ -337,7 +339,10 @@ class Domain(object): self._def['devices']['disks'] += [disk_info] return True - def attachDeviceFlags(self, xml, _flags): + def attachDeviceFlags(self, xml, flags): + if (flags & VIR_DOMAIN_AFFECT_LIVE and + self._state != VIR_DOMAIN_RUNNING): + raise libvirtError("AFFECT_LIVE only allowed for running domains!") self.attachDevice(xml) def detachDevice(self, xml): diff --git a/nova/tests/test_virt_drivers.py b/nova/tests/test_virt_drivers.py index d5a2203f3..5508ab9bb 100644 --- a/nova/tests/test_virt_drivers.py +++ b/nova/tests/test_virt_drivers.py @@ -361,6 +361,18 @@ class _VirtDriverTestCase(_FakeDriverBackendTestCase): '/mnt/nova/something') @catch_notimplementederror + def test_attach_detach_different_power_states(self): + instance_ref, network_info = self._get_running_instance() + self.connection.power_off(instance_ref) + self.connection.attach_volume({'driver_volume_type': 'fake'}, + instance_ref['name'], + '/mnt/nova/something') + self.connection.power_on(instance_ref) + self.connection.detach_volume({'driver_volume_type': 'fake'}, + instance_ref['name'], + '/mnt/nova/something') + + @catch_notimplementederror def test_get_info(self): instance_ref, network_info = self._get_running_instance() info = self.connection.get_info(instance_ref) diff --git a/nova/virt/libvirt/driver.py b/nova/virt/libvirt/driver.py index 34d667c16..a0b80ab1c 100644 --- a/nova/virt/libvirt/driver.py +++ b/nova/virt/libvirt/driver.py @@ -646,7 +646,13 @@ class LibvirtDriver(driver.ComputeDriver): self._conn.defineXML(domxml) else: try: - flags = (libvirt.VIR_DOMAIN_AFFECT_CURRENT) + # NOTE(vish): We can always affect config because our + # domains are persistent, but we should only + # affect live if the domain is running. + flags = libvirt.VIR_DOMAIN_AFFECT_CONFIG + state = LIBVIRT_POWER_STATE[virt_dom.info()[0]] + if state == power_state.RUNNING: + flags |= libvirt.VIR_DOMAIN_AFFECT_LIVE virt_dom.attachDeviceFlags(conf.to_xml(), flags) except Exception, ex: if isinstance(ex, libvirt.libvirtError): @@ -704,7 +710,13 @@ class LibvirtDriver(driver.ComputeDriver): domxml = virt_dom.XMLDesc(libvirt.VIR_DOMAIN_XML_SECURE) self._conn.defineXML(domxml) else: - flags = (libvirt.VIR_DOMAIN_AFFECT_CURRENT) + # NOTE(vish): We can always affect config because our + # domains are persistent, but we should only + # affect live if the domain is running. + flags = libvirt.VIR_DOMAIN_AFFECT_CONFIG + state = LIBVIRT_POWER_STATE[virt_dom.info()[0]] + if state == power_state.RUNNING: + flags |= libvirt.VIR_DOMAIN_AFFECT_LIVE virt_dom.detachDeviceFlags(xml, flags) except libvirt.libvirtError as ex: # NOTE(vish): This is called to cleanup volumes after live |
