Exception cleanup in scheduler

Fixes NoValidHost and willNotSchedule by moving them to exception.py
Removed unneeded  imports
Change-Id: Ib9bb4b36d5e4c00667bd0b2d73137ba9eac5b3b0
This commit is contained in:
Joe Gordon
2011-11-01 16:35:08 -07:00
parent e654b343a9
commit dacadbec88
10 changed files with 48 additions and 55 deletions

View File

@@ -863,3 +863,11 @@ class InsufficientFreeMemory(NovaException):
class CouldNotFetchMetrics(NovaException): class CouldNotFetchMetrics(NovaException):
message = _("Could not fetch bandwidth/cpu/disk metrics for this host.") message = _("Could not fetch bandwidth/cpu/disk metrics for this host.")
class NoValidHost(NovaException):
message = _("No valid host was found. %(reason)s")
class WillNotSchedule(NovaException):
message = _("Host %(host)s is not up or doesn't exist.")

View File

@@ -23,6 +23,7 @@ Chance (Random) Scheduler implementation
import random import random
from nova import exception
from nova.scheduler import driver from nova.scheduler import driver
@@ -35,9 +36,8 @@ class ChanceScheduler(driver.Scheduler):
elevated = context.elevated() elevated = context.elevated()
hosts = self.hosts_up(elevated, topic) hosts = self.hosts_up(elevated, topic)
if not hosts: if not hosts:
raise driver.NoValidHost(_("Scheduler was unable to locate a host" msg = _("Is the appropriate service running?")
" for this request. Is the appropriate" raise exception.NoValidHost(reason=msg)
" service running?"))
return hosts[int(random.random() * len(hosts))] return hosts[int(random.random() * len(hosts))]
def schedule(self, context, topic, method, *_args, **kwargs): def schedule(self, context, topic, method, *_args, **kwargs):

View File

@@ -71,7 +71,7 @@ class DistributedScheduler(driver.Scheduler):
NOTE: We're only focused on compute instances right now, NOTE: We're only focused on compute instances right now,
so this method will always raise NoValidHost().""" so this method will always raise NoValidHost()."""
msg = _("No host selection for %s defined." % topic) msg = _("No host selection for %s defined." % topic)
raise driver.NoValidHost(msg) raise exception.NoValidHost(reason=msg)
def schedule_run_instance(self, context, request_spec, *args, **kwargs): def schedule_run_instance(self, context, request_spec, *args, **kwargs):
"""This method is called from nova.compute.api to provision """This method is called from nova.compute.api to provision
@@ -103,7 +103,7 @@ class DistributedScheduler(driver.Scheduler):
*args, **kwargs) *args, **kwargs)
if not weighted_hosts: if not weighted_hosts:
raise driver.NoValidHost(_('No hosts were available')) raise exception.NoValidHost(reason=_(""))
instances = [] instances = []
for num in xrange(num_instances): for num in xrange(num_instances):

View File

@@ -115,16 +115,6 @@ def encode_instance(instance, local=True):
return instance return instance
class NoValidHost(exception.Error):
"""There is no valid host for the command."""
pass
class WillNotSchedule(exception.Error):
"""The specified host is not up or doesn't exist."""
pass
class Scheduler(object): class Scheduler(object):
"""The base class that all Scheduler clases should inherit from.""" """The base class that all Scheduler clases should inherit from."""
@@ -421,7 +411,7 @@ class Scheduler(object):
raise exception.MigrationError(reason=reason % locals()) raise exception.MigrationError(reason=reason % locals())
def _get_compute_info(self, context, host, key): def _get_compute_info(self, context, host, key):
"""get compute node's infomation specified by key """get compute node's information specified by key
:param context: security context :param context: security context
:param host: hostname(must be compute node) :param host: hostname(must be compute node)

View File

