diff options
author | Jenkins <jenkins@review.openstack.org> | 2014-11-14 10:58:50 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2014-11-14 10:58:50 +0000 |
commit | 54330ce33ee31bbd84162f0af3a6c74003d57329 (patch) | |
tree | 005df2abc4bd44eda9fe17bb8cf89851a14bad44 /nova | |
parent | c9e9a5e1d4c89ac7fa3b372ba97077b60c74760c (diff) | |
parent | 7920cfdab2fb10e01544eeb713a1e3bc79bc4996 (diff) | |
download | nova-54330ce33ee31bbd84162f0af3a6c74003d57329.tar.gz |
Merge "Fix nova evacuate issues for RBD" into stable/juno
Diffstat (limited to 'nova')
-rw-r--r-- | nova/compute/manager.py | 3 | ||||
-rw-r--r-- | nova/tests/compute/test_compute_mgr.py | 44 | ||||
-rw-r--r-- | nova/tests/virt/libvirt/test_driver.py | 11 | ||||
-rw-r--r-- | nova/virt/libvirt/driver.py | 8 |
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) |