Merge "remove unused common exceptions"
commit
56bd36e814
|
@ -65,24 +65,6 @@ class NetworkQosBindingError(e.NeutronException):
|
|||
"could not be created: %(db_error)s.")
|
||||
|
||||
|
||||
class PlacementEndpointNotFound(e.NotFound):
|
||||
message = _("Placement API endpoint not found")
|
||||
|
||||
|
||||
class PlacementResourceProviderNotFound(e.NotFound):
|
||||
message = _("Placement resource provider not found %(resource_provider)s.")
|
||||
|
||||
|
||||
class PlacementInventoryNotFound(e.NotFound):
|
||||
message = _("Placement inventory not found for resource provider "
|
||||
"%(resource_provider)s, resource class %(resource_class)s.")
|
||||
|
||||
|
||||
class PlacementAggregateNotFound(e.NotFound):
|
||||
message = _("Aggregate not found for resource provider "
|
||||
"%(resource_provider)s.")
|
||||
|
||||
|
||||
class PolicyRemoveAuthorizationError(e.NotAuthorized):
|
||||
message = _("Failed to remove provided policy %(policy_id)s "
|
||||
"because you are not authorized.")
|
||||
|
@ -118,12 +100,6 @@ class FlatNetworkInUse(e.InUse):
|
|||
"Physical network %(physical_network)s is in use.")
|
||||
|
||||
|
||||
class TenantNetworksDisabled(e.ServiceUnavailable):
|
||||
# NOTE(vvargaszte): May be removed in the future as it is not used in
|
||||
# Neutron, only in the Neutron plugin of OpenContrail.
|
||||
message = _("Tenant network creation is not enabled.")
|
||||
|
||||
|
||||
class NoNetworkFoundInMaximumAllowedAttempts(e.ServiceUnavailable):
|
||||
message = _("Unable to create the network. "
|
||||
"No available network found in maximum allowed attempts.")
|
||||
|
@ -151,20 +127,11 @@ class OverlappingAllocationPools(e.Conflict):
|
|||
"%(pool_1)s %(pool_2)s for subnet %(subnet_cidr)s.")
|
||||
|
||||
|
||||
class PlacementInventoryUpdateConflict(e.Conflict):
|
||||
message = _("Placement inventory update conflict for resource provider "
|
||||
"%(resource_provider)s, resource class %(resource_class)s.")
|
||||
|
||||
|
||||
class OutOfBoundsAllocationPool(e.BadRequest):
|
||||
message = _("The allocation pool %(pool)s spans "
|
||||
"beyond the subnet cidr %(subnet_cidr)s.")
|
||||
|
||||
|
||||
class MacAddressGenerationFailure(e.ServiceUnavailable):
|
||||
message = _("Unable to generate unique mac on network %(net_id)s.")
|
||||
|
||||
|
||||
class BridgeDoesNotExist(e.NeutronException):
|
||||
message = _("Bridge %(bridge)s does not exist.")
|
||||
|
||||
|
@ -214,20 +181,6 @@ class GatewayIpInUse(e.InUse):
|
|||
"by port %(port_id)s. Unable to update.")
|
||||
|
||||
|
||||
class NetworkVlanRangeError(e.NeutronException):
|
||||
message = _("Invalid network VLAN range: '%(vlan_range)s' - '%(error)s'.")
|
||||
|
||||
def __init__(self, **kwargs):
|
||||
# Convert vlan_range tuple to 'start:end' format for display
|
||||
if isinstance(kwargs['vlan_range'], tuple):
|
||||
kwargs['vlan_range'] = "%d:%d" % kwargs['vlan_range']
|
||||
super(NetworkVlanRangeError, self).__init__(**kwargs)
|
||||
|
||||
|
||||
class PhysicalNetworkNameError(e.NeutronException):
|
||||
message = _("Empty physical network name.")
|
||||
|
||||
|
||||
class NetworkVxlanPortRangeError(e.NeutronException):
|
||||
message = _("Invalid network VXLAN port range: '%(vxlan_range)s'.")
|
||||
|
||||
|
|
|
@ -33,7 +33,6 @@ from oslo_utils import excutils
|
|||
import webob.exc
|
||||
|
||||
from neutron._i18n import _
|
||||
from neutron.common import exceptions as n_exc
|
||||
|
||||
|
||||
INTERFACE_HASH_LEN = 6
|
||||
|
@ -88,7 +87,7 @@ def verify_tunnel_range(tunnel_range, tunnel_type):
|
|||
|
||||
def raise_invalid_tag(vlan_str, vlan_range):
|
||||
"""Raise an exception for invalid tag."""
|
||||
raise n_exc.NetworkVlanRangeError(
|
||||
raise exceptions.NetworkVlanRangeError(
|
||||
vlan_range=vlan_range,
|
||||
error=_("%s is not a valid VLAN tag") % vlan_str)
|
||||
|
||||
|
@ -99,7 +98,7 @@ def verify_vlan_range(vlan_range):
|
|||
if not is_valid_vlan_tag(vlan_tag):
|
||||
raise_invalid_tag(str(vlan_tag), vlan_range)
|
||||
if vlan_range[1] < vlan_range[0]:
|
||||
raise n_exc.NetworkVlanRangeError(
|
||||
raise exceptions.NetworkVlanRangeError(
|
||||
vlan_range=vlan_range,
|
||||
error=_("End of VLAN range is less than start of VLAN range"))
|
||||
|
||||
|
@ -109,12 +108,12 @@ def parse_network_vlan_range(network_vlan_range):
|
|||
entry = network_vlan_range.strip()
|
||||
if ':' in entry:
|
||||
if entry.count(':') != 2:
|
||||
raise n_exc.NetworkVlanRangeError(
|
||||
raise exceptions.NetworkVlanRangeError(
|
||||
vlan_range=entry,
|
||||
error=_("Need exactly two values for VLAN range"))
|
||||
network, vlan_min, vlan_max = entry.split(':')
|
||||
if not network:
|
||||
raise n_exc.PhysicalNetworkNameError()
|
||||
raise exceptions.PhysicalNetworkNameError()
|
||||
|
||||
try:
|
||||
vlan_min = int(vlan_min)
|
||||
|
|
|
@ -17,10 +17,10 @@ import functools
|
|||
|
||||
from keystoneauth1 import exceptions as ks_exc
|
||||
from keystoneauth1 import loading as ks_loading
|
||||
from neutron_lib.exceptions import placement as placement_exc
|
||||
from oslo_config import cfg
|
||||
|
||||
from neutron._i18n import _
|
||||
from neutron.common import exceptions as n_exc
|
||||
|
||||
PLACEMENT_API_WITH_AGGREGATES = 'placement 1.1'
|
||||
|
||||
|
@ -31,7 +31,7 @@ def check_placement_api_available(f):
|
|||
try:
|
||||
return f(self, *a, **k)
|
||||
except ks_exc.EndpointNotFound:
|
||||
raise n_exc.PlacementEndpointNotFound()
|
||||
raise placement_exc.PlacementEndpointNotFound()
|
||||
return wrapper
|
||||
|
||||
|
||||
|
@ -107,8 +107,8 @@ class PlacementAPIClient(object):
|
|||
:param resource_class: Resource class name of the inventory to be
|
||||
returned
|
||||
:type resource_class: str
|
||||
:raises n_exc.PlacementInventoryNotFound: For failure to find inventory
|
||||
for a resource provider
|
||||
:raises placement_exc.PlacementInventoryNotFound: For failure to
|
||||
find inventory for a resource provider
|
||||
"""
|
||||
url = '/resource_providers/%s/inventories/%s' % (
|
||||
resource_provider_uuid, resource_class)
|
||||
|
@ -116,10 +116,10 @@ class PlacementAPIClient(object):
|
|||
return self._get(url).json()
|
||||
except ks_exc.NotFound as e:
|
||||
if "No resource provider with uuid" in e.details:
|
||||
raise n_exc.PlacementResourceProviderNotFound(
|
||||
raise placement_exc.PlacementResourceProviderNotFound(
|
||||
resource_provider=resource_provider_uuid)
|
||||
elif _("No inventory of class") in e.details:
|
||||
raise n_exc.PlacementInventoryNotFound(
|
||||
raise placement_exc.PlacementInventoryNotFound(
|
||||
resource_provider=resource_provider_uuid,
|
||||
resource_class=resource_class)
|
||||
else:
|
||||
|
@ -136,15 +136,15 @@ class PlacementAPIClient(object):
|
|||
:type inventory: dict
|
||||
:param resource_class: The resource class of the inventory to update
|
||||
:type resource_class: str
|
||||
:raises n_exc.PlacementInventoryUpdateConflict: For failure to updste
|
||||
inventory due to outdated resource_provider_generation
|
||||
:raises placement_exc.PlacementInventoryUpdateConflict: For failure to
|
||||
update inventory due to outdated resource_provider_generation
|
||||
"""
|
||||
url = '/resource_providers/%s/inventories/%s' % (
|
||||
resource_provider_uuid, resource_class)
|
||||
try:
|
||||
self._put(url, inventory)
|
||||
except ks_exc.Conflict:
|
||||
raise n_exc.PlacementInventoryUpdateConflict(
|
||||
raise placement_exc.PlacementInventoryUpdateConflict(
|
||||
resource_provider=resource_provider_uuid,
|
||||
resource_class=resource_class)
|
||||
|
||||
|
@ -175,5 +175,5 @@ class PlacementAPIClient(object):
|
|||
url, headers={'openstack-api-version':
|
||||
PLACEMENT_API_WITH_AGGREGATES}).json()
|
||||
except ks_exc.NotFound:
|
||||
raise n_exc.PlacementAggregateNotFound(
|
||||
raise placement_exc.PlacementAggregateNotFound(
|
||||
resource_provider=resource_provider_uuid)
|
||||
|
|
|
@ -25,6 +25,7 @@ from neutron_lib.callbacks import events
|
|||
from neutron_lib.callbacks import registry
|
||||
from neutron_lib.callbacks import resources
|
||||
from neutron_lib import constants
|
||||
from neutron_lib.exceptions import placement as placement_exc
|
||||
from neutron_lib.plugins import directory
|
||||
from novaclient import client as nova_client
|
||||
from novaclient import exceptions as nova_exc
|
||||
|
@ -33,7 +34,6 @@ from oslo_log import log
|
|||
from oslo_utils import excutils
|
||||
|
||||
from neutron._i18n import _
|
||||
from neutron.common import exceptions as n_exc
|
||||
from neutron.db import _resource_extend as resource_extend
|
||||
from neutron.db import api as db_api
|
||||
from neutron.db.models import segment as segment_model
|
||||
|
@ -166,7 +166,7 @@ class NovaSegmentNotifier(object):
|
|||
for event in batched_events:
|
||||
try:
|
||||
event.method(event)
|
||||
except n_exc.PlacementEndpointNotFound:
|
||||
except placement_exc.PlacementEndpointNotFound:
|
||||
LOG.debug('Placement API was not found when trying to '
|
||||
'update routed networks IPv4 inventories')
|
||||
return
|
||||
|
@ -190,7 +190,7 @@ class NovaSegmentNotifier(object):
|
|||
def _create_or_update_nova_inventory(self, event):
|
||||
try:
|
||||
self._update_nova_inventory(event)
|
||||
except n_exc.PlacementResourceProviderNotFound:
|
||||
except placement_exc.PlacementResourceProviderNotFound:
|
||||
self._create_nova_inventory(event.segment_id, event.total,
|
||||
event.reserved,
|
||||
event.segment_host_mappings)
|
||||
|
@ -208,7 +208,7 @@ class NovaSegmentNotifier(object):
|
|||
ipv4_inventory,
|
||||
IPV4_RESOURCE_CLASS)
|
||||
return
|
||||
except n_exc.PlacementInventoryUpdateConflict:
|
||||
except placement_exc.PlacementInventoryUpdateConflict:
|
||||
LOG.debug('Re-trying to update Nova IPv4 inventory for '
|
||||
'routed network segment: %s', event.segment_id)
|
||||
LOG.error('Failed to update Nova IPv4 inventory for routed '
|
||||
|
@ -340,7 +340,7 @@ class NovaSegmentNotifier(object):
|
|||
for segment_id in event.segment_ids:
|
||||
try:
|
||||
aggregate_id = self._get_aggregate_id(segment_id)
|
||||
except n_exc.PlacementAggregateNotFound:
|
||||
except placement_exc.PlacementAggregateNotFound:
|
||||
LOG.info('When adding host %(host)s, aggregate not found '
|
||||
'for routed network segment %(segment_id)s',
|
||||
{'host': event.host, 'segment_id': segment_id})
|
||||
|
|
|
@ -29,7 +29,6 @@ import testscenarios
|
|||
import testtools
|
||||
|
||||
from neutron.common import constants as common_constants
|
||||
from neutron.common import exceptions as n_exc
|
||||
from neutron.common import utils
|
||||
from neutron.plugins.common import utils as plugin_utils
|
||||
from neutron.tests import base
|
||||
|
@ -190,13 +189,13 @@ class TestVlanNetworkNameValid(base.BaseTestCase):
|
|||
return plugin_utils.parse_network_vlan_ranges(vlan_range)
|
||||
|
||||
def test_validate_provider_phynet_name_mixed(self):
|
||||
self.assertRaises(n_exc.PhysicalNetworkNameError,
|
||||
self.assertRaises(exc.PhysicalNetworkNameError,
|
||||
self.parse_vlan_ranges,
|
||||
['', ':23:30', 'physnet1',
|
||||
'tenant_net:100:200'])
|
||||
|
||||
def test_validate_provider_phynet_name_bad(self):
|
||||
self.assertRaises(n_exc.PhysicalNetworkNameError,
|
||||
self.assertRaises(exc.PhysicalNetworkNameError,
|
||||
self.parse_vlan_ranges,
|
||||
[':1:34'])
|
||||
|
||||
|
@ -215,7 +214,7 @@ class TestVlanRangeVerifyValid(UtilTestParseVlanRanges):
|
|||
|
||||
def check_one_vlan_invalid(self, bad_range, which):
|
||||
expected_msg = self._vrange_invalid_vlan(bad_range, which)
|
||||
err = self.assertRaises(n_exc.NetworkVlanRangeError,
|
||||
err = self.assertRaises(exc.NetworkVlanRangeError,
|
||||
self.verify_range, bad_range)
|
||||
self.assertEqual(str(err), expected_msg)
|
||||
|
||||
|
@ -258,7 +257,7 @@ class TestVlanRangeVerifyValid(UtilTestParseVlanRanges):
|
|||
def test_range_reversed(self):
|
||||
bad_range = (95, 10)
|
||||
expected_msg = self._vrange_invalid(bad_range)
|
||||
err = self.assertRaises(n_exc.NetworkVlanRangeError,
|
||||
err = self.assertRaises(exc.NetworkVlanRangeError,
|
||||
self.verify_range, bad_range)
|
||||
self.assertEqual(str(err), expected_msg)
|
||||
|
||||
|
@ -280,28 +279,28 @@ class TestParseOneVlanRange(UtilTestParseVlanRanges):
|
|||
def test_parse_one_net_incomplete_range(self):
|
||||
config_str = "net1:100"
|
||||
expected_msg = self._range_err_bad_count(config_str)
|
||||
err = self.assertRaises(n_exc.NetworkVlanRangeError,
|
||||
err = self.assertRaises(exc.NetworkVlanRangeError,
|
||||
self.parse_one, config_str)
|
||||
self.assertEqual(expected_msg, str(err))
|
||||
|
||||
def test_parse_one_net_range_too_many(self):
|
||||
config_str = "net1:100:150:200"
|
||||
expected_msg = self._range_err_bad_count(config_str)
|
||||
err = self.assertRaises(n_exc.NetworkVlanRangeError,
|
||||
err = self.assertRaises(exc.NetworkVlanRangeError,
|
||||
self.parse_one, config_str)
|
||||
self.assertEqual(expected_msg, str(err))
|
||||
|
||||
def test_parse_one_net_vlan1_not_int(self):
|
||||
config_str = "net1:foo:199"
|
||||
expected_msg = self._range_invalid_vlan(config_str, 1)
|
||||
err = self.assertRaises(n_exc.NetworkVlanRangeError,
|
||||
err = self.assertRaises(exc.NetworkVlanRangeError,
|
||||
self.parse_one, config_str)
|
||||
self.assertEqual(expected_msg, str(err))
|
||||
|
||||
def test_parse_one_net_vlan2_not_int(self):
|
||||
config_str = "net1:100:bar"
|
||||
expected_msg = self._range_invalid_vlan(config_str, 2)
|
||||
err = self.assertRaises(n_exc.NetworkVlanRangeError,
|
||||
err = self.assertRaises(exc.NetworkVlanRangeError,
|
||||
self.parse_one, config_str)
|
||||
self.assertEqual(expected_msg, str(err))
|
||||
|
||||
|
@ -313,14 +312,14 @@ class TestParseOneVlanRange(UtilTestParseVlanRanges):
|
|||
def test_parse_one_net_range_bad_vlan1(self):
|
||||
config_str = "net1:9000:150"
|
||||
expected_msg = self._nrange_invalid_vlan(config_str, 1)
|
||||
err = self.assertRaises(n_exc.NetworkVlanRangeError,
|
||||
err = self.assertRaises(exc.NetworkVlanRangeError,
|
||||
self.parse_one, config_str)
|
||||
self.assertEqual(expected_msg, str(err))
|
||||
|
||||
def test_parse_one_net_range_bad_vlan2(self):
|
||||
config_str = "net1:4000:4999"
|
||||
expected_msg = self._nrange_invalid_vlan(config_str, 2)
|
||||
err = self.assertRaises(n_exc.NetworkVlanRangeError,
|
||||
err = self.assertRaises(exc.NetworkVlanRangeError,
|
||||
self.parse_one, config_str)
|
||||
self.assertEqual(expected_msg, str(err))
|
||||
|
||||
|
@ -364,7 +363,7 @@ class TestParseVlanRangeList(UtilTestParseVlanRanges):
|
|||
config_list = ["net1:100",
|
||||
"net2:200:299"]
|
||||
expected_msg = self._range_err_bad_count(config_list[0])
|
||||
err = self.assertRaises(n_exc.NetworkVlanRangeError,
|
||||
err = self.assertRaises(exc.NetworkVlanRangeError,
|
||||
self.parse_list, config_list)
|
||||
self.assertEqual(expected_msg, str(err))
|
||||
|
||||
|
@ -372,7 +371,7 @@ class TestParseVlanRangeList(UtilTestParseVlanRanges):
|
|||
config_list = ["net1:100:199",
|
||||
"net2:200:0x200"]
|
||||
expected_msg = self._range_invalid_vlan(config_list[1], 2)
|
||||
err = self.assertRaises(n_exc.NetworkVlanRangeError,
|
||||
err = self.assertRaises(exc.NetworkVlanRangeError,
|
||||
self.parse_list, config_list)
|
||||
self.assertEqual(expected_msg, str(err))
|
||||
|
||||
|
|
|
@ -27,13 +27,13 @@ from neutron_lib.callbacks import resources
|
|||
from neutron_lib import constants
|
||||
from neutron_lib import context
|
||||
from neutron_lib import exceptions as n_exc
|
||||
from neutron_lib.exceptions import placement as placement_exc
|
||||
from neutron_lib.plugins import directory
|
||||
from novaclient import exceptions as nova_exc
|
||||
from oslo_config import cfg
|
||||
from oslo_utils import uuidutils
|
||||
import webob.exc
|
||||
|
||||
from neutron.common import exceptions as neutron_exc
|
||||
from neutron.conf.plugins.ml2 import config as ml2_config
|
||||
from neutron.conf.plugins.ml2.drivers import driver_type
|
||||
from neutron.db import agents_db
|
||||
|
@ -1555,7 +1555,7 @@ class TestNovaSegmentNotifier(SegmentAwareIpamTestCase):
|
|||
segment_id = segment['segment']['id']
|
||||
self._setup_host_mappings([(segment_id, 'fakehost')])
|
||||
self.mock_p_client.get_inventory.side_effect = (
|
||||
neutron_exc.PlacementResourceProviderNotFound(
|
||||
placement_exc.PlacementResourceProviderNotFound(
|
||||
resource_provider=segment_id,
|
||||
resource_class=seg_plugin.IPV4_RESOURCE_CLASS))
|
||||
aggregate = mock.MagicMock()
|
||||
|
@ -1755,7 +1755,7 @@ class TestNovaSegmentNotifier(SegmentAwareIpamTestCase):
|
|||
self.batch_notifier._notify()
|
||||
self._assert_inventory_delete(segment_id, aggregate)
|
||||
self.mock_p_client.get_inventory.side_effect = (
|
||||
neutron_exc.PlacementResourceProviderNotFound(
|
||||
placement_exc.PlacementResourceProviderNotFound(
|
||||
resource_provider=segment_id,
|
||||
resource_class=seg_plugin.IPV4_RESOURCE_CLASS))
|
||||
aggregate.hosts = []
|
||||
|
@ -1798,7 +1798,7 @@ class TestNovaSegmentNotifier(SegmentAwareIpamTestCase):
|
|||
aggregate.id = 1
|
||||
aggregate.hosts = ['fakehost1']
|
||||
self.mock_p_client.list_aggregates.side_effect = (
|
||||
neutron_exc.PlacementAggregateNotFound(
|
||||
placement_exc.PlacementAggregateNotFound(
|
||||
resource_provider=segment_id))
|
||||
self.mock_n_client.aggregates.list.return_value = [aggregate]
|
||||
host = 'otherfakehost'
|
||||
|
@ -2015,7 +2015,7 @@ class TestNovaSegmentNotifier(SegmentAwareIpamTestCase):
|
|||
inventory, original_inventory = self._get_inventory(100, 2)
|
||||
self.mock_p_client.get_inventory.return_value = inventory
|
||||
self.mock_p_client.update_inventory.side_effect = (
|
||||
neutron_exc.PlacementInventoryUpdateConflict(
|
||||
placement_exc.PlacementInventoryUpdateConflict(
|
||||
resource_provider=mock.ANY,
|
||||
resource_class=seg_plugin.IPV4_RESOURCE_CLASS))
|
||||
self.segments_plugin.nova_updater._update_nova_inventory(event)
|
||||
|
@ -2035,7 +2035,7 @@ class TestNovaSegmentNotifier(SegmentAwareIpamTestCase):
|
|||
self.segments_plugin.nova_updater._update_nova_inventory,
|
||||
mock.ANY, total=1, reserved=0)
|
||||
self.mock_p_client.get_inventory.side_effect = (
|
||||
neutron_exc.PlacementEndpointNotFound())
|
||||
placement_exc.PlacementEndpointNotFound())
|
||||
self.segments_plugin.nova_updater._send_notifications([event])
|
||||
self.assertTrue(log.called)
|
||||
|
||||
|
@ -2205,11 +2205,11 @@ class PlacementAPIClientTestCase(base.DietTestCase):
|
|||
def test_get_inventory_not_found_no_resource_provider(self):
|
||||
self._test_get_inventory_not_found(
|
||||
"No resource provider with uuid",
|
||||
neutron_exc.PlacementResourceProviderNotFound)
|
||||
placement_exc.PlacementResourceProviderNotFound)
|
||||
|
||||
def test_get_inventory_not_found_no_inventory(self):
|
||||
self._test_get_inventory_not_found(
|
||||
"No inventory of class", neutron_exc.PlacementInventoryNotFound)
|
||||
"No inventory of class", placement_exc.PlacementInventoryNotFound)
|
||||
|
||||
def test_get_inventory_not_found_unknown_cause(self):
|
||||
self._test_get_inventory_not_found("Unknown cause", ks_exc.NotFound)
|
||||
|
@ -2232,7 +2232,7 @@ class PlacementAPIClientTestCase(base.DietTestCase):
|
|||
expected_payload = 'fake_inventory'
|
||||
resource_class = 'fake_resource_class'
|
||||
self.mock_request.side_effect = ks_exc.Conflict
|
||||
self.assertRaises(neutron_exc.PlacementInventoryUpdateConflict,
|
||||
self.assertRaises(placement_exc.PlacementInventoryUpdateConflict,
|
||||
self.client.update_inventory, rp_uuid,
|
||||
expected_payload, resource_class)
|
||||
|
||||
|
@ -2261,11 +2261,11 @@ class PlacementAPIClientTestCase(base.DietTestCase):
|
|||
def test_list_aggregates_not_found(self):
|
||||
rp_uuid = uuidutils.generate_uuid()
|
||||
self.mock_request.side_effect = ks_exc.NotFound
|
||||
self.assertRaises(neutron_exc.PlacementAggregateNotFound,
|
||||
self.assertRaises(placement_exc.PlacementAggregateNotFound,
|
||||
self.client.list_aggregates, rp_uuid)
|
||||
|
||||
def test_placement_api_not_found(self):
|
||||
rp_uuid = uuidutils.generate_uuid()
|
||||
self.mock_request.side_effect = ks_exc.EndpointNotFound
|
||||
self.assertRaises(neutron_exc.PlacementEndpointNotFound,
|
||||
self.assertRaises(placement_exc.PlacementEndpointNotFound,
|
||||
self.client.list_aggregates, rp_uuid)
|
||||
|
|
Loading…
Reference in New Issue