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 2826e862d7
commit 1c389d0bd8
14 changed files with 48 additions and 65 deletions

View File

@@ -23,9 +23,7 @@ from nova import compute
from nova import exception from nova import exception
from nova import flags from nova import flags
from nova import log as logging from nova import log as logging
from nova import utils
from nova.api.openstack import extensions from nova.api.openstack import extensions
from nova.api.openstack import faults
from nova.scheduler import api as scheduler_api from nova.scheduler import api as scheduler_api

View File

@@ -16,14 +16,10 @@
"""The deferred instance delete extension.""" """The deferred instance delete extension."""
import webob import webob
from webob import exc
from nova import compute from nova import compute
from nova import exception
from nova import log as logging from nova import log as logging
from nova.api.openstack import common
from nova.api.openstack import extensions from nova.api.openstack import extensions
from nova.api.openstack import faults
from nova.api.openstack import servers from nova.api.openstack import servers

View File

@@ -14,7 +14,6 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License # under the License
import json
from webob import exc from webob import exc
import webob import webob
@@ -23,8 +22,6 @@ from nova import compute
from nova import exception from nova import exception
import nova.image import nova.image
from nova import log as logging from nova import log as logging
from nova import network
from nova import rpc
from nova.api.openstack import extensions from nova.api.openstack import extensions
from nova.api.openstack import wsgi from nova.api.openstack import wsgi

View File

@@ -16,7 +16,6 @@
# under the License. # under the License.
import datetime import datetime
import time
from nova.api.openstack import common from nova.api.openstack import common
from nova import utils from nova import utils

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