diff options
author | Russell Bryant <rbryant@redhat.com> | 2012-08-03 18:09:07 -0400 |
---|---|---|
committer | Russell Bryant <rbryant@redhat.com> | 2012-08-06 15:09:33 -0400 |
commit | 7677354e3ba0954158d33feef3667b0fe7dcc2a3 (patch) | |
tree | 25f152af92fbdcbba280c7a103de4e70b5a0354e /nova/compute | |
parent | 7c4ab6820d42768ac5055ca3c8e0b272358bd43d (diff) | |
download | nova-7677354e3ba0954158d33feef3667b0fe7dcc2a3.tar.gz nova-7677354e3ba0954158d33feef3667b0fe7dcc2a3.tar.xz nova-7677354e3ba0954158d33feef3667b0fe7dcc2a3.zip |
Send full instance to run_instance.
This patch updates run_instance in the compute manager to take a full
instance instead of just an instance UUID. This reduces db access
required by the compute nodes. The scheduler code needed some work here
as well since it wasn't using the compute rpcapi for calling
run_instance.
Part of blueprint no-db-messaging.
Change-Id: If5545748122b4ff9e2da6788cbd4b0fa26c4db99
Diffstat (limited to 'nova/compute')
-rw-r--r-- | nova/compute/manager.py | 27 | ||||
-rw-r--r-- | nova/compute/rpcapi.py | 14 |
2 files changed, 30 insertions, 11 deletions
diff --git a/nova/compute/manager.py b/nova/compute/manager.py index f6e3ff9cf..f34a4aea8 100644 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -273,7 +273,7 @@ def _get_image_meta(context, image_ref): class ComputeManager(manager.SchedulerDependentManager): """Manages the running instances from creation to destruction.""" - RPC_API_VERSION = '1.38' + RPC_API_VERSION = '1.39' def __init__(self, compute_driver=None, *args, **kwargs): """Load configuration options and connect to the hypervisor.""" @@ -496,13 +496,20 @@ class ComputeManager(manager.SchedulerDependentManager): 'block_device_mapping': block_device_mapping } - def _run_instance(self, context, instance_uuid, request_spec, + def _run_instance(self, context, request_spec, filter_properties, requested_networks, injected_files, - admin_password, is_first_time): + admin_password, is_first_time, instance, instance_uuid): """Launch a new instance with specified options.""" context = context.elevated() + + if not instance: + try: + instance = self.db.instance_get_by_uuid(context, instance_uuid) + except exception.InstanceNotFound: + LOG.warn(_("Instance not found."), instance_uuid=instance_uuid) + return + try: - instance = self.db.instance_get_by_uuid(context, instance_uuid) self._check_instance_not_already_created(context, instance) image_meta = self._check_image_size(context, instance) extra_usage_info = {"image_name": image_meta['name']} @@ -533,11 +540,9 @@ class ComputeManager(manager.SchedulerDependentManager): self._notify_about_instance_usage(context, instance, "create.end", network_info=network_info, extra_usage_info=extra_usage_info) - except exception.InstanceNotFound: - LOG.warn(_("Instance not found."), instance_uuid=instance_uuid) except Exception: with excutils.save_and_reraise_exception(): - self._set_instance_error_state(context, instance_uuid) + self._set_instance_error_state(context, instance['uuid']) def _reschedule_or_reraise(self, context, instance, requested_networks, admin_password, injected_files, is_first_time, @@ -824,15 +829,15 @@ class ComputeManager(manager.SchedulerDependentManager): @exception.wrap_exception(notifier=notifier, publisher_id=publisher_id()) @wrap_instance_fault - def run_instance(self, context, instance_uuid, request_spec=None, + def run_instance(self, context, request_spec=None, filter_properties={}, requested_networks=None, injected_files=[], admin_password=None, - is_first_time=False): + is_first_time=False, instance=None, instance_uuid=None): @utils.synchronized(instance_uuid) def do_run_instance(): - self._run_instance(context, instance_uuid, request_spec, + self._run_instance(context, request_spec, filter_properties, requested_networks, injected_files, - admin_password, is_first_time) + admin_password, is_first_time, instance, instance_uuid) do_run_instance() def _shutdown_instance(self, context, instance): diff --git a/nova/compute/rpcapi.py b/nova/compute/rpcapi.py index 517cfca4d..72babd380 100644 --- a/nova/compute/rpcapi.py +++ b/nova/compute/rpcapi.py @@ -117,6 +117,7 @@ class ComputeAPI(nova.openstack.common.rpc.proxy.RpcProxy): - remove instance_uuid, add instance - remove instance_type_id, add instance_type - remove topic, it was unused + 1.39 - Remove instance_uuid, add instance argument to run_instance() ''' BASE_RPC_API_VERSION = '1.0' @@ -422,6 +423,19 @@ class ComputeAPI(nova.openstack.common.rpc.proxy.RpcProxy): topic=_compute_topic(self.topic, ctxt, host, None), version='1.32') + def run_instance(self, ctxt, instance, host, request_spec, + filter_properties, requested_networks, + injected_files, admin_password, + is_first_time): + instance_p = jsonutils.to_primitive(instance) + self.cast(ctxt, self.make_msg('run_instance', instance=instance_p, + request_spec=request_spec, filter_properties=filter_properties, + requested_networks=requested_networks, + injected_files=injected_files, admin_password=admin_password, + is_first_time=is_first_time), + topic=_compute_topic(self.topic, ctxt, host, None), + version='1.39') + def set_admin_password(self, ctxt, instance, new_pass): instance_p = jsonutils.to_primitive(instance) return self.call(ctxt, self.make_msg('set_admin_password', |