@@ -23,6 +23,7 @@ Simple Scheduler
from nova import db from nova import db
from nova import flags from nova import flags
from nova import exception
from nova.scheduler import driver from nova.scheduler import driver
from nova.scheduler import chance from nova.scheduler import chance
@@ -51,7 +52,7 @@ class SimpleScheduler(chance.ChanceScheduler):
if host and context.is_admin: if host and context.is_admin:
service = db.service_get_by_args(elevated, host, 'nova-compute') service = db.service_get_by_args(elevated, host, 'nova-compute')
if not self.service_is_up(service): if not self.service_is_up(service):
raise driver.WillNotSchedule(_("Host %s is not alive") % host) raise exception.WillNotSchedule(host=host)
return host return host
results = db.service_get_all_compute_sorted(elevated) results = db.service_get_all_compute_sorted(elevated)
@@ -61,12 +62,12 @@ class SimpleScheduler(chance.ChanceScheduler):
for result in results: for result in results:
(service, instance_cores) = result (service, instance_cores) = result
if instance_cores + instance_opts['vcpus'] > FLAGS.max_cores: if instance_cores + instance_opts['vcpus'] > FLAGS.max_cores:
raise driver.NoValidHost(_("All hosts have too many cores")) msg = _("All hosts have too many cores")
raise exception.NoValidHost(reason=msg)
if self.service_is_up(service): if self.service_is_up(service):
return service['host'] return service['host']
raise driver.NoValidHost(_("Scheduler was unable to locate a host" msg = _("Is the appropriate service running?")
" for this request. Is the appropriate" raise exception.NoValidHost(reason=msg)
" service running?"))
def schedule_run_instance(self, context, request_spec, *_args, **_kwargs): def schedule_run_instance(self, context, request_spec, *_args, **_kwargs):
num_instances = request_spec.get('num_instances', 1) num_instances = request_spec.get('num_instances', 1)
@@ -101,7 +102,7 @@ class SimpleScheduler(chance.ChanceScheduler):
if host and context.is_admin: if host and context.is_admin:
service = db.service_get_by_args(elevated, host, 'nova-volume') service = db.service_get_by_args(elevated, host, 'nova-volume')
if not self.service_is_up(service): if not self.service_is_up(service):
raise driver.WillNotSchedule(_("Host %s not available") % host) raise exception.WillNotSchedule(host=host)
driver.cast_to_volume_host(context, host, 'create_volume', driver.cast_to_volume_host(context, host, 'create_volume',
volume_id=volume_id, **_kwargs) volume_id=volume_id, **_kwargs)
return None return None
@@ -113,15 +114,14 @@ class SimpleScheduler(chance.ChanceScheduler):
for result in results: for result in results:
(service, volume_gigabytes) = result (service, volume_gigabytes) = result
if volume_gigabytes + volume_ref['size'] > FLAGS.max_gigabytes: if volume_gigabytes + volume_ref['size'] > FLAGS.max_gigabytes:
raise driver.NoValidHost(_("All hosts have too many " msg = _("All hosts have too many gigabytes")
"gigabytes")) raise exception.NoValidHost(reason=msg)
if self.service_is_up(service): if self.service_is_up(service):
driver.cast_to_volume_host(context, service['host'], driver.cast_to_volume_host(context, service['host'],
'create_volume', volume_id=volume_id, **_kwargs) 'create_volume', volume_id=volume_id, **_kwargs)
return None return None
raise driver.NoValidHost(_("Scheduler was unable to locate a host" msg = _("Is the appropriate service running?")
" for this request. Is the appropriate" raise exception.NoValidHost(reason=msg)
" service running?"))
def schedule_set_network_host(self, context, *_args, **_kwargs): def schedule_set_network_host(self, context, *_args, **_kwargs):
"""Picks a host that is up and has the fewest networks.""" """Picks a host that is up and has the fewest networks."""
@@ -131,11 +131,11 @@ class SimpleScheduler(chance.ChanceScheduler):
for result in results: for result in results:
(service, instance_count) = result (service, instance_count) = result
if instance_count >= FLAGS.max_networks: if instance_count >= FLAGS.max_networks:
raise driver.NoValidHost(_("All hosts have too many networks")) msg = _("All hosts have too many networks")
raise exception.NoValidHost(reason=msg)
if self.service_is_up(service): if self.service_is_up(service):
driver.cast_to_network_host(context, service['host'], driver.cast_to_network_host(context, service['host'],
'set_network_host', **_kwargs) 'set_network_host', **_kwargs)
return None return None
raise driver.NoValidHost(_("Scheduler was unable to locate a host" msg = _("Is the appropriate service running?")
" for this request. Is the appropriate" raise exception.NoValidHost(reason=msg)
" service running?"))

