summaryrefslogtreecommitdiff
path: root/nova
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2014-11-14 10:58:50 +0000
committerGerrit Code Review <review@openstack.org>2014-11-14 10:58:50 +0000
commit54330ce33ee31bbd84162f0af3a6c74003d57329 (patch)
tree005df2abc4bd44eda9fe17bb8cf89851a14bad44 /nova
parentc9e9a5e1d4c89ac7fa3b372ba97077b60c74760c (diff)
parent7920cfdab2fb10e01544eeb713a1e3bc79bc4996 (diff)
downloadnova-54330ce33ee31bbd84162f0af3a6c74003d57329.tar.gz
Merge "Fix nova evacuate issues for RBD" into stable/juno
Diffstat (limited to 'nova')
-rw-r--r--nova/compute/manager.py3
-rw-r--r--nova/tests/compute/test_compute_mgr.py44
-rw-r--r--nova/tests/virt/libvirt/test_driver.py11
-rw-r--r--nova/virt/libvirt/driver.py8
4 files changed, 64 insertions, 2 deletions
diff --git a/nova/compute/manager.py b/nova/compute/manager.py
index 42a65edcc3..031ae194af 100644
--- a/nova/compute/manager.py
+++ b/nova/compute/manager.py
@@ -2813,7 +2813,8 @@ class ComputeManager(manager.Manager):
attach_block_devices=self._prep_block_device,
block_device_info=block_device_info,
network_info=network_info,
- preserve_ephemeral=preserve_ephemeral)
+ preserve_ephemeral=preserve_ephemeral,
+ recreate=recreate)
try:
self.driver.rebuild(**kwargs)
except NotImplementedError:
diff --git a/nova/tests/compute/test_compute_mgr.py b/nova/tests/compute/test_compute_mgr.py
index 0d444fabe9..7fa7579985 100644
--- a/nova/tests/compute/test_compute_mgr.py
+++ b/nova/tests/compute/test_compute_mgr.py
@@ -1974,6 +1974,50 @@ class ComputeManagerUnitTestCase(test.NoDBTestCase):
do_test()
+ def test_rebuild_default_impl(self):
+ def _detach(context, bdms):
+ pass
+
+ def _attach(context, instance, bdms, do_check_attach=True):
+ return {'block_device_mapping': 'shared_block_storage'}
+
+ def _spawn(context, instance, image_meta, injected_files,
+ admin_password, network_info=None, block_device_info=None):
+ self.assertEqual(block_device_info['block_device_mapping'],
+ 'shared_block_storage')
+
+ with contextlib.nested(
+ mock.patch.object(self.compute.driver, 'destroy',
+ return_value=None),
+ mock.patch.object(self.compute.driver, 'spawn',
+ side_effect=_spawn),
+ mock.patch.object(objects.Instance, 'save',
+ return_value=None)
+ ) as(
+ mock_destroy,
+ mock_spawn,
+ mock_save
+ ):
+ instance = fake_instance.fake_instance_obj(self.context)
+ instance.task_state = task_states.REBUILDING
+ instance.save(expected_task_state=[task_states.REBUILDING])
+ self.compute._rebuild_default_impl(self.context,
+ instance,
+ None,
+ [],
+ admin_password='new_pass',
+ bdms=[],
+ detach_block_devices=_detach,
+ attach_block_devices=_attach,
+ network_info=None,
+ recreate=True,
+ block_device_info=None,
+ preserve_ephemeral=False)
+
+ self.assertFalse(mock_destroy.called)
+ self.assertTrue(mock_save.called)
+ self.assertTrue(mock_spawn.called)
+
class ComputeManagerBuildInstanceTestCase(test.NoDBTestCase):
def setUp(self):
diff --git a/nova/tests/virt/libvirt/test_driver.py b/nova/tests/virt/libvirt/test_driver.py
index a76a08545c..1774b775f7 100644
--- a/nova/tests/virt/libvirt/test_driver.py
+++ b/nova/tests/virt/libvirt/test_driver.py
@@ -12428,6 +12428,17 @@ class LibvirtDriverTestCase(test.TestCase):
vconfig.LibvirtConfigGuestGIDMap,
1, 20000, 10)
+ def test_instance_on_disk(self):
+ conn = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)
+ instance = objects.Instance(uuid='fake-uuid', id=1)
+ self.assertFalse(conn.instance_on_disk(instance))
+
+ def test_instance_on_disk_rbd(self):
+ self.flags(images_type='rbd', group='libvirt')
+ conn = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)
+ instance = objects.Instance(uuid='fake-uuid', id=1)
+ self.assertTrue(conn.instance_on_disk(instance))
+
class LibvirtVolumeUsageTestCase(test.TestCase):
"""Test for LibvirtDriver.get_all_volume_usage."""
diff --git a/nova/virt/libvirt/driver.py b/nova/virt/libvirt/driver.py
index a2009a9fb0..a3f2328874 100644
--- a/nova/virt/libvirt/driver.py
+++ b/nova/virt/libvirt/driver.py
@@ -6220,7 +6220,13 @@ class LibvirtDriver(driver.ComputeDriver):
# ensure directories exist and are writable
instance_path = libvirt_utils.get_instance_path(instance)
LOG.debug('Checking instance files accessibility %s', instance_path)
- return os.access(instance_path, os.W_OK)
+ shared_instance_path = os.access(instance_path, os.W_OK)
+ # NOTE(flwang): For shared block storage scenario, the file system is
+ # not really shared by the two hosts, but the volume of evacuated
+ # instance is reachable.
+ shared_block_storage = (self.image_backend.backend().
+ is_shared_block_storage())
+ return shared_instance_path or shared_block_storage
def inject_network_info(self, instance, nw_info):
self.firewall_driver.setup_basic_filtering(instance, nw_info)