diff options
Diffstat (limited to 'nova/scheduler')
-rw-r--r-- | nova/scheduler/chance.py | 11 | ||||
-rw-r--r-- | nova/scheduler/driver.py | 9 | ||||
-rw-r--r-- | nova/scheduler/filter_scheduler.py | 16 | ||||
-rw-r--r-- | nova/scheduler/manager.py | 13 | ||||
-rw-r--r-- | nova/scheduler/rpcapi.py | 7 | ||||
-rw-r--r-- | nova/scheduler/utils.py | 3 |
6 files changed, 58 insertions, 1 deletions
diff --git a/nova/scheduler/chance.py b/nova/scheduler/chance.py index f0b1701e0..41a69d21e 100644 --- a/nova/scheduler/chance.py +++ b/nova/scheduler/chance.py @@ -72,6 +72,17 @@ class ChanceScheduler(driver.Scheduler): raise exception.NoValidHost(reason="") return hosts + def select_destinations(self, context, request_spec, filter_properties): + """Selects random destinations.""" + num_instances = request_spec['num_instances'] + # NOTE(alaski): Returns a list of tuples for compatibility with + # filter_scheduler + dests = [(self._schedule(context, CONF.compute_topic, request_spec, + filter_properties), None) for i in range(num_instances)] + if len(dests) < num_instances: + raise exception.NoValidHost(reason='') + return dests + def schedule_run_instance(self, context, request_spec, admin_password, injected_files, requested_networks, is_first_time, diff --git a/nova/scheduler/driver.py b/nova/scheduler/driver.py index c4265285f..765aede10 100644 --- a/nova/scheduler/driver.py +++ b/nova/scheduler/driver.py @@ -158,6 +158,15 @@ class Scheduler(object): msg = _("Driver must implement schedule_run_instance") raise NotImplementedError(msg) + def select_destinations(self, context, request_spec, filter_properties): + """Must override select_destinations method. + + :return: A list of (host, node) tuples that satisifies the request_spec + and filter_properties. + """ + msg = _("Driver must implement select_destinations") + raise NotImplementedError(msg) + def select_hosts(self, context, request_spec, filter_properties): """Must override select_hosts method for scheduler to work.""" msg = _("Driver must implement select_hosts") diff --git a/nova/scheduler/filter_scheduler.py b/nova/scheduler/filter_scheduler.py index 4e5662e65..103aec940 100644 --- a/nova/scheduler/filter_scheduler.py +++ b/nova/scheduler/filter_scheduler.py @@ -161,6 +161,22 @@ class FilterScheduler(driver.Scheduler): raise exception.NoValidHost(reason="") return hosts + def select_destinations(self, context, request_spec, filter_properties): + """Selects a filtered set of hosts and nodes.""" + num_instances = request_spec['num_instances'] + instance_uuids = request_spec.get('instance_uuids') + selected_hosts = self._schedule(context, request_spec, + filter_properties, instance_uuids) + + # Couldn't fulfill the request_spec + if len(selected_hosts) < num_instances: + raise exception.NoValidHost(reason='') + + dests = [] + for host in selected_hosts: + dests.append((host.obj.host, host.obj.nodename)) + return dests + def _provision_resource(self, context, weighed_host, request_spec, filter_properties, requested_networks, injected_files, admin_password, is_first_time, instance_uuid=None): diff --git a/nova/scheduler/manager.py b/nova/scheduler/manager.py index ea099ca2d..9d54a153e 100644 --- a/nova/scheduler/manager.py +++ b/nova/scheduler/manager.py @@ -57,7 +57,7 @@ QUOTAS = quota.QUOTAS class SchedulerManager(manager.Manager): """Chooses a host to run instances on.""" - RPC_API_VERSION = '2.6' + RPC_API_VERSION = '2.7' def __init__(self, scheduler_driver=None, *args, **kwargs): if not scheduler_driver: @@ -275,3 +275,14 @@ class SchedulerManager(manager.Manager): hosts = self.driver.select_hosts(context, request_spec, filter_properties) return jsonutils.to_primitive(hosts) + + @rpc_common.client_exceptions(exception.NoValidHost) + def select_destinations(self, context, request_spec, filter_properties): + """Returns destinations(s) best suited for this request_spec and + filter_properties. + + The result should be a list of (host, nodename) tuples. + """ + dests = self.driver.select_destinations(context, request_spec, + filter_properties) + return jsonutils.to_primitive(dests) diff --git a/nova/scheduler/rpcapi.py b/nova/scheduler/rpcapi.py index 369363bb4..9cd7a28b6 100644 --- a/nova/scheduler/rpcapi.py +++ b/nova/scheduler/rpcapi.py @@ -67,6 +67,8 @@ class SchedulerAPI(nova.openstack.common.rpc.proxy.RpcProxy): ... Grizzly supports message version 2.6. So, any changes to existing methods in 2.x after that point should be done such that they can handle the version_cap being set to 2.6. + + 2.7 - Add select_destinations() ''' # @@ -90,6 +92,11 @@ class SchedulerAPI(nova.openstack.common.rpc.proxy.RpcProxy): default_version=self.BASE_RPC_API_VERSION, version_cap=version_cap) + def select_destinations(self, ctxt, request_spec, filter_properties): + return self.call(ctxt, self.make_msg('select_destinations', + request_spec=request_spec, filter_properties=filter_properties), + version='2.7') + def run_instance(self, ctxt, request_spec, admin_password, injected_files, requested_networks, is_first_time, filter_properties): diff --git a/nova/scheduler/utils.py b/nova/scheduler/utils.py index d0a9d7ca5..eeb68f439 100644 --- a/nova/scheduler/utils.py +++ b/nova/scheduler/utils.py @@ -44,6 +44,9 @@ def build_request_spec(ctxt, image, instances): 'image': image, 'instance_properties': instance, 'instance_type': instance_type, + 'num_instances': len(instances), + # NOTE(alaski): This should be removed as logic moves from the + # scheduler to conductor. Provides backwards compatibility now. 'instance_uuids': [inst['uuid'] for inst in instances]} return jsonutils.to_primitive(request_spec) |