diff options
author | Jenkins <jenkins@review.openstack.org> | 2013-10-15 00:16:50 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2013-10-15 00:16:50 +0000 |
commit | 7b2b6738c6cd2c986149ae038f5580f57809b09b (patch) | |
tree | 7696bc4052bfa0627db1ff82c664181c70ffccce | |
parent | ba7ad536d59718d9eced34bfe70871b90c2f794b (diff) | |
parent | 53a57e0aaac23798a6f1b1619f4c767e1621850e (diff) | |
download | nova-7b2b6738c6cd2c986149ae038f5580f57809b09b.tar.gz |
Merge "Check instance on dest once during block migration" into stable/grizzly
-rwxr-xr-x | nova/compute/manager.py | 5 | ||||
-rw-r--r-- | nova/tests/compute/test_compute.py | 1 | ||||
-rw-r--r-- | nova/tests/test_hypervapi.py | 2 | ||||
-rw-r--r-- | nova/tests/test_libvirt.py | 52 | ||||
-rw-r--r-- | nova/tests/test_xenapi.py | 2 | ||||
-rwxr-xr-x | nova/virt/driver.py | 16 | ||||
-rwxr-xr-x | nova/virt/fake.py | 2 | ||||
-rwxr-xr-x | nova/virt/hyperv/driver.py | 2 | ||||
-rwxr-xr-x | nova/virt/libvirt/driver.py | 27 | ||||
-rwxr-xr-x | nova/virt/xenapi/driver.py | 8 |
10 files changed, 35 insertions, 82 deletions
diff --git a/nova/compute/manager.py b/nova/compute/manager.py index 63eb20a21a..e56f3d04f6 100755 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -3167,6 +3167,7 @@ class ComputeManager(manager.SchedulerDependentManager): self.driver.pre_live_migration(context, instance, block_device_info, self._legacy_nw_info(network_info), + disk, migrate_data) # NOTE(tr3buchet): setup networks on destination host @@ -3182,10 +3183,6 @@ class ComputeManager(manager.SchedulerDependentManager): self.driver.ensure_filtering_rules_for_instance(instance, self._legacy_nw_info(network_info)) - # Preparation for block migration - if block_migration: - self.driver.pre_block_migration(context, instance, disk) - def live_migration(self, context, dest, instance, block_migration=False, migrate_data=None): """Executing live migration. diff --git a/nova/tests/compute/test_compute.py b/nova/tests/compute/test_compute.py index d1a0e7f583..fbfc2ed7e9 100644 --- a/nova/tests/compute/test_compute.py +++ b/nova/tests/compute/test_compute.py @@ -3155,6 +3155,7 @@ class ComputeTestCase(BaseTestCase): self.compute.driver.pre_live_migration(mox.IsA(c), mox.IsA(instance), {'block_device_mapping': []}, mox.IgnoreArg(), + mox.IgnoreArg(), mox.IgnoreArg()) self.mox.StubOutWithMock(self.compute.driver, 'ensure_filtering_rules_for_instance') diff --git a/nova/tests/test_hypervapi.py b/nova/tests/test_hypervapi.py index df058f1b89..e0b53d7d80 100644 --- a/nova/tests/test_hypervapi.py +++ b/nova/tests/test_hypervapi.py @@ -672,7 +672,7 @@ class HyperVAPITestCase(test.TestCase): self._mox.ReplayAll() self._conn.pre_live_migration(self._context, instance, - block_device_info, network_info) + block_device_info, None, network_info) self._mox.VerifyAll() if cow: diff --git a/nova/tests/test_libvirt.py b/nova/tests/test_libvirt.py index aa341e6f39..d8c4cf203e 100644 --- a/nova/tests/test_libvirt.py +++ b/nova/tests/test_libvirt.py @@ -19,7 +19,6 @@ import copy import errno import eventlet import fixtures -import json import mox import os import re @@ -2358,6 +2357,11 @@ class LibvirtConnTestCase(test.TestCase): def fixed_ips(self): return ["test_ip_addr"] + def fake_none(*args, **kwargs): + return + + self.stubs.Set(conn, '_create_images_and_backing', fake_none) + inst_ref = {'id': 'foo'} c = context.get_admin_context() nw_info = FakeNetworkInfo() @@ -2380,7 +2384,7 @@ class LibvirtConnTestCase(test.TestCase): conn.plug_vifs(mox.IsA(inst_ref), nw_info) self.mox.ReplayAll() - result = conn.pre_live_migration(c, inst_ref, vol, nw_info) + result = conn.pre_live_migration(c, inst_ref, vol, nw_info, None) self.assertEqual(result, None) def test_pre_live_migration_vol_backed_works_correctly_mocked(self): @@ -2392,6 +2396,11 @@ class LibvirtConnTestCase(test.TestCase): {'connection_info': 'dummy', 'mount_device': '/dev/sdb'}]} conn = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False) + def fake_none(*args, **kwargs): + return + + self.stubs.Set(conn, '_create_images_and_backing', fake_none) + class FakeNetworkInfo(): def fixed_ips(self): return ["test_ip_addr"] @@ -2417,50 +2426,13 @@ class LibvirtConnTestCase(test.TestCase): 'block_migration': False, 'instance_relative_path': inst_ref['name'] } - ret = conn.pre_live_migration(c, inst_ref, vol, nw_info, + ret = conn.pre_live_migration(c, inst_ref, vol, nw_info, None, migrate_data) self.assertEqual(ret, None) self.assertTrue(os.path.exists('%s/%s/' % (tmpdir, inst_ref['name']))) db.instance_destroy(self.context, inst_ref['uuid']) - def test_pre_block_migration_works_correctly(self): - # Replace instances_path since this testcase creates tmpfile - with utils.tempdir() as tmpdir: - self.flags(instances_path=tmpdir) - - # Test data - instance_ref = db.instance_create(self.context, self.test_instance) - dummy_info = [{'path': '%s/disk' % tmpdir, - 'disk_size': 10737418240, - 'type': 'raw', - 'backing_file': ''}, - {'backing_file': 'otherdisk_1234567', - 'path': '%s/otherdisk' % tmpdir, - 'virt_disk_size': 10737418240}] - dummyjson = json.dumps(dummy_info) - - # qemu-img should be mockd since test environment might not have - # large disk space. - self.mox.StubOutWithMock(imagebackend.Image, 'cache') - imagebackend.Image.cache(context=mox.IgnoreArg(), - fetch_func=mox.IgnoreArg(), - filename='otherdisk', - image_id=self.test_instance['image_ref'], - project_id='fake', - size=10737418240L, - user_id=None).AndReturn(None) - self.mox.ReplayAll() - - conn = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False) - conn.pre_block_migration(self.context, instance_ref, - dummyjson) - - self.assertTrue(os.path.exists('%s/%s/' % - (tmpdir, instance_ref['uuid']))) - - db.instance_destroy(self.context, instance_ref['uuid']) - def test_get_instance_disk_info_works_correctly(self): # Test data instance_ref = db.instance_create(self.context, self.test_instance) diff --git a/nova/tests/test_xenapi.py b/nova/tests/test_xenapi.py index d62e36fc4c..f7fb81d744 100644 --- a/nova/tests/test_xenapi.py +++ b/nova/tests/test_xenapi.py @@ -2717,7 +2717,7 @@ class XenAPILiveMigrateTestCase(stubs.XenAPITestBase): # ensure method is present stubs.stubout_session(self.stubs, stubs.FakeSessionForVMTests) self.conn = xenapi_conn.XenAPIDriver(fake.FakeVirtAPI(), False) - self.conn.pre_live_migration(None, None, None, None) + self.conn.pre_live_migration(None, None, None, None, None) def test_post_live_migration_at_destination(self): # ensure method is present diff --git a/nova/virt/driver.py b/nova/virt/driver.py index 892fe6aaeb..15048ed7a8 100755 --- a/nova/virt/driver.py +++ b/nova/virt/driver.py @@ -430,29 +430,19 @@ class ComputeDriver(object): """ raise NotImplementedError() - def pre_live_migration(self, ctxt, instance_ref, - block_device_info, network_info, - migrate_data=None): + def pre_live_migration(self, ctxt, instance_ref, block_device_info, + network_info, disk_info, migrate_data=None): """Prepare an instance for live migration :param ctxt: security context :param instance_ref: instance object that will be migrated :param block_device_info: instance block device information :param network_info: instance network information + :param disk_info: instance disk information :param migrate_data: implementation specific data dict. """ raise NotImplementedError() - def pre_block_migration(self, ctxt, instance_ref, disk_info): - """Prepare a block device for migration - - :param ctxt: security context - :param instance_ref: instance object that will have its disk migrated - :param disk_info: information about disk to be migrated (as returned - from get_instance_disk_info()) - """ - raise NotImplementedError() - def live_migration(self, ctxt, instance_ref, dest, post_method, recover_method, block_migration=False, migrate_data=None): diff --git a/nova/virt/fake.py b/nova/virt/fake.py index 148ee65bd7..caecac9f25 100755 --- a/nova/virt/fake.py +++ b/nova/virt/fake.py @@ -376,7 +376,7 @@ class FakeDriver(driver.ComputeDriver): return def pre_live_migration(self, context, instance_ref, block_device_info, - network_info, migrate_data=None): + network_info, disk, migrate_data=None): return def unfilter_instance(self, instance_ref, network_info): diff --git a/nova/virt/hyperv/driver.py b/nova/virt/hyperv/driver.py index b576237315..64aab5b6c4 100755 --- a/nova/virt/hyperv/driver.py +++ b/nova/virt/hyperv/driver.py @@ -115,7 +115,7 @@ class HyperVDriver(driver.ComputeDriver): block_migration, migrate_data) def pre_live_migration(self, context, instance, block_device_info, - network_info, migrate_data=None): + network_info, disk, migrate_data=None): self._livemigrationops.pre_live_migration(context, instance, block_device_info, network_info) diff --git a/nova/virt/libvirt/driver.py b/nova/virt/libvirt/driver.py index fcf796e7e2..6b977cb76a 100755 --- a/nova/virt/libvirt/driver.py +++ b/nova/virt/libvirt/driver.py @@ -1385,7 +1385,9 @@ class LibvirtDriver(driver.ComputeDriver): # NOTE (rmk): Re-populate any missing backing files. disk_info_json = self.get_instance_disk_info(instance['name'], xml, block_device_info) - self._create_images_and_backing(context, instance, disk_info_json) + instance_dir = libvirt_utils.get_instance_path(instance) + self._create_images_and_backing(context, instance, instance_dir, + disk_info_json) # Initialize all the necessary networking, block devices and # start the instance. @@ -3199,7 +3201,7 @@ class LibvirtDriver(driver.ComputeDriver): instance['project_id']) def pre_live_migration(self, context, instance, block_device_info, - network_info, migrate_data=None): + network_info, disk_info, migrate_data=None): """Preparation live migration.""" # Steps for volume backed instance live migration w/o shared storage. is_shared_storage = True @@ -3226,6 +3228,10 @@ class LibvirtDriver(driver.ComputeDriver): raise exception.DestinationDiskExists(path=instance_dir) os.mkdir(instance_dir) + # Ensure images and backing files are present. + self._create_images_and_backing(context, instance, instance_dir, + disk_info) + if is_volume_backed and not (is_block_migration or is_shared_storage): # Touch the console.log file, required by libvirt. console_file = self._get_console_log_path(instance) @@ -3271,28 +3277,21 @@ class LibvirtDriver(driver.ComputeDriver): instance=instance) greenthread.sleep(1) - def pre_block_migration(self, ctxt, instance, disk_info_json): - """Preparation for block migration.""" - # NOTE (rmk): When preparing for a block migration, the instance dir - # should not exist on the destination hypervisor. - instance_dir = libvirt_utils.get_instance_path(instance) - if os.path.exists(instance_dir): - raise exception.DestinationDiskExists(path=instance_dir) - os.mkdir(instance_dir) - self._create_images_and_backing(ctxt, instance, disk_info_json) - - def _create_images_and_backing(self, ctxt, instance, disk_info_json): + def _create_images_and_backing(self, ctxt, instance, instance_dir, + disk_info_json): """ :params ctxt: security context :params instance: nova.db.sqlalchemy.models.Instance object instance object that is migrated. + :params instance_dir: + instance path to use, calculated externally to handle block + migrating an instance with an old style instance path :params disk_info_json: json strings specified in get_instance_disk_info """ disk_info = jsonutils.loads(disk_info_json) - instance_dir = libvirt_utils.get_instance_path(instance) for info in disk_info: base = os.path.basename(info['path']) diff --git a/nova/virt/xenapi/driver.py b/nova/virt/xenapi/driver.py index e55098e4b5..128f67f706 100755 --- a/nova/virt/xenapi/driver.py +++ b/nova/virt/xenapi/driver.py @@ -468,12 +468,6 @@ class XenAPIDriver(driver.ComputeDriver): checks to do this for us.""" pass - def pre_block_migration(self, ctxt, instance_ref, disk_info_json): - """Used by libvirt for live migration. We rely on xenapi - checks to do this for us. May be used in the future to - populate the vdi/vif maps""" - pass - def live_migration(self, ctxt, instance_ref, dest, post_method, recover_method, block_migration=False, migrate_data=None): @@ -497,7 +491,7 @@ class XenAPIDriver(driver.ComputeDriver): recover_method, block_migration, migrate_data) def pre_live_migration(self, context, instance_ref, block_device_info, - network_info, migrate_data=None): + network_info, data, migrate_data=None): """Preparation live migration. :params block_device_info: |