summaryrefslogtreecommitdiffstats
path: root/nova/scheduler
diff options
context:
space:
mode:
Diffstat (limited to 'nova/scheduler')
-rw-r--r--nova/scheduler/chance.py11
-rw-r--r--nova/scheduler/driver.py9
-rw-r--r--nova/scheduler/filter_scheduler.py16
-rw-r--r--nova/scheduler/manager.py13
-rw-r--r--nova/scheduler/rpcapi.py7
-rw-r--r--nova/scheduler/utils.py3
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)