diff options
| author | Renuka Apte <renuka.apte@citrix.com> | 2012-09-04 23:02:16 -0700 |
|---|---|---|
| committer | Clay Gerrard <clay.gerrard@gmail.com> | 2012-10-03 20:32:22 -0500 |
| commit | 359527501604ea720b594a2ed1b32cd29fe6adbc (patch) | |
| tree | 2e938a604d06016107f0782d7971a18beb33e936 /nova/compute | |
| parent | 1d4506c16aec9674be6a3685ba585a8bbd9c1559 (diff) | |
xenapi: Refactor snapshots during resize
Currently, we use VM.snapshot for resize, which fails if we have a
volume attached to the VM, which does not support snapshots. This change
uses VDI.snapshot instead, for all VDIs that are not attached by nova.
Also needed for xenapi: detaching and reattaching volumes during
migrations and reverting of migrations.
Fixes Bug #1028092
Change-Id: I3e2973747135a9c33de194e38537620c397bb87e
Diffstat (limited to 'nova/compute')
| -rw-r--r-- | nova/compute/manager.py | 44 |
1 files changed, 39 insertions, 5 deletions
diff --git a/nova/compute/manager.py b/nova/compute/manager.py index 9f311e881..920ed658b 100644 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -787,8 +787,10 @@ class ComputeManager(manager.SchedulerDependentManager): if str(bdm['volume_id']) == str(volume_id): return bdm - def _get_instance_volume_block_device_info(self, context, instance_uuid): - bdms = self._get_instance_volume_bdms(context, instance_uuid) + def _get_instance_volume_block_device_info(self, context, instance_uuid, + bdms=None): + if bdms is None: + bdms = self._get_instance_volume_bdms(context, instance_uuid) block_device_mapping = [] for bdm in bdms: try: @@ -847,7 +849,7 @@ class ComputeManager(manager.SchedulerDependentManager): # NOTE(vish) get bdms before destroying the instance bdms = self._get_instance_volume_bdms(context, instance['uuid']) block_device_info = self._get_instance_volume_block_device_info( - context, instance['uuid']) + context, instance['uuid'], bdms=bdms) self.driver.destroy(instance, self._legacy_nw_info(network_info), block_device_info) for bdm in bdms: @@ -1439,6 +1441,14 @@ class ComputeManager(manager.SchedulerDependentManager): self.driver.destroy(instance, self._legacy_nw_info(network_info), block_device_info) + # Terminate volume connections. + bdms = self._get_instance_volume_bdms(context, instance['uuid']) + if bdms: + connector = self.driver.get_volume_connector(instance) + for bdm in bdms: + volume = self.volume_api.get(context, bdm['volume_id']) + self.volume_api.terminate_connection(context, volume, + connector) self.compute_rpcapi.finish_revert_resize(context, instance, migration_ref['id'], migration_ref['source_compute'], reservations) @@ -1466,8 +1476,15 @@ class ComputeManager(manager.SchedulerDependentManager): old_instance_type = migration_ref['old_instance_type_id'] instance_type = instance_types.get_instance_type(old_instance_type) + bdms = self._get_instance_volume_bdms(context, instance['uuid']) block_device_info = self._get_instance_volume_block_device_info( - context, instance['uuid']) + context, instance['uuid']) + if bdms: + connector = self.driver.get_volume_connector(instance) + for bdm in bdms: + volume = self.volume_api.get(context, bdm['volume_id']) + self.volume_api.initialize_connection(context, volume, + connector) self.driver.finish_revert_migration(instance, self._legacy_nw_info(network_info), @@ -1592,6 +1609,15 @@ class ComputeManager(manager.SchedulerDependentManager): instance_type_ref, self._legacy_nw_info(network_info), block_device_info) + # Terminate volume connections. + bdms = self._get_instance_volume_bdms(context, instance['uuid']) + if bdms: + connector = self.driver.get_volume_connector(instance) + for bdm in bdms: + volume = self.volume_api.get(context, bdm['volume_id']) + self.volume_api.terminate_connection(context, volume, + connector) + self.db.migration_update(context, migration_id, {'status': 'post-migrating'}) @@ -1639,8 +1665,16 @@ class ComputeManager(manager.SchedulerDependentManager): context, instance, "finish_resize.start", network_info=network_info) + bdms = self._get_instance_volume_bdms(context, instance['uuid']) block_device_info = self._get_instance_volume_block_device_info( - context, instance['uuid']) + context, instance['uuid'], bdms=bdms) + + if bdms: + connector = self.driver.get_volume_connector(instance) + for bdm in bdms: + volume = self.volume_api.get(context, bdm['volume_id']) + self.volume_api.initialize_connection(context, volume, + connector) self.driver.finish_migration(context, migration_ref, instance, disk_info, |
