diff options
| author | Brent Eagles <beagles@redhat.com> | 2013-06-06 15:33:42 -0230 |
|---|---|---|
| committer | Brent Eagles <beagles@redhat.com> | 2013-06-25 15:43:27 -0230 |
| commit | db3989586a8d5bbbcf857b9294a124ecc5fc57e8 (patch) | |
| tree | ca857e6ef4dbd6074a54259b6e94543e29e88372 /nova/virt | |
| parent | 9331c5c1115c7d8cc5bcab71b1100eeea1ce72fe (diff) | |
| download | nova-db3989586a8d5bbbcf857b9294a124ecc5fc57e8.tar.gz nova-db3989586a8d5bbbcf857b9294a124ecc5fc57e8.tar.xz nova-db3989586a8d5bbbcf857b9294a124ecc5fc57e8.zip | |
Refresh volume connections when starting instances
This patches adds network and block device information to the signature
of the power_on method on the virtualization driver. The relevant call
sites are also modified to provide the required information. The libvirt
implementation of power_on has been altered to re-establish network and
volume related connections.
Fixes bug: 1188326
Change-Id: If617b570e082e3aa321414a2680a3aa0754f6153
Diffstat (limited to 'nova/virt')
| -rwxr-xr-x | nova/virt/baremetal/driver.py | 6 | ||||
| -rwxr-xr-x | nova/virt/driver.py | 3 | ||||
| -rwxr-xr-x | nova/virt/fake.py | 2 | ||||
| -rwxr-xr-x | nova/virt/hyperv/driver.py | 3 | ||||
| -rwxr-xr-x | nova/virt/libvirt/driver.py | 12 | ||||
| -rwxr-xr-x | nova/virt/powervm/driver.py | 3 | ||||
| -rwxr-xr-x | nova/virt/vmwareapi/driver.py | 10 | ||||
| -rw-r--r-- | nova/virt/vmwareapi/vmops.py | 16 | ||||
| -rwxr-xr-x | nova/virt/xenapi/driver.py | 3 |
9 files changed, 35 insertions, 23 deletions
diff --git a/nova/virt/baremetal/driver.py b/nova/virt/baremetal/driver.py index 4e8543c3e..703cc0980 100755 --- a/nova/virt/baremetal/driver.py +++ b/nova/virt/baremetal/driver.py @@ -250,7 +250,8 @@ class BareMetalDriver(driver.ComputeDriver): ) self.driver.activate_bootloader(context, node, instance, network_info=network_info) - self.power_on(instance, node) + self.power_on(context, instance, network_info, block_device_info, + node) self.driver.activate_node(context, node, instance) _update_state(context, node, instance, baremetal_states.ACTIVE) except Exception: @@ -331,7 +332,8 @@ class BareMetalDriver(driver.ComputeDriver): "for instance %r") % instance['uuid']) pm.stop_console() - def power_on(self, instance, node=None): + def power_on(self, context, instance, network_info, block_device_info=None, + node=None): """Power on the specified instance.""" if not node: node = _get_baremetal_node_by_instance_uuid(instance['uuid']) diff --git a/nova/virt/driver.py b/nova/virt/driver.py index fbc2a5640..7b2185f52 100755 --- a/nova/virt/driver.py +++ b/nova/virt/driver.py @@ -425,7 +425,8 @@ class ComputeDriver(object): """Power off the specified instance.""" raise NotImplementedError() - def power_on(self, instance): + def power_on(self, context, instance, network_info, + block_device_info=None): """Power on the specified instance.""" raise NotImplementedError() diff --git a/nova/virt/fake.py b/nova/virt/fake.py index 801c8e827..1d8943101 100755 --- a/nova/virt/fake.py +++ b/nova/virt/fake.py @@ -182,7 +182,7 @@ class FakeDriver(driver.ComputeDriver): def power_off(self, instance): pass - def power_on(self, instance): + def power_on(self, context, instance, network_info, block_device_info): pass def soft_delete(self, instance): diff --git a/nova/virt/hyperv/driver.py b/nova/virt/hyperv/driver.py index 675f36f54..e0f533db6 100755 --- a/nova/virt/hyperv/driver.py +++ b/nova/virt/hyperv/driver.py @@ -103,7 +103,8 @@ class HyperVDriver(driver.ComputeDriver): def power_off(self, instance): self._vmops.power_off(instance) - def power_on(self, instance): + def power_on(self, context, instance, network_info, + block_device_info=None): self._vmops.power_on(instance) def live_migration(self, context, instance_ref, dest, post_method, diff --git a/nova/virt/libvirt/driver.py b/nova/virt/libvirt/driver.py index 6a93d92ae..f4ba24cc4 100755 --- a/nova/virt/libvirt/driver.py +++ b/nova/virt/libvirt/driver.py @@ -1465,13 +1465,13 @@ class LibvirtDriver(driver.ComputeDriver): """Power off the specified instance.""" self._destroy(instance) - def power_on(self, instance): + def power_on(self, context, instance, network_info, + block_device_info=None): """Power on the specified instance.""" - dom = self._lookup_by_name(instance['name']) - self._create_domain(domain=dom, instance=instance) - timer = loopingcall.FixedIntervalLoopingCall(self._wait_for_running, - instance) - timer.start(interval=0.5).wait() + # We use _hard_reboot here to ensure that all backing files, + # network, and block device connections, etc. are established + # and available before we attempt to start the instance. + self._hard_reboot(context, instance, network_info, block_device_info) def suspend(self, instance): """Suspend the specified instance.""" diff --git a/nova/virt/powervm/driver.py b/nova/virt/powervm/driver.py index c2cee276d..e49bbb209 100755 --- a/nova/virt/powervm/driver.py +++ b/nova/virt/powervm/driver.py @@ -191,7 +191,8 @@ class PowerVMDriver(driver.ComputeDriver): """Power off the specified instance.""" self._powervm.power_off(instance['name']) - def power_on(self, instance): + def power_on(self, context, instance, network_info, + block_device_info=None): """Power on the specified instance.""" self._powervm.power_on(instance['name']) diff --git a/nova/virt/vmwareapi/driver.py b/nova/virt/vmwareapi/driver.py index 3cf9d32b4..1f91e5ab2 100755 --- a/nova/virt/vmwareapi/driver.py +++ b/nova/virt/vmwareapi/driver.py @@ -218,9 +218,10 @@ class VMwareESXDriver(driver.ComputeDriver): """Power off the specified instance.""" self._vmops.power_off(instance) - def power_on(self, instance): + def power_on(self, context, instance, network_info, + block_device_info=None): """Power on the specified instance.""" - self._vmops.power_on(instance) + self._vmops._power_on(instance) def poll_rebooting_instances(self, timeout, instances): """Poll for rebooting instances.""" @@ -379,7 +380,8 @@ class VMwareVCDriver(VMwareESXDriver): def finish_revert_migration(self, instance, network_info, block_device_info=None, power_on=True): """Finish reverting a resize, powering back on the instance.""" - self._vmops.finish_revert_migration(instance, power_on) + self._vmops.finish_revert_migration(instance, network_info, + block_device_info, power_on) def finish_migration(self, context, migration, instance, disk_info, network_info, image_meta, resize_instance=False, @@ -387,7 +389,7 @@ class VMwareVCDriver(VMwareESXDriver): """Completes a resize, turning on the migrated instance.""" self._vmops.finish_migration(context, migration, instance, disk_info, network_info, image_meta, resize_instance, - power_on) + block_device_info, power_on) def live_migration(self, context, instance_ref, dest, post_method, recover_method, block_migration=False, diff --git a/nova/virt/vmwareapi/vmops.py b/nova/virt/vmwareapi/vmops.py index c58aac219..1afead6b9 100644 --- a/nova/virt/vmwareapi/vmops.py +++ b/nova/virt/vmwareapi/vmops.py @@ -807,7 +807,7 @@ class VMwareVMOps(object): instance['name'] = instance['name'] + self._rescue_suffix self.destroy(instance, None) instance['name'] = instance_orig_name - self.power_on(instance) + self._power_on(instance) def power_off(self, instance): """Power off the specified instance.""" @@ -832,7 +832,7 @@ class VMwareVMOps(object): LOG.debug(_("VM was already in powered off state. So returning " "without doing anything"), instance=instance) - def power_on(self, instance): + def _power_on(self, instance): """Power on the specified instance.""" vm_ref = vm_util.get_vm_ref(self._session, instance) @@ -851,6 +851,9 @@ class VMwareVMOps(object): self._session._wait_for_task(instance['uuid'], poweron_task) LOG.debug(_("Powered on the VM"), instance=instance) + def power_on(self, context, instance, network_info, block_device_info): + self._power_on(instance) + def _get_orig_vm_name_label(self, instance): return instance['name'] + '-orig' @@ -954,7 +957,8 @@ class VMwareVMOps(object): if network_info: self.unplug_vifs(instance, network_info) - def finish_revert_migration(self, instance, power_on=True): + def finish_revert_migration(self, instance, network_info, + block_device_info, power_on=True): """Finish reverting a resize.""" # The original vm was suffixed with '-orig'; find it using # the old suffix, remove the suffix, then power it back on. @@ -972,15 +976,15 @@ class VMwareVMOps(object): LOG.debug(_("Renamed the VM from %s") % name_label, instance=instance) if power_on: - self.power_on(instance) + self._power_on(instance) def finish_migration(self, context, migration, instance, disk_info, network_info, image_meta, resize_instance=False, - power_on=True): + block_device_info=None, power_on=True): """Completes a resize, turning on the migrated instance.""" # 4. Start VM if power_on: - self.power_on(instance) + self._power_on(instance) self._update_instance_progress(context, instance, step=4, total_steps=RESIZE_TOTAL_STEPS) diff --git a/nova/virt/xenapi/driver.py b/nova/virt/xenapi/driver.py index 12a087929..37aed9812 100755 --- a/nova/virt/xenapi/driver.py +++ b/nova/virt/xenapi/driver.py @@ -266,7 +266,8 @@ class XenAPIDriver(driver.ComputeDriver): """Power off the specified instance.""" self._vmops.power_off(instance) - def power_on(self, instance): + def power_on(self, context, instance, network_info, + block_device_info=None): """Power on the specified instance.""" self._vmops.power_on(instance) |
