Fix Manager exceptions rendering for end-users

Manager Exceptions were not properly catched by API, so consequently
placed them all in one global Manager exceptions file and parsing
it for knowing if it's a Climate Exception

Also partially fixes #1257204

Closes-Bug: #1263116

Partial-Bug: #1257204

Change-Id: Ic488ceab6ea6bed1ae2b1528e08810edfffde5be
Implements: bp:
This commit is contained in:
Sylvain Bauza 2013-12-20 17:17:16 +01:00
parent d70eb25e02
commit b35935753b
8 changed files with 166 additions and 122 deletions

View File

@ -20,9 +20,11 @@ from werkzeug import datastructures
from climate.api import context from climate.api import context
from climate import exceptions as ex from climate import exceptions as ex
from climate.manager import exceptions as manager_exceptions
from climate.openstack.common.deprecated import wsgi from climate.openstack.common.deprecated import wsgi
from climate.openstack.common.gettextutils import _ # noqa from climate.openstack.common.gettextutils import _ # noqa
from climate.openstack.common import log as logging from climate.openstack.common import log as logging
from climate.openstack.common.rpc import common as rpc_common
LOG = logging.getLogger(__name__) LOG = logging.getLogger(__name__)
@ -73,6 +75,18 @@ class Rest(flask.Blueprint):
return func(**kwargs) return func(**kwargs)
except ex.ClimateException as e: except ex.ClimateException as e:
return bad_request(e) return bad_request(e)
except rpc_common.RemoteError as e:
try:
# NOTE(sbauza): All Manager Exceptions should be
# defined in climate.manager.exceptions
cls = getattr(manager_exceptions, e.exc_type)
except AttributeError:
# We obfuscate all Exceptions but Climate ones for
# security reasons
return internal_error(500, 'Internal Server Error',
e)
return render_error_message(cls.code, e.value,
cls.code)
except Exception as e: except Exception as e:
return internal_error(500, 'Internal Server Error', e) return internal_error(500, 'Internal Server Error', e)

View File

@ -0,0 +1,73 @@
# Copyright (c) 2013 Bull.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from climate import exceptions
from climate.openstack.common.gettextutils import _ # noqa
class NoFreePool(exceptions.NotFound):
msg_fmt = _("No Freepool found")
class HostNotInFreePool(exceptions.NotFound):
msg_fmt = _("Host %(host)s not in freepool '%(freepool_name)s'")
class CantRemoveHost(exceptions.ClimateException):
code = 409
msg_fmt = _("Can't remove host(s) %(host)s from Aggregate %(pool)s")
class CantAddHost(exceptions.ClimateException):
code = 409
msg_fmt = _("Can't add host(s) %(host)s to Aggregate %(pool)s")
class AggregateHaveHost(exceptions.ClimateException):
code = 409
msg_fmt = _("Can't delete Aggregate '%(name)s', "
"host(s) attached to it : %(hosts)s")
class AggregateAlreadyHasHost(exceptions.ClimateException):
code = 409
msg_fmt = _("Aggregate %(pool)s already has host(s) %(host)s ")
class AggregateNotFound(exceptions.NotFound):
msg_fmt = _("Aggregate '%(pool)s' not found!")
class HostNotFound(exceptions.NotFound):
msg_fmt = _("Host '%(host)s' not found!")
class InvalidHost(exceptions.NotAuthorized):
msg_fmt = _("Invalid values for host %(host)s")
class MultipleHostsFound(exceptions.ClimateException):
code = 409
msg_fmt = _("Multiple Hosts found for pattern '%(host)s'")
class HostHavingServers(exceptions.ClimateException):
code = 409
msg_fmt = _("Servers [%(servers)s] found for host %(host)s")
class CantAddExtraCapability(exceptions.ClimateException):
code = 409
msg_fmt = _("Can't add extracapabilities %(keys)s to Host %(host)s")

View File