View File

@@ -25,6 +25,7 @@ from nova import flags
from nova import log as logging from nova import log as logging
from nova import rpc from nova import rpc
from nova import utils from nova import utils
from nova import exception
from nova.scheduler import driver from nova.scheduler import driver
from nova.scheduler import simple from nova.scheduler import simple
from nova.vsa.api import VsaState from nova.vsa.api import VsaState
@@ -173,7 +174,7 @@ class VsaScheduler(simple.SimpleScheduler):
selected_hosts, selected_hosts,
unique) unique)
if host is None: if host is None:
raise driver.WillNotSchedule(_("No available hosts")) raise exception.NoValidHost(reason=_(""))
return (host, qos_cap) return (host, qos_cap)
@@ -216,7 +217,7 @@ class VsaScheduler(simple.SimpleScheduler):
service = db.service_get_by_args(context.elevated(), host, service = db.service_get_by_args(context.elevated(), host,
'nova-volume') 'nova-volume')
if not self.service_is_up(service): if not self.service_is_up(service):
raise driver.WillNotSchedule(_("Host %s not available") % host) raise exception.WillNotSchedule(host=host)
return host return host
else: else:

View File

@@ -25,7 +25,6 @@ from nova import exception
from nova import rpc from nova import rpc
from nova import test from nova import test
from nova.compute import api as compute_api from nova.compute import api as compute_api
from nova.scheduler import driver
from nova.scheduler import distributed_scheduler from nova.scheduler import distributed_scheduler
from nova.scheduler import least_cost from nova.scheduler import least_cost
from nova.scheduler import zone_manager from nova.scheduler import zone_manager
@@ -120,7 +119,7 @@ class DistributedSchedulerTestCase(test.TestCase):
fake_context = context.RequestContext('user', 'project') fake_context = context.RequestContext('user', 'project')
request_spec = dict(instance_type=dict(memory_mb=1, local_gb=1)) request_spec = dict(instance_type=dict(memory_mb=1, local_gb=1))
self.assertRaises(driver.NoValidHost, sched.schedule_run_instance, self.assertRaises(exception.NoValidHost, sched.schedule_run_instance,
fake_context, request_spec) fake_context, request_spec)
def test_run_instance_with_blob_hint(self): def test_run_instance_with_blob_hint(self):
@@ -189,7 +188,7 @@ class DistributedSchedulerTestCase(test.TestCase):
fake_context = context.RequestContext('user', 'project') fake_context = context.RequestContext('user', 'project')
self.assertRaises(driver.NoValidHost, sched.schedule_run_instance, self.assertRaises(exception.NoValidHost, sched.schedule_run_instance,
fake_context, {}) fake_context, {})
self.assertTrue(self.was_admin) self.assertTrue(self.was_admin)

View File

