diff options
Diffstat (limited to 'nova/conductor/manager.py')
-rw-r--r-- | nova/conductor/manager.py | 39 |
1 files changed, 36 insertions, 3 deletions
diff --git a/nova/conductor/manager.py b/nova/conductor/manager.py index cc1b05cc4..40e7fa69b 100644 --- a/nova/conductor/manager.py +++ b/nova/conductor/manager.py @@ -18,6 +18,7 @@ import copy from nova.api.ec2 import ec2utils from nova import block_device +from nova.cells import rpcapi as cells_rpcapi from nova.compute import api as compute_api from nova.compute import utils as compute_utils from nova import exception @@ -77,6 +78,7 @@ class ConductorManager(manager.Manager): self._compute_api = None self.compute_task_mgr = ComputeTaskManager() self.quotas = quota.QUOTAS + self.cells_rpcapi = cells_rpcapi.CellsAPI() def create_rpc_dispatcher(self, *args, **kwargs): kwargs['additional_apis'] = [self.compute_task_mgr] @@ -258,11 +260,18 @@ class ConductorManager(manager.Manager): def block_device_mapping_update_or_create(self, context, values, create=None): if create is None: - self.db.block_device_mapping_update_or_create(context, values) + bdm = self.db.block_device_mapping_update_or_create(context, + values) elif create is True: - self.db.block_device_mapping_create(context, values) + bdm = self.db.block_device_mapping_create(context, values) else: - self.db.block_device_mapping_update(context, values['id'], values) + bdm = self.db.block_device_mapping_update(context, + values['id'], + values) + # NOTE:comstud): 'bdm' is always in the new format, so we + # account for this in cells/messaging.py + self.cells_rpcapi.bdm_update_or_create_at_top(context, bdm, + create=create) def block_device_mapping_get_all_by_instance(self, context, instance, legacy=True): @@ -278,12 +287,36 @@ class ConductorManager(manager.Manager): if bdms is not None: for bdm in bdms: self.db.block_device_mapping_destroy(context, bdm['id']) + # NOTE(comstud): bdm['id'] will be different in API cell, + # so we must try to destroy by device_name or volume_id. + # We need an instance_uuid in order to do this properly, + # too. + # I hope to clean a lot of this up in the object + # implementation. + instance_uuid = (bdm['instance_uuid'] or + (instance and instance['uuid'])) + if not instance_uuid: + continue + # Better to be safe than sorry. device_name is not + # NULLable, however it could be an empty string. + if bdm['device_name']: + self.cells_rpcapi.bdm_destroy_at_top( + context, instance_uuid, + device_name=bdm['device_name']) + elif bdm['volume_id']: + self.cells_rpcapi.bdm_destroy_at_top( + context, instance_uuid, + volume_id=bdm['volume_id']) elif instance is not None and volume_id is not None: self.db.block_device_mapping_destroy_by_instance_and_volume( context, instance['uuid'], volume_id) + self.cells_rpcapi.bdm_destroy_at_top( + context, instance['uuid'], volume_id=volume_id) elif instance is not None and device_name is not None: self.db.block_device_mapping_destroy_by_instance_and_device( context, instance['uuid'], device_name) + self.cells_rpcapi.bdm_destroy_at_top( + context, instance['uuid'], device_name=device_name) else: # NOTE(danms): This shouldn't happen raise exception.Invalid(_("Invalid block_device_mapping_destroy" |