diff options
| author | Rick Harris <rconradharris@gmail.com> | 2013-03-06 05:28:41 +0000 |
|---|---|---|
| committer | Rick Harris <rconradharris@gmail.com> | 2013-03-11 18:56:10 +0000 |
| commit | 40feb35898ed0a6d57b1f481c165e683796b045c (patch) | |
| tree | d354febeb8875cdbb71a65cef9aca3f1eab8561d /nova/tests | |
| parent | 00b5ec9a00d3d310ff8f924ab356a39215b6a528 (diff) | |
xenapi: Fix reboot with hung volumes
If a volume becomes inoperable (e.g. the ISCSI connection is severed)
and the user goes to reboot, the instance may enter a permanently halted
state.
The root cause is that a VBD that points to 'bad' volume prevents VM
operations ('reboot', 'start') from completing under XenServer.
The work around is to detect which volumes are bad, detach in the
virt-layer, retry the operation (or in the case of reboot, just 'start'
the halted instance), and then notify the compute manager via a
callback so it can detach the volume in Cinder.
Fixes bug 1148614
Change-Id: Id4e8e84bb5748cfa267c2a418f9405fd86829e8f
Diffstat (limited to 'nova/tests')
| -rw-r--r-- | nova/tests/compute/test_compute.py | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/nova/tests/compute/test_compute.py b/nova/tests/compute/test_compute.py index e94d8b788..3cdb69857 100644 --- a/nova/tests/compute/test_compute.py +++ b/nova/tests/compute/test_compute.py @@ -1150,15 +1150,20 @@ class ComputeTestCase(BaseTestCase): # this is called with the wrong args, so we have to hack # around it. reboot_call_info = {} - expected_call_info = {'args': (econtext, updated_instance1, - expected_nw_info, reboot_type, - fake_block_dev_info), - 'kwargs': {}} + expected_call_info = { + 'args': (econtext, updated_instance1, expected_nw_info, + reboot_type), + 'kwargs': {'block_device_info': fake_block_dev_info}} def fake_reboot(*args, **kwargs): reboot_call_info['args'] = args reboot_call_info['kwargs'] = kwargs + # NOTE(sirp): Since `bad_volumes_callback` is a function defined + # within `reboot_instance`, we don't have access to its value and + # can't stub it out, thus we skip that comparison. + kwargs.pop('bad_volumes_callback') + self.stubs.Set(self.compute.driver, 'reboot', fake_reboot) # Power state should be updated again |