@ -18,24 +18,7 @@ from novaclient import exceptions as nova_exceptions
from oslo.config import cfg from oslo.config import cfg
from climate import context from climate import context
from climate import exceptions from climate.manager import exceptions as manager_exceptions
from climate.openstack.common.gettextutils import _ # noqa
class HostNotFound(exceptions.ClimateException):
msg_fmt = _("Host '%(host)s' not found!")
class InvalidHost(exceptions.ClimateException):
msg_fmt = _("Invalid values for host %(host)s")
class MultipleHostsFound(exceptions.ClimateException):
msg_fmt = _("Multiple Hosts found for pattern '%(host)s'")
class HostHavingServers(exceptions.ClimateException):
msg_fmt = _("Servers [%(servers)s] found for host %(host)s")
class NovaInventory(object): class NovaInventory(object):
@ -64,9 +47,9 @@ class NovaInventory(object):
try: try:
hypervisors_list = self.nova.hypervisors.search(host) hypervisors_list = self.nova.hypervisors.search(host)
except nova_exceptions.NotFound: except nova_exceptions.NotFound:
raise HostNotFound(host=host) raise manager_exceptions.HostNotFound(host=host)
if len(hypervisors_list) > 1: if len(hypervisors_list) > 1:
raise MultipleHostsFound(host) raise manager_exceptions.MultipleHostsFound(host)
else: else:
hypervisor_id = hypervisors_list[0].id hypervisor_id = hypervisors_list[0].id
# NOTE(sbauza): No need to catch the exception as we're sure # NOTE(sbauza): No need to catch the exception as we're sure
@ -82,7 +65,7 @@ class NovaInventory(object):
'memory_mb': hypervisor.memory_mb, 'memory_mb': hypervisor.memory_mb,
'local_gb': hypervisor.local_gb} 'local_gb': hypervisor.local_gb}
except AttributeError: except AttributeError:
raise InvalidHost(host=host) raise manager_exceptions.InvalidHost(host=host)
def get_servers_per_host(self, host): def get_servers_per_host(self, host):
"""List all servers of a nova-compute host """List all servers of a nova-compute host
@ -93,9 +76,9 @@ class NovaInventory(object):
try: try:
hypervisors_list = self.nova.hypervisors.search(host, servers=True) hypervisors_list = self.nova.hypervisors.search(host, servers=True)
except nova_exceptions.NotFound: except nova_exceptions.NotFound:
raise HostNotFound(host=host) raise manager_exceptions.HostNotFound(host=host)
if len(hypervisors_list) > 1: if len(hypervisors_list) > 1:
raise MultipleHostsFound(host) raise manager_exceptions.MultipleHostsFound(host)
else: else:
try: try:
return hypervisors_list[0].servers return hypervisors_list[0].servers

View File