@@ -444,7 +444,7 @@ class SimpleDriverTestCase(test.TestCase):
'cast_to_compute_host', _fake_cast_to_compute_host) 'cast_to_compute_host', _fake_cast_to_compute_host)
request_spec = _create_request_spec(availability_zone='nova:host1') request_spec = _create_request_spec(availability_zone='nova:host1')
self.assertRaises(driver.WillNotSchedule, self.assertRaises(exception.WillNotSchedule,
self.scheduler.driver.schedule_run_instance, self.scheduler.driver.schedule_run_instance,
self.context, self.context,
request_spec) request_spec)
@@ -523,7 +523,7 @@ class SimpleDriverTestCase(test.TestCase):
compute1.start() compute1.start()
request_spec = _create_request_spec(availability_zone='zone2') request_spec = _create_request_spec(availability_zone='zone2')
try: try:
self.assertRaises(driver.NoValidHost, self.assertRaises(exception.NoValidHost,
self.scheduler.driver.schedule_run_instance, self.scheduler.driver.schedule_run_instance,
self.context, self.context,
request_spec) request_spec)
@@ -540,7 +540,7 @@ class SimpleDriverTestCase(test.TestCase):
# uses 'nova' for zone # uses 'nova' for zone
volume_id = _create_volume() volume_id = _create_volume()
try: try:
self.assertRaises(driver.NoValidHost, self.assertRaises(exception.NoValidHost,
self.scheduler.driver.schedule_create_volume, self.scheduler.driver.schedule_create_volume,
self.context, self.context,
volume_id) volume_id)
@@ -570,7 +570,7 @@ class SimpleDriverTestCase(test.TestCase):
compute2.run_instance(self.context, instance_id) compute2.run_instance(self.context, instance_id)
instance_ids2.append(instance_id) instance_ids2.append(instance_id)
request_spec = _create_request_spec() request_spec = _create_request_spec()
self.assertRaises(driver.NoValidHost, self.assertRaises(exception.NoValidHost,
self.scheduler.driver.schedule_run_instance, self.scheduler.driver.schedule_run_instance,
self.context, self.context,
request_spec) request_spec)
@@ -694,7 +694,7 @@ class SimpleDriverTestCase(test.TestCase):
past = now - delta past = now - delta
db.service_update(self.context, s1['id'], {'updated_at': past}) db.service_update(self.context, s1['id'], {'updated_at': past})
request_spec = _create_request_spec(availability_zone='nova:host1') request_spec = _create_request_spec(availability_zone='nova:host1')
self.assertRaises(driver.WillNotSchedule, self.assertRaises(exception.WillNotSchedule,
self.scheduler.driver.schedule_run_instance, self.scheduler.driver.schedule_run_instance,
self.context, self.context,
request_spec) request_spec)
@@ -749,7 +749,7 @@ class SimpleDriverTestCase(test.TestCase):
request_spec = _create_request_spec() request_spec = _create_request_spec()
self.assertRaises(driver.NoValidHost, self.assertRaises(exception.NoValidHost,
self.scheduler.driver.schedule_run_instance, self.scheduler.driver.schedule_run_instance,
self.context, self.context,
request_spec) request_spec)
@@ -795,7 +795,7 @@ class SimpleDriverTestCase(test.TestCase):
volume2.create_volume(self.context, volume_id) volume2.create_volume(self.context, volume_id)
volume_ids2.append(volume_id) volume_ids2.append(volume_id)
volume_id = _create_volume() volume_id = _create_volume()
self.assertRaises(driver.NoValidHost, self.assertRaises(exception.NoValidHost,
self.scheduler.driver.schedule_create_volume, self.scheduler.driver.schedule_create_volume,
self.context, self.context,
volume_id) volume_id)
@@ -929,7 +929,7 @@ class SimpleDriverTestCase(test.TestCase):
db.service_destroy(self.context, s_ref['id']) db.service_destroy(self.context, s_ref['id'])
def test_live_migration_dest_check_service_same_host(self): def test_live_migration_dest_check_service_same_host(self):
"""Confirms exceptioin raises in case dest and src is same host.""" """Confirms exception raises in case dest and src is same host."""
instance_id = _create_instance()['id'] instance_id = _create_instance()['id']
i_ref = db.instance_get(self.context, instance_id) i_ref = db.instance_get(self.context, instance_id)
s_ref = self._create_compute_service(host=i_ref['host']) s_ref = self._create_compute_service(host=i_ref['host'])

