diff options
author | Jenkins <jenkins@review.openstack.org> | 2013-01-04 22:37:22 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2013-01-04 22:37:22 +0000 |
commit | 8fe279661b0c554b19fbfd145fe266ec58cad4fa (patch) | |
tree | c2a9d255de041036627d48912f8a0e560778f916 | |
parent | 11698a3073d743154360ebeac982fb0a5f566bcc (diff) | |
parent | 1bf89924ba6eafc394612f9d62c1b52251825b2b (diff) | |
download | nova-8fe279661b0c554b19fbfd145fe266ec58cad4fa.tar.gz nova-8fe279661b0c554b19fbfd145fe266ec58cad4fa.tar.xz nova-8fe279661b0c554b19fbfd145fe266ec58cad4fa.zip |
Merge "Move block_device_mapping get operations to conductor"
-rw-r--r-- | nova/compute/manager.py | 76 | ||||
-rw-r--r-- | nova/conductor/api.py | 8 | ||||
-rw-r--r-- | nova/conductor/manager.py | 7 | ||||
-rw-r--r-- | nova/conductor/rpcapi.py | 7 | ||||
-rw-r--r-- | nova/tests/conductor/test_conductor.py | 11 |
5 files changed, 69 insertions, 40 deletions
diff --git a/nova/compute/manager.py b/nova/compute/manager.py index 6876b0a6d..d472418f3 100644 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -602,8 +602,8 @@ class ComputeManager(manager.SchedulerDependentManager): context, instance, "create.start", extra_usage_info=extra_usage_info) network_info = None - bdms = self.db.block_device_mapping_get_all_by_instance( - context, instance['uuid']) + bdms = self.conductor_api.block_device_mapping_get_all_by_instance( + context, instance) rt = self._get_resource_tracker(node) try: limits = filter_properties.get('limits', {}) @@ -914,13 +914,13 @@ class ComputeManager(manager.SchedulerDependentManager): return [bdm for bdm in bdms if bdm['volume_id']] # NOTE(danms): Legacy interface for digging up volumes in the database - def _get_instance_volume_bdms(self, context, instance_uuid): + def _get_instance_volume_bdms(self, context, instance): return self._get_volume_bdms( - self.db.block_device_mapping_get_all_by_instance(context, - instance_uuid)) + self.conductor_api.block_device_mapping_get_all_by_instance( + context, instance)) - def _get_instance_volume_bdm(self, context, instance_uuid, volume_id): - bdms = self._get_instance_volume_bdms(context, instance_uuid) + def _get_instance_volume_bdm(self, context, instance, volume_id): + bdms = self._get_instance_volume_bdms(context, instance) for bdm in bdms: # NOTE(vish): Comparing as strings because the os_api doesn't # convert to integer and we may wish to support uuids @@ -930,10 +930,10 @@ class ComputeManager(manager.SchedulerDependentManager): # NOTE(danms): This is a transitional interface until all the callers # can provide their own bdms - def _get_instance_volume_block_device_info(self, context, instance_uuid, + def _get_instance_volume_block_device_info(self, context, instance, bdms=None): if bdms is None: - bdms = self._get_instance_volume_bdms(context, instance_uuid) + bdms = self._get_instance_volume_bdms(context, instance) return self._get_volume_block_device_info(bdms) def _get_volume_block_device_info(self, bdms): @@ -995,7 +995,7 @@ class ComputeManager(manager.SchedulerDependentManager): # NOTE(vish) get bdms before destroying the instance vol_bdms = self._get_volume_bdms(bdms) block_device_info = self._get_instance_volume_block_device_info( - context, instance['uuid'], bdms=bdms) + context, instance, bdms=bdms) self.driver.destroy(instance, self._legacy_nw_info(network_info), block_device_info) for bdm in vol_bdms: @@ -1077,7 +1077,7 @@ class ComputeManager(manager.SchedulerDependentManager): elevated = context.elevated() # NOTE(danms): remove this compatibility in the future if not bdms: - bdms = self._get_instance_volume_bdms(context, instance["uuid"]) + bdms = self._get_instance_volume_bdms(context, instance) @lockutils.synchronized(instance['uuid'], 'nova-') def do_terminate_instance(instance, bdms): @@ -1260,8 +1260,9 @@ class ComputeManager(manager.SchedulerDependentManager): network_info = self.network_api.get_instance_nw_info(context, instance) if bdms is None: - bdms = self.db.block_device_mapping_get_all_by_instance( - context, instance['uuid']) + capi = self.conductor_api + bdms = capi.block_device_mapping_get_all_by_instance( + context, instance) device_info = self._setup_block_device_mapping(context, instance, bdms) @@ -1310,7 +1311,7 @@ class ComputeManager(manager.SchedulerDependentManager): # is no longer needed if block_device_info is None: block_device_info = self._get_instance_volume_block_device_info( - context, instance['uuid']) + context, instance) # NOTE(danms): remove this when RPC API < 2.5 compatibility # is no longer needed if network_info is None: @@ -1689,7 +1690,7 @@ class ComputeManager(manager.SchedulerDependentManager): network_info = self._get_instance_nw_info(context, instance) block_device_info = self._get_instance_volume_block_device_info( - context, instance['uuid']) + context, instance) self.driver.destroy(instance, self._legacy_nw_info(network_info), block_device_info) @@ -1739,9 +1740,9 @@ class ComputeManager(manager.SchedulerDependentManager): self.network_api.setup_networks_on_host(context, instance, migration['source_compute']) - bdms = self._get_instance_volume_bdms(context, instance['uuid']) + bdms = self._get_instance_volume_bdms(context, instance) block_device_info = self._get_instance_volume_block_device_info( - context, instance['uuid']) + context, instance) if bdms: connector = self.driver.get_volume_connector(instance) for bdm in bdms: @@ -1916,7 +1917,7 @@ class ComputeManager(manager.SchedulerDependentManager): context, instance, "resize.start", network_info=network_info) block_device_info = self._get_instance_volume_block_device_info( - context, instance['uuid']) + context, instance) disk_info = self.driver.migrate_disk_and_power_off( context, instance, migration['dest_host'], @@ -1946,7 +1947,7 @@ class ComputeManager(manager.SchedulerDependentManager): network_info=network_info) def _terminate_volume_connections(self, context, instance): - bdms = self._get_instance_volume_bdms(context, instance['uuid']) + bdms = self._get_instance_volume_bdms(context, instance) if bdms: connector = self.driver.get_volume_connector(instance) for bdm in bdms: @@ -1989,9 +1990,9 @@ class ComputeManager(manager.SchedulerDependentManager): context, instance, "finish_resize.start", network_info=network_info) - bdms = self._get_instance_volume_bdms(context, instance['uuid']) + bdms = self._get_instance_volume_bdms(context, instance) block_device_info = self._get_instance_volume_block_device_info( - context, instance['uuid'], bdms=bdms) + context, instance, bdms=bdms) if bdms: connector = self.driver.get_volume_connector(instance) @@ -2188,7 +2189,7 @@ class ComputeManager(manager.SchedulerDependentManager): network_info = self._get_instance_nw_info(context, instance) block_device_info = self._get_instance_volume_block_device_info( - context, instance['uuid']) + context, instance) self.driver.resume(instance, self._legacy_nw_info(network_info), block_device_info) @@ -2410,8 +2411,7 @@ class ComputeManager(manager.SchedulerDependentManager): @wrap_instance_fault def detach_volume(self, context, volume_id, instance): """Detach a volume from an instance.""" - bdm = self._get_instance_volume_bdm(context, instance['uuid'], - volume_id) + bdm = self._get_instance_volume_bdm(context, instance, volume_id) if CONF.volume_usage_poll_interval > 0: vol_stats = [] mp = bdm['device_name'] @@ -2445,9 +2445,7 @@ class ComputeManager(manager.SchedulerDependentManager): # detached, or delete the bdm, just remove the # connection from this host. try: - bdm = self._get_instance_volume_bdm(context, - instance['uuid'], - volume_id) + bdm = self._get_instance_volume_bdm(context, instance, volume_id) self._detach_volume(context, instance, bdm) volume = self.volume_api.get(context, volume_id) connector = self.driver.get_volume_connector(instance) @@ -2532,14 +2530,14 @@ class ComputeManager(manager.SchedulerDependentManager): """ # If any volume is mounted, prepare here. block_device_info = self._get_instance_volume_block_device_info( - context, instance['uuid']) + context, instance) if not block_device_info['block_device_mapping']: LOG.info(_('Instance has no volume.'), instance=instance) # assign the volume to host system # needed by the lefthand volume driver and maybe others connector = self.driver.get_volume_connector(instance) - for bdm in self._get_instance_volume_bdms(context, instance['uuid']): + for bdm in self._get_instance_volume_bdms(context, instance): volume = self.volume_api.get(context, bdm['volume_id']) self.volume_api.initialize_connection(context, volume, connector) @@ -2628,7 +2626,7 @@ class ComputeManager(manager.SchedulerDependentManager): # Detaching volumes. connector = self.driver.get_volume_connector(instance_ref) - for bdm in self._get_instance_volume_bdms(ctxt, instance_ref['uuid']): + for bdm in self._get_instance_volume_bdms(ctxt, instance_ref): # NOTE(vish): We don't want to actually mark the volume # detached, or delete the bdm, just remove the # connection from this host. @@ -2748,8 +2746,7 @@ class ComputeManager(manager.SchedulerDependentManager): self.network_api.setup_networks_on_host(context, instance_ref, self.host) - for bdm in self._get_instance_volume_bdms(context, - instance_ref['uuid']): + for bdm in self._get_instance_volume_bdms(context, instance_ref): volume_id = bdm['volume_id'] volume = self.volume_api.get(context, volume_id) self.compute_rpcapi.remove_volume_connection(context, instance_ref, @@ -2785,7 +2782,7 @@ class ComputeManager(manager.SchedulerDependentManager): # NOTE(vish): The mapping is passed in so the driver can disconnect # from remote volumes if necessary block_device_info = self._get_instance_volume_block_device_info( - context, instance['uuid']) + context, instance) self.driver.destroy(instance, self._legacy_nw_info(network_info), block_device_info) @@ -3044,8 +3041,7 @@ class ComputeManager(manager.SchedulerDependentManager): compute_host_bdms = [] instances = self.db.instance_get_all_by_host(context, self.host) for instance in instances: - instance_bdms = self._get_instance_volume_bdms(context, - instance['uuid']) + instance_bdms = self._get_instance_volume_bdms(context, instance) compute_host_bdms.append(dict(instance=instance, instance_bdms=instance_bdms)) @@ -3270,8 +3266,9 @@ class ComputeManager(manager.SchedulerDependentManager): soft_deleted = instance['vm_state'] == vm_states.SOFT_DELETED if soft_deleted and old_enough: - bdms = self.db.block_device_mapping_get_all_by_instance( - context, instance['uuid']) + capi = self.conductor_api + bdms = capi.block_device_mapping_get_all_by_instance( + context, instance) LOG.info(_('Reclaiming deleted instance'), instance=instance) self._delete_instance(context, instance, bdms) @@ -3322,8 +3319,9 @@ class ComputeManager(manager.SchedulerDependentManager): # NOTE(sirp): admin contexts don't ordinarily return deleted records with utils.temporary_mutation(context, read_deleted="yes"): for instance in self._running_deleted_instances(context): - bdms = self.db.block_device_mapping_get_all_by_instance( - context, instance['uuid']) + capi = self.conductor_api + bdms = capi.block_device_mapping_get_all_by_instance( + context, instance) if action == "log": name = instance['name'] diff --git a/nova/conductor/api.py b/nova/conductor/api.py index 650849781..1fe78d4ab 100644 --- a/nova/conductor/api.py +++ b/nova/conductor/api.py @@ -150,6 +150,10 @@ class LocalAPI(object): return self._manager.block_device_mapping_update_or_create(context, values) + def block_device_mapping_get_all_by_instance(self, context, instance): + return self._manager.block_device_mapping_get_all_by_instance( + context, instance) + class API(object): """Conductor API that does updates via RPC to the ConductorManager""" @@ -249,3 +253,7 @@ class API(object): def block_device_mapping_update_or_create(self, context, values): return self.conductor_rpcapi.block_device_mapping_update_or_create( context, values) + + def block_device_mapping_get_all_by_instance(self, context, instance): + return self.conductor_rpcapi.block_device_mapping_get_all_by_instance( + context, instance) diff --git a/nova/conductor/manager.py b/nova/conductor/manager.py index 6d346b0a4..bac8207d4 100644 --- a/nova/conductor/manager.py +++ b/nova/conductor/manager.py @@ -43,7 +43,7 @@ datetime_fields = ['launched_at', 'terminated_at'] class ConductorManager(manager.SchedulerDependentManager): """Mission: TBD""" - RPC_API_VERSION = '1.12' + RPC_API_VERSION = '1.13' def __init__(self, *args, **kwargs): super(ConductorManager, self).__init__(service_name='conductor', @@ -164,3 +164,8 @@ class ConductorManager(manager.SchedulerDependentManager): self.db.block_device_mapping_create(context, values) else: self.db.block_device_mapping_update(context, values['id'], values) + + def block_device_mapping_get_all_by_instance(self, context, instance): + bdms = self.db.block_device_mapping_get_all_by_instance( + context, instance['uuid']) + return jsonutils.to_primitive(bdms) diff --git a/nova/conductor/rpcapi.py b/nova/conductor/rpcapi.py index 3e9aa44a2..fea461d26 100644 --- a/nova/conductor/rpcapi.py +++ b/nova/conductor/rpcapi.py @@ -41,6 +41,7 @@ class ConductorAPI(nova.openstack.common.rpc.proxy.RpcProxy): 1.10 - Added agent_build_get_by_triple 1.11 - Added aggregate_get 1.12 - Added block_device_mapping_update_or_create + 1.13 - Added block_device_mapping_get_all_by_instance """ BASE_RPC_API_VERSION = '1.0' @@ -152,3 +153,9 @@ class ConductorAPI(nova.openstack.common.rpc.proxy.RpcProxy): msg = self.make_msg('block_device_mapping_update_or_create', values=values, create=create) return self.call(context, msg, version='1.12') + + def block_device_mapping_get_all_by_instance(self, context, instance): + instance_p = jsonutils.to_primitive(instance) + msg = self.make_msg('block_device_mapping_get_all_by_instance', + instance=instance_p) + return self.call(context, msg, version='1.13') diff --git a/nova/tests/conductor/test_conductor.py b/nova/tests/conductor/test_conductor.py index 0d1ff1d60..4aa552cc7 100644 --- a/nova/tests/conductor/test_conductor.py +++ b/nova/tests/conductor/test_conductor.py @@ -268,6 +268,17 @@ class _BaseTestCase(object): 'fake-arch') self.assertEqual(result, 'it worked') + def test_block_device_mapping_get_all_by_instance(self): + fake_inst = {'uuid': 'fake-uuid'} + self.mox.StubOutWithMock(db, + 'block_device_mapping_get_all_by_instance') + db.block_device_mapping_get_all_by_instance( + self.context, fake_inst['uuid']).AndReturn('fake-result') + self.mox.ReplayAll() + result = self.conductor.block_device_mapping_get_all_by_instance( + self.context, fake_inst) + self.assertEqual(result, 'fake-result') + class ConductorTestCase(_BaseTestCase, test.TestCase): """Conductor Manager Tests""" |