@ -21,8 +21,7 @@ from novaclient import exceptions as nova_exceptions
from oslo.config import cfg from oslo.config import cfg
from climate import context from climate import context
from climate import exceptions from climate.manager import exceptions as manager_exceptions
from climate.openstack.common.gettextutils import _ # noqa
from climate.openstack.common import log as logging from climate.openstack.common import log as logging
@ -47,35 +46,6 @@ opts = [
cfg.CONF.register_opts(opts, 'physical:host') cfg.CONF.register_opts(opts, 'physical:host')
class NoFreePool(exceptions.ClimateException):
pass
class HostNotInFreePool(exceptions.ClimateException):
msg_fmt = _("Host %(host)s not in freepool '%(freepool_name)s'")
class CantRemoveHost(exceptions.ClimateException):
msg_fmt = _("Can't remove host(s) %(host)s from Aggregate %(pool)s")
class CantAddHost(exceptions.ClimateException):
msg_fmt = _("Can't add host(s) %(host)s to Aggregate %(pool)s")
class AggregateHaveHost(exceptions.ClimateException):
msg_fmt = _("Can't delete Aggregate '%(name)s', "
"host(s) attached to it : %(hosts)s")
class AggregateNotFound(exceptions.ClimateException):
msg_fmt = _("Aggregate '%(pool)s' not found!")
class HostNotFound(exceptions.ClimateException):
msg_fmt = _("Host '%(host)s' not found!")
class ReservationPool(object): class ReservationPool(object):
def __init__(self): def __init__(self):
self.ctx = context.current() self.ctx = context.current()
@ -118,7 +88,7 @@ class ReservationPool(object):
if aggregate: if aggregate:
return aggregate return aggregate
else: else:
raise AggregateNotFound(pool=aggregate_obj) raise manager_exceptions.AggregateNotFound(pool=aggregate_obj)
@staticmethod @staticmethod
def _generate_aggregate_name(): def _generate_aggregate_name():
@ -164,12 +134,12 @@ class ReservationPool(object):
hosts = agg.hosts hosts = agg.hosts
if len(hosts) > 0 and not force: if len(hosts) > 0 and not force:
raise AggregateHaveHost(name=agg.name, hosts=agg.hosts) raise manager_exceptions.AggregateHaveHost(name=agg.name,
hosts=agg.hosts)
try: try:
freepool_agg = self.get(self.freepool_name) freepool_agg = self.get(self.freepool_name)
except AggregateNotFound: except manager_exceptions.AggregateNotFound:
raise NoFreePool() raise manager_exceptions.NoFreePool()
for host in hosts: for host in hosts:
LOG.debug("Removing host '%s' from aggregate " LOG.debug("Removing host '%s' from aggregate "
"'%s')" % (host, agg.id)) "'%s')" % (host, agg.id))
@ -196,7 +166,7 @@ class ReservationPool(object):
try: try:
agg = self.get_aggregate_from_name_or_id(pool) agg = self.get_aggregate_from_name_or_id(pool)
return agg.hosts return agg.hosts
except AggregateNotFound: except manager_exceptions.AggregateNotFound:
return [] return []
def add_computehost(self, pool, host): def add_computehost(self, pool, host):
@ -213,25 +183,28 @@ class ReservationPool(object):
try: try:
freepool_agg = self.get(self.freepool_name) freepool_agg = self.get(self.freepool_name)
except AggregateNotFound: except manager_exceptions.AggregateNotFound:
raise NoFreePool() raise manager_exceptions.NoFreePool()
if freepool_agg.id != agg.id: if freepool_agg.id != agg.id:
if host not in freepool_agg.hosts: if host not in freepool_agg.hosts:
raise HostNotInFreePool(host=host, raise manager_exceptions.HostNotInFreePool(
freepool_name=freepool_agg.name) host=host, freepool_name=freepool_agg.name)
LOG.info("removing host '%s' " LOG.info("removing host '%s' "
"from aggregate freepool %s" % (host, freepool_agg.name)) "from aggregate freepool %s" % (host, freepool_agg.name))
try: try:
self.remove_computehost(freepool_agg.id, host) self.remove_computehost(freepool_agg.id, host)
except nova_exceptions.NotFound: except nova_exceptions.NotFound:
raise HostNotFound(host=host) raise manager_exceptions.HostNotFound(host=host)
LOG.info("adding host '%s' to aggregate %s" % (host, agg.id)) LOG.info("adding host '%s' to aggregate %s" % (host, agg.id))
try: try:
return self.nova.aggregates.add_host(agg.id, host) return self.nova.aggregates.add_host(agg.id, host)
except nova_exceptions.NotFound: except nova_exceptions.NotFound:
raise HostNotFound(host=host) raise manager_exceptions.HostNotFound(host=host)
except nova_exceptions.Conflict:
raise manager_exceptions.AggregateAlreadyHasHost(pool=pool,
host=host)
def remove_all_computehosts(self, pool): def remove_all_computehosts(self, pool):
"""Remove all compute hosts attached to an aggregate.""" """Remove all compute hosts attached to an aggregate."""
@ -249,8 +222,8 @@ class ReservationPool(object):
try: try:
freepool_agg = self.get(self.freepool_name) freepool_agg = self.get(self.freepool_name)
except AggregateNotFound: except manager_exceptions.AggregateNotFound:
raise NoFreePool() raise manager_exceptions.NoFreePool()
hosts_failing_to_remove = [] hosts_failing_to_remove = []
hosts_failing_to_add = [] hosts_failing_to_add = []
@ -273,12 +246,14 @@ class ReservationPool(object):
hosts_failing_to_add.append(host) hosts_failing_to_add.append(host)
if hosts_failing_to_remove: if hosts_failing_to_remove:
raise CantRemoveHost(host=hosts_failing_to_remove, pool=agg) raise manager_exceptions.CantRemoveHost(
host=hosts_failing_to_remove, pool=agg)
if hosts_failing_to_add: if hosts_failing_to_add:
raise CantAddHost(host=hosts_failing_to_add, pool=freepool_agg) raise manager_exceptions.CantAddHost(host=hosts_failing_to_add,
pool=freepool_agg)
if hosts_not_in_freepool: if hosts_not_in_freepool:
raise HostNotInFreePool(host=hosts_not_in_freepool, raise manager_exceptions.HostNotInFreePool(
freepool_name=freepool_agg.name) host=hosts_not_in_freepool, freepool_name=freepool_agg.name)
def add_project(self, pool, project_id): def add_project(self, pool, project_id):
"""Add a project to an aggregate.""" """Add a project to an aggregate."""

View File

@ -18,18 +18,13 @@ from oslo.config import cfg
from climate import context from climate import context
from climate.db import api as db_api from climate.db import api as db_api
from climate import exceptions from climate.manager import exceptions as manager_exceptions
from climate.openstack.common.gettextutils import _ # noqa
from climate.plugins import base from climate.plugins import base
from climate.plugins.oshosts import nova_inventory from climate.plugins.oshosts import nova_inventory
from climate.plugins.oshosts import reservation_pool as rp from climate.plugins.oshosts import reservation_pool as rp
from climate.utils import service as service_utils from climate.utils import service as service_utils
class CantAddExtraCapability(exceptions.ClimateException):
msg_fmt = _("Can't add extracapabilities %(keys)s to Host %(host)s")
class PhysicalHostPlugin(base.BasePlugin): class PhysicalHostPlugin(base.BasePlugin):
"""Plugin for physical host resource.""" """Plugin for physical host resource."""
resource_type = 'physical:host' resource_type = 'physical:host'
@ -62,7 +57,7 @@ class PhysicalHostPlugin(base.BasePlugin):
try: try:
self.pool.get_aggregate_from_name_or_id(self.freepool_name) self.pool.get_aggregate_from_name_or_id(self.freepool_name)
return True return True
except rp.AggregateNotFound: except manager_exceptions.AggregateNotFound:
return False return False
def _get_extra_capabilities(self, host_id): def _get_extra_capabilities(self, host_id):
@ -102,11 +97,11 @@ class PhysicalHostPlugin(base.BasePlugin):
host_ref = host_id or host_name host_ref = host_id or host_name
if host_ref is None: if host_ref is None:
raise nova_inventory.InvalidHost(host=host_values) raise manager_exceptions.InvalidHost(host=host_values)
servers = self.inventory.get_servers_per_host(host_ref) servers = self.inventory.get_servers_per_host(host_ref)
if servers: if servers:
raise nova_inventory.HostHavingServers(host=host_ref, raise manager_exceptions.HostHavingServers(host=host_ref,
servers=servers) servers=servers)
host_details = self.inventory.get_host_details(host_ref) host_details = self.inventory.get_host_details(host_ref)
# NOTE(sbauza): Only last duplicate name for same extra capability will # NOTE(sbauza): Only last duplicate name for same extra capability will
# be stored # be stored
@ -134,8 +129,8 @@ class PhysicalHostPlugin(base.BasePlugin):
except RuntimeError: except RuntimeError:
cantaddextracapability.append(key) cantaddextracapability.append(key)
if cantaddextracapability: if cantaddextracapability:
raise CantAddExtraCapability(keys=cantaddextracapability, raise manager_exceptions.CantAddExtraCapability(
host=host['id']) keys=cantaddextracapability, host=host['id'])
if host: if host:
return self.get_computehost(host['id']) return self.get_computehost(host['id'])
else: else:
@ -161,8 +156,8 @@ class PhysicalHostPlugin(base.BasePlugin):
cantupdateextracapability.append( cantupdateextracapability.append(
raw_capability['capability_name']) raw_capability['capability_name'])
if cantupdateextracapability: if cantupdateextracapability:
raise CantAddExtraCapability(host=host_id, raise manager_exceptions.CantAddExtraCapability(
keys=cantupdateextracapability) host=host_id, keys=cantupdateextracapability)
return self.get_computehost(host_id) return self.get_computehost(host_id)
@service_utils.export_context @service_utils.export_context
@ -171,11 +166,11 @@ class PhysicalHostPlugin(base.BasePlugin):
# - Check if no leases having this host scheduled # - Check if no leases having this host scheduled
servers = self.inventory.get_servers_per_host(host_id) servers = self.inventory.get_servers_per_host(host_id)
if servers: if servers:
raise nova_inventory.HostHavingServers(host=host_id, raise manager_exceptions.HostHavingServers(host=host_id,
servers=servers) servers=servers)
host = db_api.host_get(host_id) host = db_api.host_get(host_id)
if not host: if not host:
raise rp.HostNotFound(host=host_id) raise manager_exceptions.HostNotFound(host=host_id)
try: try:
self.pool.remove_computehost(self.freepool_name, self.pool.remove_computehost(self.freepool_name,
host['hypervisor_hostname']) host['hypervisor_hostname'])
@ -184,4 +179,5 @@ class PhysicalHostPlugin(base.BasePlugin):
db_api.host_destroy(host_id) db_api.host_destroy(host_id)
except RuntimeError: except RuntimeError:
# Nothing so bad, but we need to advert the admin he has to rerun # Nothing so bad, but we need to advert the admin he has to rerun
raise rp.CantRemoveHost(host=host_id, pool=self.freepool_name) raise manager_exceptions.CantRemoveHost(host=host_id,
pool=self.freepool_name)

View File

@ -17,6 +17,7 @@ from novaclient import client
from novaclient import exceptions as nova_exceptions from novaclient import exceptions as nova_exceptions
from climate import context from climate import context
from climate.manager import exceptions as manager_exceptions
from climate.plugins.oshosts import nova_inventory from climate.plugins.oshosts import nova_inventory
from climate import tests from climate import tests
@ -94,22 +95,22 @@ class NovaInventoryTestCase(tests.TestCase):
self.assertEqual(expected, host) self.assertEqual(expected, host)
def test_get_host_details_with_host_name_having_multiple_results(self): def test_get_host_details_with_host_name_having_multiple_results(self):
self.assertRaises(nova_inventory.MultipleHostsFound, self.assertRaises(manager_exceptions.MultipleHostsFound,
self.inventory.get_host_details, 'multiple') self.inventory.get_host_details, 'multiple')
def test_get_host_details_with_host_id_not_found(self): def test_get_host_details_with_host_id_not_found(self):
self.assertRaises(nova_inventory.HostNotFound, self.assertRaises(manager_exceptions.HostNotFound,
self.inventory.get_host_details, '2') self.inventory.get_host_details, '2')
def test_get_host_details_with_host_name_not_found(self): def test_get_host_details_with_host_name_not_found(self):
self.assertRaises(nova_inventory.HostNotFound, self.assertRaises(manager_exceptions.HostNotFound,
self.inventory.get_host_details, 'wrong_name') self.inventory.get_host_details, 'wrong_name')
def test_get_host_details_with_invalid_host(self): def test_get_host_details_with_invalid_host(self):
invalid_host = FakeNovaHypervisors.FakeHost invalid_host = FakeNovaHypervisors.FakeHost
del invalid_host.vcpus del invalid_host.vcpus
self.hypervisors_get.return_value = invalid_host self.hypervisors_get.return_value = invalid_host
self.assertRaises(nova_inventory.InvalidHost, self.assertRaises(manager_exceptions.InvalidHost,
self.inventory.get_host_details, '1') self.inventory.get_host_details, '1')
def test_get_servers_per_host(self): def test_get_servers_per_host(self):
@ -117,15 +118,15 @@ class NovaInventoryTestCase(tests.TestCase):
self.assertEqual(FakeNovaHypervisors.FakeHost.servers, servers) self.assertEqual(FakeNovaHypervisors.FakeHost.servers, servers)
def test_get_servers_per_host_with_host_id(self): def test_get_servers_per_host_with_host_id(self):
self.assertRaises(nova_inventory.HostNotFound, self.assertRaises(manager_exceptions.HostNotFound,
self.inventory.get_servers_per_host, '1') self.inventory.get_servers_per_host, '1')
def test_get_servers_per_host_with_host_not_found(self): def test_get_servers_per_host_with_host_not_found(self):
self.assertRaises(nova_inventory.HostNotFound, self.assertRaises(manager_exceptions.HostNotFound,
self.inventory.get_servers_per_host, 'wrong_name') self.inventory.get_servers_per_host, 'wrong_name')
def test_get_servers_per_host_having_multiple_results(self): def test_get_servers_per_host_having_multiple_results(self):
self.assertRaises(nova_inventory.MultipleHostsFound, self.assertRaises(manager_exceptions.MultipleHostsFound,
self.inventory.get_servers_per_host, 'multiple') self.inventory.get_servers_per_host, 'multiple')
def test_get_servers_per_host_with_host_having_no_servers(self): def test_get_servers_per_host_with_host_having_no_servers(self):

View File

@ -19,6 +19,7 @@ from oslo.config import cfg
from climate import config from climate import config
from climate import context from climate import context
from climate.manager import exceptions as manager_exceptions
from climate.plugins.oshosts import reservation_pool as rp from climate.plugins.oshosts import reservation_pool as rp
from climate import tests from climate import tests
from novaclient import client as nova_client from novaclient import client as nova_client
@ -85,9 +86,9 @@ class ReservationPoolTestCase(tests.TestCase):
self.nova.aggregates.list.return_value = [self.fake_aggregate] self.nova.aggregates.list.return_value = [self.fake_aggregate]
self.nova.aggregates.get.side_effect = fake_aggregate_get self.nova.aggregates.get.side_effect = fake_aggregate_get
self.assertRaises(rp.AggregateNotFound, self.assertRaises(manager_exceptions.AggregateNotFound,
self.pool.get_aggregate_from_name_or_id, 'none') self.pool.get_aggregate_from_name_or_id, 'none')
self.assertRaises(rp.AggregateNotFound, self.assertRaises(manager_exceptions.AggregateNotFound,
self.pool.get_aggregate_from_name_or_id, '3000') self.pool.get_aggregate_from_name_or_id, '3000')
self.assertEqual(self.pool.get_aggregate_from_name_or_id('fooname'), self.assertEqual(self.pool.get_aggregate_from_name_or_id('fooname'),
self.fake_aggregate) self.fake_aggregate)
@ -138,7 +139,7 @@ class ReservationPoolTestCase(tests.TestCase):
) )
# can't delete aggregate with hosts # can't delete aggregate with hosts
self.assertRaises(rp.AggregateHaveHost, self.assertRaises(manager_exceptions.AggregateHaveHost,
self.pool.delete, 'bar', self.pool.delete, 'bar',
force=False) force=False)
@ -152,14 +153,14 @@ class ReservationPoolTestCase(tests.TestCase):
def test_delete_with_no_freepool(self): def test_delete_with_no_freepool(self):
def get_fake_aggregate_but_no_freepool(*args): def get_fake_aggregate_but_no_freepool(*args):
if self.freepool_name in args: if self.freepool_name in args:
raise rp.AggregateNotFound raise manager_exceptions.AggregateNotFound
else: else:
return self.fake_aggregate return self.fake_aggregate
self.patch(self.pool, 'get_aggregate_from_name_or_id')\ self.patch(self.pool, 'get_aggregate_from_name_or_id')\
.side_effect = get_fake_aggregate_but_no_freepool .side_effect = get_fake_aggregate_but_no_freepool
agg = self.pool.get('foo') agg = self.pool.get('foo')
agg.hosts = [] agg.hosts = []
self.assertRaises(rp.NoFreePool, self.assertRaises(manager_exceptions.NoFreePool,
self.pool.delete, 'bar', self.pool.delete, 'bar',
force=False) force=False)
@ -183,7 +184,7 @@ class ReservationPoolTestCase(tests.TestCase):
def test_add_computehost_not_in_freepool(self): def test_add_computehost_not_in_freepool(self):
self._patch_get_agg_from_whatever() self._patch_get_agg_from_whatever()
self.assertRaises(rp.HostNotInFreePool, self.assertRaises(manager_exceptions.HostNotInFreePool,
self.pool.add_computehost, self.pool.add_computehost,
'foopool', 'foopool',
'ghost-host') 'ghost-host')
@ -191,14 +192,14 @@ class ReservationPoolTestCase(tests.TestCase):
def test_add_computehost_with_no_freepool(self): def test_add_computehost_with_no_freepool(self):
def get_fake_aggregate_but_no_freepool(*args): def get_fake_aggregate_but_no_freepool(*args):
if self.freepool_name in args: if self.freepool_name in args:
raise rp.AggregateNotFound raise manager_exceptions.AggregateNotFound
else: else:
return self.fake_aggregate return self.fake_aggregate
self.patch(self.pool, 'get_aggregate_from_name_or_id')\ self.patch(self.pool, 'get_aggregate_from_name_or_id')\
.side_effect = get_fake_aggregate_but_no_freepool .side_effect = get_fake_aggregate_but_no_freepool
self.assertRaises(rp.NoFreePool, self.assertRaises(manager_exceptions.NoFreePool,
self.pool.add_computehost, self.pool.add_computehost,
'pool', 'pool',
'host3') 'host3')
@ -208,10 +209,10 @@ class ReservationPoolTestCase(tests.TestCase):
if self.freepool_name in args: if self.freepool_name in args:
return self.freepool_name return self.freepool_name
else: else:
raise rp.AggregateNotFound raise manager_exceptions.AggregateNotFound
self.patch(self.pool, 'get_aggregate_from_name_or_id')\ self.patch(self.pool, 'get_aggregate_from_name_or_id')\
.side_effect = get_no_aggregate_but_freepool .side_effect = get_no_aggregate_but_freepool
self.assertRaises(rp.AggregateNotFound, self.assertRaises(manager_exceptions.AggregateNotFound,
self.pool.add_computehost, self.pool.add_computehost,
'wrong_pool', 'wrong_pool',
'host3') 'host3')
@ -231,7 +232,7 @@ class ReservationPoolTestCase(tests.TestCase):
def test_remove_computehost_not_existing_from_freepool(self): def test_remove_computehost_not_existing_from_freepool(self):
self._patch_get_agg_from_whatever() self._patch_get_agg_from_whatever()
self.assertRaises(rp.HostNotInFreePool, self.assertRaises(manager_exceptions.HostNotInFreePool,
self.pool.remove_computehost, self.pool.remove_computehost,
self.freepool_name, self.freepool_name,
'hostXX') 'hostXX')
@ -246,14 +247,14 @@ class ReservationPoolTestCase(tests.TestCase):
def test_remove_computehost_with_no_freepool(self): def test_remove_computehost_with_no_freepool(self):
def get_fake_aggregate_but_no_freepool(*args): def get_fake_aggregate_but_no_freepool(*args):
if self.freepool_name in args: if self.freepool_name in args:
raise rp.AggregateNotFound raise manager_exceptions.AggregateNotFound
else: else:
return self.fake_aggregate return self.fake_aggregate
self.patch(self.pool, 'get_aggregate_from_name_or_id')\ self.patch(self.pool, 'get_aggregate_from_name_or_id')\
.side_effect = get_fake_aggregate_but_no_freepool .side_effect = get_fake_aggregate_but_no_freepool
self.assertRaises(rp.NoFreePool, self.assertRaises(manager_exceptions.NoFreePool,
self.pool.remove_computehost, self.pool.remove_computehost,
'pool', 'pool',
'host3') 'host3')
@ -263,10 +264,10 @@ class ReservationPoolTestCase(tests.TestCase):
if self.freepool_name in args: if self.freepool_name in args:
return self.freepool_name return self.freepool_name
else: else:
raise rp.AggregateNotFound raise manager_exceptions.AggregateNotFound
self.patch(self.pool, 'get_aggregate_from_name_or_id')\ self.patch(self.pool, 'get_aggregate_from_name_or_id')\
.side_effect = get_no_aggregate_but_freepool .side_effect = get_no_aggregate_but_freepool
self.assertRaises(rp.AggregateNotFound, self.assertRaises(manager_exceptions.AggregateNotFound,
self.pool.remove_computehost, self.pool.remove_computehost,
'wrong_pool', 'wrong_pool',
'host3') 'host3')
@ -275,7 +276,7 @@ class ReservationPoolTestCase(tests.TestCase):
self._patch_get_agg_from_whatever() self._patch_get_agg_from_whatever()
self.nova.aggregates.remove_host.side_effect = \ self.nova.aggregates.remove_host.side_effect = \
nova_exceptions.NotFound(404) nova_exceptions.NotFound(404)
self.assertRaises(rp.CantRemoveHost, self.assertRaises(manager_exceptions.CantRemoveHost,
self.pool.remove_computehost, self.pool.remove_computehost,
'pool', 'pool',
'host3') 'host3')
@ -284,7 +285,7 @@ class ReservationPoolTestCase(tests.TestCase):
self._patch_get_agg_from_whatever() self._patch_get_agg_from_whatever()
self.nova.aggregates.add_host.side_effect = \ self.nova.aggregates.add_host.side_effect = \
nova_exceptions.Conflict(409) nova_exceptions.Conflict(409)
self.assertRaises(rp.CantAddHost, self.assertRaises(manager_exceptions.CantAddHost,
self.pool.remove_computehost, self.pool.remove_computehost,
'pool', 'pool',
'host3') 'host3')