View File

@@ -28,7 +28,6 @@ from nova import utils
from nova.volume import volume_types from nova.volume import volume_types
from nova.scheduler import vsa as vsa_sched from nova.scheduler import vsa as vsa_sched
from nova.scheduler import driver
FLAGS = flags.FLAGS FLAGS = flags.FLAGS
LOG = logging.getLogger('nova.tests.scheduler.vsa') LOG = logging.getLogger('nova.tests.scheduler.vsa')
@@ -274,7 +273,7 @@ class VsaSchedulerTestCase(test.TestCase):
drive_type_num=5, drive_type_num=5,
init_num_drives=1) init_num_drives=1)
request_spec = self._get_vol_creation_request(num_vols=1, drive_ix=6) request_spec = self._get_vol_creation_request(num_vols=1, drive_ix=6)
self.assertRaises(driver.WillNotSchedule, self.assertRaises(exception.NoValidHost,
self.sched.schedule_create_volumes, self.sched.schedule_create_volumes,
self.context, self.context,
request_spec, request_spec,
@@ -291,7 +290,7 @@ class VsaSchedulerTestCase(test.TestCase):
prev = self._generate_default_service_states() prev = self._generate_default_service_states()
request_spec = self._get_vol_creation_request(num_vols=3, drive_ix=0) request_spec = self._get_vol_creation_request(num_vols=3, drive_ix=0)
self.assertRaises(driver.WillNotSchedule, self.assertRaises(exception.NoValidHost,
self.sched.schedule_create_volumes, self.sched.schedule_create_volumes,
self.context, self.context,
request_spec, request_spec,
@@ -314,7 +313,7 @@ class VsaSchedulerTestCase(test.TestCase):
self.service_states = new_states self.service_states = new_states
request_spec = self._get_vol_creation_request(num_vols=1, drive_ix=0) request_spec = self._get_vol_creation_request(num_vols=1, drive_ix=0)
self.assertRaises(driver.WillNotSchedule, self.assertRaises(exception.NoValidHost,
self.sched.schedule_create_volumes, self.sched.schedule_create_volumes,
self.context, self.context,
request_spec, request_spec,
@@ -365,7 +364,7 @@ class VsaSchedulerTestCase(test.TestCase):
availability_zone=None) availability_zone=None)
self._print_service_states() self._print_service_states()
self.assertRaises(driver.WillNotSchedule, self.assertRaises(exception.NoValidHost,
self.sched.schedule_create_volumes, self.sched.schedule_create_volumes,
self.context, self.context,
new_request, new_request,
@@ -393,7 +392,7 @@ class VsaSchedulerTestCase(test.TestCase):
self.stubs.Set(self.sched, self.stubs.Set(self.sched,
'service_is_up', self._fake_service_is_up_False) 'service_is_up', self._fake_service_is_up_False)
self.assertRaises(driver.WillNotSchedule, self.assertRaises(exception.WillNotSchedule,
self.sched.schedule_create_volumes, self.sched.schedule_create_volumes,
self.context, self.context,
request_spec, request_spec,
@@ -483,7 +482,7 @@ class VsaSchedulerTestCase(test.TestCase):
global_volume = {} global_volume = {}
global_volume['volume_type_id'] = None global_volume['volume_type_id'] = None
self.assertRaises(driver.NoValidHost, self.assertRaises(exception.NoValidHost,
self.sched.schedule_create_volume, self.sched.schedule_create_volume,
self.context, self.context,
123, 123,

View File

@@ -19,11 +19,7 @@
Tests For misc util methods used with compute. Tests For misc util methods used with compute.
""" """
from datetime import datetime
from datetime import timedelta
from nova import db from nova import db
from nova import exception
from nova import flags from nova import flags
from nova import context from nova import context
from nova import test from nova import test