View File

@ -17,6 +17,7 @@ import testtools
from climate import context from climate import context
from climate.db import api as db_api from climate.db import api as db_api
from climate.manager import exceptions as manager_exceptions
from climate.manager import service from climate.manager import service
from climate.plugins.oshosts import nova_inventory from climate.plugins.oshosts import nova_inventory
from climate.plugins.oshosts import reservation_pool as rp from climate.plugins.oshosts import reservation_pool as rp
@ -60,7 +61,7 @@ class PhysicalHostPlugingSetupOnlyTestCase(tests.TestCase):
def test__freepool_exists_with_freepool_missing(self): def test__freepool_exists_with_freepool_missing(self):
def fake_get_aggregate_from_name_or_id(*args, **kwargs): def fake_get_aggregate_from_name_or_id(*args, **kwargs):
raise rp.AggregateNotFound raise manager_exceptions.AggregateNotFound
mock = self.patch(self.rp.ReservationPool, mock = self.patch(self.rp.ReservationPool,
'get_aggregate_from_name_or_id') 'get_aggregate_from_name_or_id')
mock.side_effect = fake_get_aggregate_from_name_or_id mock.side_effect = fake_get_aggregate_from_name_or_id
@ -187,12 +188,12 @@ class PhysicalHostPluginTestCase(tests.TestCase):
self.assertEqual(host, fake_host) self.assertEqual(host, fake_host)
def test_create_host_with_invalid_values(self): def test_create_host_with_invalid_values(self):
self.assertRaises(nova_inventory.InvalidHost, self.assertRaises(manager_exceptions.InvalidHost,
self.fake_phys_plugin.create_computehost, {}) self.fake_phys_plugin.create_computehost, {})
def test_create_host_with_existing_vms(self): def test_create_host_with_existing_vms(self):
self.get_servers_per_host.return_value = ['server1', 'server2'] self.get_servers_per_host.return_value = ['server1', 'server2']
self.assertRaises(nova_inventory.HostHavingServers, self.assertRaises(manager_exceptions.HostHavingServers,
self.fake_phys_plugin.create_computehost, self.fake_phys_plugin.create_computehost,
self.fake_host) self.fake_host)
@ -213,7 +214,7 @@ class PhysicalHostPluginTestCase(tests.TestCase):
self.db_host_create.return_value = self.fake_host self.db_host_create.return_value = self.fake_host
self.db_host_extra_capability_create.side_effect = \ self.db_host_extra_capability_create.side_effect = \
fake_db_host_extra_capability_create fake_db_host_extra_capability_create
self.assertRaises(physical_host_plugin.CantAddExtraCapability, self.assertRaises(manager_exceptions.CantAddExtraCapability,
self.fake_phys_plugin.create_computehost, self.fake_phys_plugin.create_computehost,
fake_request) fake_request)
@ -239,7 +240,7 @@ class PhysicalHostPluginTestCase(tests.TestCase):
'capability_value': 'bar'}] 'capability_value': 'bar'}]
self.db_host_extra_capability_update.side_effect = \ self.db_host_extra_capability_update.side_effect = \
fake_db_host_extra_capability_update fake_db_host_extra_capability_update
self.assertRaises(physical_host_plugin.CantAddExtraCapability, self.assertRaises(manager_exceptions.CantAddExtraCapability,
self.fake_phys_plugin.update_computehost, self.fake_phys_plugin.update_computehost,
self.fake_host_id, host_values) self.fake_host_id, host_values)
@ -250,13 +251,13 @@ class PhysicalHostPluginTestCase(tests.TestCase):
def test_delete_host_having_vms(self): def test_delete_host_having_vms(self):
self.get_servers_per_host.return_value = ['server1', 'server2'] self.get_servers_per_host.return_value = ['server1', 'server2']
self.assertRaises(nova_inventory.HostHavingServers, self.assertRaises(manager_exceptions.HostHavingServers,
self.fake_phys_plugin.delete_computehost, self.fake_phys_plugin.delete_computehost,
self.fake_host_id) self.fake_host_id)
def test_delete_host_not_existing_in_db(self): def test_delete_host_not_existing_in_db(self):
self.db_host_get.return_value = None self.db_host_get.return_value = None
self.assertRaises(rp.HostNotFound, self.assertRaises(manager_exceptions.HostNotFound,
self.fake_phys_plugin.delete_computehost, self.fake_phys_plugin.delete_computehost,
self.fake_host_id) self.fake_host_id)
@ -264,6 +265,6 @@ class PhysicalHostPluginTestCase(tests.TestCase):
def fake_db_host_destroy(*args, **kwargs): def fake_db_host_destroy(*args, **kwargs):
raise RuntimeError raise RuntimeError
self.db_host_destroy.side_effect = fake_db_host_destroy self.db_host_destroy.side_effect = fake_db_host_destroy
self.assertRaises(rp.CantRemoveHost, self.assertRaises(manager_exceptions.CantRemoveHost,
self.fake_phys_plugin.delete_computehost, self.fake_phys_plugin.delete_computehost,
self.fake_host_id) self.fake_host_id)