From 54444407f40b26969a9d10e25e3fc368b6c89b77 Mon Sep 17 00:00:00 2001 From: Boden R Date: Thu, 26 Oct 2017 09:18:20 -0600 Subject: [PATCH] use l3 api def from neutron-lib Commit I81748aa0e48b1275df3e1ea41b1d36a117d0097d added the l3 extension API definition to neutron-lib and commit I2324a3a02789c798248cab41c278a2d9981d24be rehomed the l3 exceptions, while Ifd79eb1a92853e49bd4ef028e7a7bd89811c6957 shims the l3 exceptions. This patch consumes the l3 api def by: - Removing the code from neutron that's now in lib. - Using lib's version of the code where applicable. - Tidying up the related unit tests as now that the l3 api def from lib is used the necessary fixture is already setup in the parent chain when setting up the unit test class. NeutronLibImpact Change-Id: If2e66e06b83e15ee2851ea2bc3b64ad366e675dd --- neutron/api/rpc/handlers/l3_rpc.py | 4 +- neutron/db/availability_zone/router.py | 4 +- neutron/db/db_base_plugin_v2.py | 8 +- neutron/db/dns_db.py | 4 +- neutron/db/extraroute_db.py | 4 +- neutron/db/l3_attrs_db.py | 4 +- neutron/db/l3_db.py | 47 +++--- neutron/db/l3_dvr_db.py | 15 +- neutron/db/l3_fip_qos.py | 4 +- neutron/db/l3_gwmode_db.py | 11 +- neutron/db/l3_hamode_db.py | 4 +- neutron/db/models/l3.py | 10 +- neutron/extensions/l3.py | 142 +----------------- neutron/extensions/tag_ext.py | 4 +- neutron/scheduler/l3_agent_scheduler.py | 4 +- neutron/services/auto_allocate/db.py | 5 +- .../services/l3_router/l3_router_plugin.py | 4 +- .../l3_router/test_l3_dvr_ha_router_plugin.py | 10 +- .../l3_router/test_l3_dvr_router_plugin.py | 4 +- neutron/tests/unit/db/test_l3_db.py | 4 +- neutron/tests/unit/db/test_l3_dvr_db.py | 6 +- neutron/tests/unit/db/test_l3_hamode_db.py | 6 +- .../tests/unit/extensions/test_extraroute.py | 13 -- neutron/tests/unit/extensions/test_l3.py | 21 +-- .../unit/extensions/test_l3_ext_gw_mode.py | 25 +-- neutron/tests/unit/extensions/test_qos_fip.py | 2 - .../test_router_availability_zone.py | 13 -- .../unit/scheduler/test_l3_agent_scheduler.py | 5 +- 28 files changed, 111 insertions(+), 276 deletions(-) diff --git a/neutron/api/rpc/handlers/l3_rpc.py b/neutron/api/rpc/handlers/l3_rpc.py index b0d32be9b15..9fb7149f2e8 100644 --- a/neutron/api/rpc/handlers/l3_rpc.py +++ b/neutron/api/rpc/handlers/l3_rpc.py @@ -17,6 +17,7 @@ from neutron_lib.api.definitions import portbindings from neutron_lib import constants from neutron_lib import context as neutron_context from neutron_lib import exceptions +from neutron_lib.exceptions import l3 as l3_exc from neutron_lib.plugins import constants as plugin_constants from neutron_lib.plugins import directory from oslo_config import cfg @@ -26,7 +27,6 @@ import oslo_messaging from neutron.common import constants as n_const from neutron.common import utils from neutron.db import api as db_api -from neutron.extensions import l3 LOG = logging.getLogger(__name__) @@ -254,7 +254,7 @@ class L3RpcCallback(object): self.l3plugin.update_floatingip_status(context, floatingip_id, status) - except l3.FloatingIPNotFound: + except l3_exc.FloatingIPNotFound: LOG.debug("Floating IP: %s no longer present.", floatingip_id) # Find all floating IPs known to have been the given router diff --git a/neutron/db/availability_zone/router.py b/neutron/db/availability_zone/router.py index 5978f380349..9870c144402 100644 --- a/neutron/db/availability_zone/router.py +++ b/neutron/db/availability_zone/router.py @@ -12,6 +12,7 @@ # under the License. from neutron_lib.api.definitions import availability_zone as az_def +from neutron_lib.api.definitions import l3 as l3_apidef from neutron_lib.callbacks import events from neutron_lib.callbacks import registry from neutron_lib.callbacks import resources @@ -21,7 +22,6 @@ from neutron_lib.plugins import directory from neutron.common import utils from neutron.db import _resource_extend as resource_extend from neutron.db import l3_attrs_db -from neutron.extensions import l3 @resource_extend.has_resource_extenders @@ -30,7 +30,7 @@ class RouterAvailabilityZoneMixin(l3_attrs_db.ExtraAttributesMixin): """Mixin class to enable router's availability zone attributes.""" @staticmethod - @resource_extend.extends([l3.ROUTERS]) + @resource_extend.extends([l3_apidef.ROUTERS]) def _add_az_to_response(router_res, router_db): l3_plugin = directory.get_plugin(constants.L3) if not utils.is_extension_supported(l3_plugin, diff --git a/neutron/db/db_base_plugin_v2.py b/neutron/db/db_base_plugin_v2.py index 31f6575f930..522d1607495 100644 --- a/neutron/db/db_base_plugin_v2.py +++ b/neutron/db/db_base_plugin_v2.py @@ -27,6 +27,7 @@ from neutron_lib.callbacks import resources from neutron_lib import constants from neutron_lib import context as ctx from neutron_lib import exceptions as exc +from neutron_lib.exceptions import l3 as l3_exc from neutron_lib.plugins import constants as plugin_constants from neutron_lib.plugins import directory from oslo_config import cfg @@ -53,7 +54,6 @@ from neutron.db import models_v2 from neutron.db import rbac_db_mixin as rbac_mixin from neutron.db import rbac_db_models as rbac_db from neutron.db import standardattrdescription_db as stattr_db -from neutron.extensions import l3 from neutron import ipam from neutron.ipam import exceptions as ipam_exc from neutron.ipam import subnet_alloc @@ -651,7 +651,7 @@ class NeutronDbPluginV2(db_base_plugin_common.DbBasePluginCommon, for id in router_ids: try: self._update_router_gw_port(context, id, network, subnet) - except l3.RouterNotFound: + except l3_exc.RouterNotFound: LOG.debug("Router %(id)s was concurrently deleted while " "updating GW port for subnet %(s)s", {'id': id, 's': subnet}) @@ -1422,7 +1422,7 @@ class NeutronDbPluginV2(db_base_plugin_common.DbBasePluginCommon, try: ctx_admin = context.elevated() router = self.get_router(ctx_admin, device_id) - except l3.RouterNotFound: + except l3_exc.RouterNotFound: return else: l3plugin = directory.get_plugin(plugin_constants.L3) @@ -1431,7 +1431,7 @@ class NeutronDbPluginV2(db_base_plugin_common.DbBasePluginCommon, ctx_admin = context.elevated() router = l3plugin.get_router(ctx_admin, device_id) - except l3.RouterNotFound: + except l3_exc.RouterNotFound: return else: # raise as extension doesn't support L3 anyways. diff --git a/neutron/db/dns_db.py b/neutron/db/dns_db.py index 69f08cc7890..93091d8c0b9 100644 --- a/neutron/db/dns_db.py +++ b/neutron/db/dns_db.py @@ -14,6 +14,7 @@ # under the License. from neutron_lib.api.definitions import dns as dns_apidef +from neutron_lib.api.definitions import l3 as l3_apidef from neutron_lib.api import validators from neutron_lib import exceptions as n_exc from neutron_lib.exceptions import dns as dns_exc @@ -23,7 +24,6 @@ from oslo_log import log as logging from neutron._i18n import _ from neutron.common import utils from neutron.db import _resource_extend as resource_extend -from neutron.extensions import l3 from neutron.objects import floatingip as fip_obj from neutron.objects import network from neutron.objects import ports as port_obj @@ -66,7 +66,7 @@ class DNSDbMixin(object): driver=cfg.CONF.external_dns_driver) @staticmethod - @resource_extend.extends([l3.FLOATINGIPS]) + @resource_extend.extends([l3_apidef.FLOATINGIPS]) def _extend_floatingip_dict_dns(floatingip_res, floatingip_db): floatingip_res['dns_domain'] = '' floatingip_res['dns_name'] = '' diff --git a/neutron/db/extraroute_db.py b/neutron/db/extraroute_db.py index c22b68e0e40..77c6148dcd1 100644 --- a/neutron/db/extraroute_db.py +++ b/neutron/db/extraroute_db.py @@ -14,6 +14,7 @@ # under the License. import netaddr +from neutron_lib.api.definitions import l3 as l3_apidef from neutron_lib.exceptions import extraroute as xroute_exc from neutron_lib.utils import helpers from oslo_config import cfg @@ -24,7 +25,6 @@ from neutron.common import utils from neutron.conf.db import extraroute_db from neutron.db import _resource_extend as resource_extend from neutron.db import l3_db -from neutron.extensions import l3 from neutron.objects import router as l3_obj @@ -38,7 +38,7 @@ class ExtraRoute_dbonly_mixin(l3_db.L3_NAT_dbonly_mixin): """Mixin class to support extra route configuration on router.""" @staticmethod - @resource_extend.extends([l3.ROUTERS]) + @resource_extend.extends([l3_apidef.ROUTERS]) def _extend_router_dict_extraroute(router_res, router_db): router_res['routes'] = (ExtraRoute_dbonly_mixin. _make_extra_route_list( diff --git a/neutron/db/l3_attrs_db.py b/neutron/db/l3_attrs_db.py index d26c6ce9804..71cea4911c1 100644 --- a/neutron/db/l3_attrs_db.py +++ b/neutron/db/l3_attrs_db.py @@ -12,13 +12,13 @@ # License for the specific language governing permissions and limitations # under the License. +from neutron_lib.api.definitions import l3 as l3_apidef from neutron_lib.api.validators import availability_zone as az_validator from oslo_config import cfg from neutron._i18n import _ from neutron.db import _resource_extend as resource_extend from neutron.db.models import l3_attrs -from neutron.extensions import l3 def get_attr_info(): @@ -38,7 +38,7 @@ class ExtraAttributesMixin(object): """Mixin class to enable router's extra attributes.""" @staticmethod - @resource_extend.extends([l3.ROUTERS]) + @resource_extend.extends([l3_apidef.ROUTERS]) def _extend_extra_router_dict(router_res, router_db): extra_attrs = router_db['extra_attributes'] or {} for name, info in get_attr_info().items(): diff --git a/neutron/db/l3_db.py b/neutron/db/l3_db.py index d0ddd80ba89..ccc1922f815 100644 --- a/neutron/db/l3_db.py +++ b/neutron/db/l3_db.py @@ -17,6 +17,7 @@ import random import netaddr from neutron_lib.api.definitions import external_net as extnet_apidef +from neutron_lib.api.definitions import l3 as l3_apidef from neutron_lib.api import validators from neutron_lib.callbacks import events from neutron_lib.callbacks import exceptions @@ -25,6 +26,7 @@ from neutron_lib.callbacks import resources from neutron_lib import constants from neutron_lib import context as n_ctx from neutron_lib import exceptions as n_exc +from neutron_lib.exceptions import l3 as l3_exc from neutron_lib.plugins import constants as plugin_constants from neutron_lib.plugins import directory from neutron_lib.services import base as base_services @@ -61,7 +63,7 @@ DEVICE_OWNER_HA_REPLICATED_INT = constants.DEVICE_OWNER_HA_REPLICATED_INT DEVICE_OWNER_ROUTER_INTF = constants.DEVICE_OWNER_ROUTER_INTF DEVICE_OWNER_ROUTER_GW = constants.DEVICE_OWNER_ROUTER_GW DEVICE_OWNER_FLOATINGIP = constants.DEVICE_OWNER_FLOATINGIP -EXTERNAL_GW_INFO = l3.EXTERNAL_GW_INFO +EXTERNAL_GW_INFO = l3_apidef.EXTERNAL_GW_INFO # Maps API field to DB column # API parameter name and Database column names may differ. @@ -182,7 +184,7 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase, router = model_query.get_by_id( context, l3_models.Router, router_id) except exc.NoResultFound: - raise l3.RouterNotFound(router_id=router_id) + raise l3_exc.RouterNotFound(router_id=router_id) return router def _make_router_dict(self, router, fields=None, process_extensions=True): @@ -203,7 +205,7 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase, # class inheriting from CommonDbMixin, which is true for all existing # plugins. if process_extensions: - resource_extend.apply_funcs(l3.ROUTERS, res, router) + resource_extend.apply_funcs(l3_apidef.ROUTERS, res, router) return db_utils.resource_fields(res, fields) def _create_router_db(self, context, router, tenant_id): @@ -427,7 +429,7 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase, old_network_id = router.gw_port['network_id'] if self.router_gw_port_has_floating_ips(admin_ctx, router_id): - raise l3.RouterExternalGatewayInUseByFloatingIp( + raise l3_exc.RouterExternalGatewayInUseByFloatingIp( router_id=router_id, net_id=router.gw_port['network_id']) gw_ips = [x['ip_address'] for x in router.gw_port['fixed_ips']] gw_port_id = router.gw_port['id'] @@ -459,7 +461,7 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase, # NOTE(armax): preserve old check's behavior if len(e.errors) == 1: raise e.errors[0].error - raise l3.RouterInUse(router_id=router.id, reason=e) + raise l3_exc.RouterInUse(router_id=router.id, reason=e) def _create_gw_port(self, context, router_id, router, new_network_id, ext_ips): @@ -544,7 +546,7 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase, device_owner = self._get_device_owner(context, router) if any(rp.port_type == device_owner for rp in router.attached_ports): - raise l3.RouterInUse(router_id=router_id) + raise l3_exc.RouterInUse(router_id=router_id) return router @db_api.retry_if_session_inactive() @@ -750,7 +752,7 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase, # raise the underlying exception reason = (_('cannot perform router interface attachment ' 'due to %(reason)s') % {'reason': e}) - raise l3.RouterInterfaceAttachmentConflict(reason=reason) + raise l3_exc.RouterInterfaceAttachmentConflict(reason=reason) def _add_interface_by_port(self, context, router, port_id, owner): # Update owner before actual process in order to avoid the @@ -922,11 +924,11 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase, # NOTE(armax): preserve old check's behavior if len(e.errors) == 1: raise e.errors[0].error - raise l3.RouterInUse(router_id=router_id, reason=e) + raise l3_exc.RouterInUse(router_id=router_id, reason=e) fip_objs = l3_obj.FloatingIP.get_objects(context, router_id=router_id) for fip_obj in fip_objs: if fip_obj.fixed_ip_address in subnet_cidr: - raise l3.RouterInterfaceInUseByFloatingIP( + raise l3_exc.RouterInterfaceInUseByFloatingIP( router_id=router_id, subnet_id=subnet_id) def _remove_interface_by_port(self, context, router_id, @@ -941,11 +943,11 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase, try: port = self._core_plugin.get_port(context, obj.port_id) except n_exc.PortNotFound: - raise l3.RouterInterfaceNotFound(router_id=router_id, - port_id=port_id) + raise l3_exc.RouterInterfaceNotFound( + router_id=router_id, port_id=port_id) else: - raise l3.RouterInterfaceNotFound(router_id=router_id, - port_id=port_id) + raise l3_exc.RouterInterfaceNotFound( + router_id=router_id, port_id=port_id) port_subnet_ids = [fixed_ip['subnet_id'] for fixed_ip in port['fixed_ips']] if subnet_id and subnet_id not in port_subnet_ids: @@ -991,8 +993,8 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase, return (p, [subnet]) except exc.NoResultFound: pass - raise l3.RouterInterfaceNotFoundForSubnet(router_id=router_id, - subnet_id=subnet_id) + raise l3_exc.RouterInterfaceNotFoundForSubnet( + router_id=router_id, subnet_id=subnet_id) @db_api.retry_if_session_inactive() def remove_router_interface(self, context, router_id, interface_info): @@ -1041,7 +1043,7 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase, def _get_floatingip(self, context, id): floatingip = l3_obj.FloatingIP.get_object(context, id=id) if not floatingip: - raise l3.FloatingIPNotFound(floatingip_id=id) + raise l3_exc.FloatingIPNotFound(floatingip_id=id) return floatingip def _make_floatingip_dict(self, floatingip, fields=None, @@ -1064,7 +1066,8 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase, # TODO(lujinluo): Change floatingip.db_obj to floatingip once all # codes are migrated to use Floating IP OVO object. if process_extensions: - resource_extend.apply_funcs(l3.FLOATINGIPS, res, floatingip.db_obj) + resource_extend.apply_funcs( + l3_apidef.FLOATINGIPS, res, floatingip.db_obj) return db_utils.resource_fields(res, fields) def _get_router_for_floatingip(self, context, internal_port, @@ -1116,7 +1119,7 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase, if first_router_id: return first_router_id - raise l3.ExternalGatewayForFloatingIPNotFound( + raise l3_exc.ExternalGatewayForFloatingIPNotFound( subnet_id=internal_subnet['id'], external_network_id=external_network_id, port_id=internal_port['id']) @@ -1211,7 +1214,7 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase, if fip_exists: floating_ip_address = (str(floatingip_obj.floating_ip_address) if floatingip_obj.floating_ip_address else None) - raise l3.FloatingIPPortAlreadyAssociated( + raise l3_exc.FloatingIPPortAlreadyAssociated( port_id=fip['port_id'], fip_id=floatingip_obj.id, floating_ip_address=floating_ip_address, @@ -1355,7 +1358,7 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase, dns_data) # TODO(lujinluo): Change floatingip_db to floatingip_obj once all # codes are migrated to use Floating IP OVO object. - resource_extend.apply_funcs(l3.FLOATINGIPS, floatingip_dict, + resource_extend.apply_funcs(l3_apidef.FLOATINGIPS, floatingip_dict, floatingip_db) return floatingip_dict @@ -1398,7 +1401,7 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase, dns_data) # TODO(lujinluo): Change floatingip_db to floatingip_obj once all # codes are migrated to use Floating IP OVO object. - resource_extend.apply_funcs(l3.FLOATINGIPS, floatingip_dict, + resource_extend.apply_funcs(l3_apidef.FLOATINGIPS, floatingip_dict, floatingip_db) return old_floatingip, floatingip_dict @@ -1477,7 +1480,7 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase, try: self.get_router(context.elevated(), router_id) return True - except l3.RouterNotFound: + except l3_exc.RouterNotFound: return False def prevent_l3_port_deletion(self, context, port_id): diff --git a/neutron/db/l3_dvr_db.py b/neutron/db/l3_dvr_db.py index 553b1832578..738f2f9c801 100644 --- a/neutron/db/l3_dvr_db.py +++ b/neutron/db/l3_dvr_db.py @@ -14,6 +14,7 @@ import collections import netaddr +from neutron_lib.api.definitions import l3 as l3_apidef from neutron_lib.api.definitions import portbindings from neutron_lib.api import validators from neutron_lib.callbacks import events @@ -22,6 +23,7 @@ from neutron_lib.callbacks import registry from neutron_lib.callbacks import resources from neutron_lib import constants as const from neutron_lib import exceptions as n_exc +from neutron_lib.exceptions import l3 as l3_exc from neutron_lib.plugins import constants as plugin_constants from neutron_lib.plugins import directory from oslo_config import cfg @@ -39,7 +41,6 @@ from neutron.db import l3_attrs_db from neutron.db import l3_db from neutron.db.models import allowed_address_pair as aap_models from neutron.db import models_v2 -from neutron.extensions import l3 from neutron.ipam import utils as ipam_utils from neutron.objects import agent as ag_obj from neutron.objects import base as base_obj @@ -101,7 +102,7 @@ class DVRResourceOperationHandler(object): # NOTE(armax): preserve old check's behavior if len(e.errors) == 1: raise e.errors[0].error - raise l3.RouterInUse(router_id=router_db['id'], reason=e) + raise l3_exc.RouterInUse(router_id=router_db['id'], reason=e) return True @registry.receives(resources.ROUTER, [events.PRECOMMIT_UPDATE]) @@ -147,7 +148,8 @@ class DVRResourceOperationHandler(object): context, router_id, router, request_attrs, router_db, **kwargs): - if router.get(l3.EXTERNAL_GW_INFO) and not router['distributed']: + if (router.get(l3_apidef.EXTERNAL_GW_INFO) and + not router['distributed']): old_router = kwargs['old_router'] if old_router and old_router['distributed']: self.delete_csnat_router_interface_ports( @@ -159,7 +161,8 @@ class DVRResourceOperationHandler(object): context, router_id, router, request_attrs, router_db, **kwargs): - if not router.get(l3.EXTERNAL_GW_INFO) or not router['distributed']: + if (not router.get(l3_apidef.EXTERNAL_GW_INFO) or + not router['distributed']): # we don't care if it's not distributed or not attached to an # external network return @@ -168,7 +171,7 @@ class DVRResourceOperationHandler(object): # gateway attachment old_router = kwargs['old_router'] do_create = (not old_router['distributed'] or - not old_router.get(l3.EXTERNAL_GW_INFO)) + not old_router.get(l3_apidef.EXTERNAL_GW_INFO)) if not do_create: return if not self._create_snat_intf_ports_if_not_exists( @@ -1010,7 +1013,7 @@ class L3_NAT_with_dvr_db_mixin(_DVRAgentInterfaceMixin, try: # using admin context as router may belong to admin tenant router = self._get_router(context.elevated(), router_id) - except l3.RouterNotFound: + except l3_exc.RouterNotFound: LOG.warning("Router %s was not found. " "Skipping agent notification.", router_id) diff --git a/neutron/db/l3_fip_qos.py b/neutron/db/l3_fip_qos.py index a58b6cb7e31..ef19533b959 100644 --- a/neutron/db/l3_fip_qos.py +++ b/neutron/db/l3_fip_qos.py @@ -12,11 +12,11 @@ # under the License. # +from neutron_lib.api.definitions import l3 as l3_apidef from neutron_lib.services.qos import constants as qos_consts from neutron.common import exceptions as n_exc from neutron.db import _resource_extend as resource_extend -from neutron.extensions import l3 from neutron.objects.db import api as obj_db_api from neutron.objects.qos import policy as policy_object @@ -26,7 +26,7 @@ class FloatingQoSDbMixin(object): """Mixin class to enable floating IP's QoS extra attributes.""" @staticmethod - @resource_extend.extends([l3.FLOATINGIPS]) + @resource_extend.extends([l3_apidef.FLOATINGIPS]) def _extend_extra_fip_dict(fip_res, fip_db): if fip_db.get('qos_policy_binding'): fip_res[qos_consts.QOS_POLICY_ID] = ( diff --git a/neutron/db/l3_gwmode_db.py b/neutron/db/l3_gwmode_db.py index 461eca7caec..3951e754a51 100644 --- a/neutron/db/l3_gwmode_db.py +++ b/neutron/db/l3_gwmode_db.py @@ -13,6 +13,7 @@ # under the License. # +from neutron_lib.api.definitions import l3 as l3_apidef from oslo_config import cfg import sqlalchemy as sa from sqlalchemy import sql @@ -21,14 +22,11 @@ from neutron.conf.db import l3_gwmode_db from neutron.db import _resource_extend as resource_extend from neutron.db import l3_db from neutron.db.models import l3 as l3_models -from neutron.extensions import l3 l3_gwmode_db.register_db_l3_gwmode_opts() -EXTERNAL_GW_INFO = l3.EXTERNAL_GW_INFO - # Modify the Router Data Model adding the enable_snat attribute setattr(l3_models.Router, 'enable_snat', sa.Column(sa.Boolean, default=True, server_default=sql.true(), @@ -40,11 +38,11 @@ class L3_NAT_dbonly_mixin(l3_db.L3_NAT_dbonly_mixin): """Mixin class to add configurable gateway modes.""" @staticmethod - @resource_extend.extends([l3.ROUTERS]) + @resource_extend.extends([l3_apidef.ROUTERS]) def _extend_router_dict_gw_mode(router_res, router_db): if router_db.gw_port_id: nw_id = router_db.gw_port['network_id'] - router_res[EXTERNAL_GW_INFO] = { + router_res[l3_apidef.EXTERNAL_GW_INFO] = { 'network_id': nw_id, 'enable_snat': router_db.enable_snat, 'external_fixed_ips': [ @@ -84,7 +82,8 @@ class L3_NAT_dbonly_mixin(l3_db.L3_NAT_dbonly_mixin): if gw_port_id and gw_ports.get(gw_port_id): rtr['gw_port'] = gw_ports[gw_port_id] # Add enable_snat key - rtr['enable_snat'] = rtr[EXTERNAL_GW_INFO]['enable_snat'] + rtr['enable_snat'] = rtr[ + l3_apidef.EXTERNAL_GW_INFO]['enable_snat'] return routers diff --git a/neutron/db/l3_hamode_db.py b/neutron/db/l3_hamode_db.py index 3839a28cb1a..c4d9d33d599 100644 --- a/neutron/db/l3_hamode_db.py +++ b/neutron/db/l3_hamode_db.py @@ -25,6 +25,7 @@ from neutron_lib.callbacks import registry from neutron_lib.callbacks import resources from neutron_lib import constants from neutron_lib import exceptions as n_exc +from neutron_lib.exceptions import l3 as l3_exc from neutron_lib.exceptions import l3_ext_ha_mode as l3ha_exc from neutron_lib.objects import exceptions as obj_base from oslo_config import cfg @@ -47,7 +48,6 @@ from neutron.db.availability_zone import router as router_az_db from neutron.db import l3_dvr_db from neutron.db.l3_dvr_db import is_distributed_router from neutron.db.models import l3ha as l3ha_model -from neutron.extensions import l3 from neutron.objects import base from neutron.objects import l3_hamode from neutron.objects import router as l3_obj @@ -258,7 +258,7 @@ class L3_HA_NAT_db_mixin(l3_dvr_db.L3_NAT_with_dvr_db_mixin, 'Failed to create HA router agent PortBinding, ' 'Router %s has already been removed ' 'by concurrent operation', router_id) - raise l3.RouterNotFound(router_id=router_id) + raise l3_exc.RouterNotFound(router_id=router_id) def add_ha_port(self, context, router_id, network_id, tenant_id): # NOTE(kevinbenton): we have to block any ongoing transactions because diff --git a/neutron/db/models/l3.py b/neutron/db/models/l3.py index f1f7c446e36..3e1289505e5 100644 --- a/neutron/db/models/l3.py +++ b/neutron/db/models/l3.py @@ -10,6 +10,7 @@ # License for the specific language governing permissions and limitations # under the License. +from neutron_lib.api.definitions import l3 as l3_apidef from neutron_lib.db import constants as db_const from neutron_lib.db import model_base import sqlalchemy as sa @@ -18,7 +19,6 @@ from sqlalchemy import orm from neutron.db.models import l3agent as rb_model from neutron.db import models_v2 from neutron.db import standard_attr -from neutron.extensions import l3 class RouterPort(model_base.BASEV2): @@ -62,8 +62,8 @@ class Router(standard_attr.HasStandardAttributes, model_base.BASEV2, l3_agents = orm.relationship( 'Agent', lazy='subquery', viewonly=True, secondary=rb_model.RouterL3AgentBinding.__table__) - api_collections = [l3.ROUTERS] - collection_resource_map = {l3.ROUTERS: l3.ROUTER} + api_collections = [l3_apidef.ROUTERS] + collection_resource_map = {l3_apidef.ROUTERS: l3_apidef.ROUTER} tag_support = True @@ -104,8 +104,8 @@ class FloatingIP(standard_attr.HasStandardAttributes, model_base.BASEV2, name=('uniq_floatingips0floatingnetworkid' '0fixedportid0fixedipaddress')), model_base.BASEV2.__table_args__,) - api_collections = [l3.FLOATINGIPS] - collection_resource_map = {l3.FLOATINGIPS: l3.FLOATINGIP} + api_collections = [l3_apidef.FLOATINGIPS] + collection_resource_map = {l3_apidef.FLOATINGIPS: l3_apidef.FLOATINGIP} tag_support = True diff --git a/neutron/extensions/l3.py b/neutron/extensions/l3.py index b8b3b6d67d0..4cbc3594a37 100644 --- a/neutron/extensions/l3.py +++ b/neutron/extensions/l3.py @@ -15,10 +15,8 @@ import abc -from neutron_lib.api import converters +from neutron_lib.api.definitions import l3 as l3_apidef from neutron_lib.api import extensions -from neutron_lib.db import constants as db_const -from neutron_lib.exceptions import l3 as l3_exc from neutron_lib.plugins import constants import six @@ -26,146 +24,22 @@ from neutron.api.v2 import resource_helper from neutron.conf import quota -# TODO(boden): remove these shims on l3 api def consumption -RouterNotFound = l3_exc.RouterNotFound -RouterInUse = l3_exc.RouterInUse -RouterInterfaceNotFound = l3_exc.RouterInterfaceNotFound -RouterInterfaceNotFoundForSubnet = l3_exc.RouterInterfaceNotFoundForSubnet -RouterInterfaceInUseByFloatingIP = l3_exc.RouterInterfaceInUseByFloatingIP -FloatingIPNotFound = l3_exc.FloatingIPNotFound -ExternalGatewayForFloatingIPNotFound = ( - l3_exc.ExternalGatewayForFloatingIPNotFound) -FloatingIPPortAlreadyAssociated = l3_exc.FloatingIPPortAlreadyAssociated -RouterExternalGatewayInUseByFloatingIp = ( - l3_exc.RouterExternalGatewayInUseByFloatingIp) -RouterInterfaceAttachmentConflict = l3_exc.RouterInterfaceAttachmentConflict - - -ROUTER = 'router' -ROUTERS = 'routers' -FLOATINGIP = 'floatingip' -FLOATINGIPS = '%ss' % FLOATINGIP -EXTERNAL_GW_INFO = 'external_gateway_info' - -RESOURCE_ATTRIBUTE_MAP = { - ROUTERS: { - 'id': {'allow_post': False, 'allow_put': False, - 'validate': {'type:uuid': None}, - 'is_visible': True, - 'primary_key': True}, - 'name': {'allow_post': True, 'allow_put': True, - 'validate': {'type:string': db_const.NAME_FIELD_SIZE}, - 'is_visible': True, 'default': ''}, - 'admin_state_up': {'allow_post': True, 'allow_put': True, - 'default': True, - 'convert_to': converters.convert_to_boolean, - 'is_visible': True}, - 'status': {'allow_post': False, 'allow_put': False, - 'is_visible': True}, - 'tenant_id': {'allow_post': True, 'allow_put': False, - 'required_by_policy': True, - 'validate': { - 'type:string': db_const.PROJECT_ID_FIELD_SIZE}, - 'is_visible': True}, - EXTERNAL_GW_INFO: {'allow_post': True, 'allow_put': True, - 'is_visible': True, 'default': None, - 'enforce_policy': True, - 'validate': { - 'type:dict_or_nodata': { - 'network_id': {'type:uuid': None, - 'required': True}, - 'external_fixed_ips': { - 'convert_list_to': - converters.convert_kvp_list_to_dict, - 'type:fixed_ips': None, - 'default': None, - 'required': False, - } - } - }} - }, - FLOATINGIPS: { - 'id': {'allow_post': False, 'allow_put': False, - 'validate': {'type:uuid': None}, - 'is_visible': True, - 'primary_key': True}, - 'floating_ip_address': {'allow_post': True, 'allow_put': False, - 'validate': {'type:ip_address_or_none': None}, - 'is_visible': True, 'default': None, - 'enforce_policy': True}, - 'subnet_id': {'allow_post': True, 'allow_put': False, - 'validate': {'type:uuid_or_none': None}, - 'is_visible': False, # Use False for input only attr - 'default': None}, - 'floating_network_id': {'allow_post': True, 'allow_put': False, - 'validate': {'type:uuid': None}, - 'is_visible': True}, - 'router_id': {'allow_post': False, 'allow_put': False, - 'validate': {'type:uuid_or_none': None}, - 'is_visible': True, 'default': None}, - 'port_id': {'allow_post': True, 'allow_put': True, - 'validate': {'type:uuid_or_none': None}, - 'is_visible': True, 'default': None, - 'required_by_policy': True}, - 'fixed_ip_address': {'allow_post': True, 'allow_put': True, - 'validate': {'type:ip_address_or_none': None}, - 'is_visible': True, 'default': None}, - 'tenant_id': {'allow_post': True, 'allow_put': False, - 'required_by_policy': True, - 'validate': { - 'type:string': db_const.PROJECT_ID_FIELD_SIZE}, - 'is_visible': True}, - 'status': {'allow_post': False, 'allow_put': False, - 'is_visible': True}, - }, -} - # Register the configuration options quota.register_quota_opts(quota.l3_quota_opts) -class L3(extensions.ExtensionDescriptor): - - @classmethod - def get_name(cls): - return "Neutron L3 Router" - - @classmethod - def get_alias(cls): - return "router" - - @classmethod - def get_description(cls): - return ("Router abstraction for basic L3 forwarding" - " between L2 Neutron networks and access to external" - " networks via a NAT gateway.") - - @classmethod - def get_updated(cls): - return "2012-07-20T10:00:00-00:00" +class L3(extensions.APIExtensionDescriptor): + api_definition = l3_apidef @classmethod def get_resources(cls): """Returns Ext Resources.""" plural_mappings = resource_helper.build_plural_mappings( - {}, RESOURCE_ATTRIBUTE_MAP) - action_map = {'router': {'add_router_interface': 'PUT', - 'remove_router_interface': 'PUT'}} - return resource_helper.build_resource_info(plural_mappings, - RESOURCE_ATTRIBUTE_MAP, - constants.L3, - action_map=action_map, - register_quota=True) - - def update_attributes_map(self, attributes): - super(L3, self).update_attributes_map( - attributes, extension_attrs_map=RESOURCE_ATTRIBUTE_MAP) - - def get_extended_resources(self, version): - if version == "2.0": - return RESOURCE_ATTRIBUTE_MAP - else: - return {} + {}, l3_apidef.RESOURCE_ATTRIBUTE_MAP) + return resource_helper.build_resource_info( + plural_mappings, l3_apidef.RESOURCE_ATTRIBUTE_MAP, + constants.L3, action_map=l3_apidef.ACTION_MAP, + register_quota=True) @six.add_metaclass(abc.ABCMeta) diff --git a/neutron/extensions/tag_ext.py b/neutron/extensions/tag_ext.py index 82e09a2ed48..7b74143bee4 100644 --- a/neutron/extensions/tag_ext.py +++ b/neutron/extensions/tag_ext.py @@ -11,6 +11,7 @@ # License for the specific language governing permissions and limitations # under the License. +from neutron_lib.api.definitions import l3 as l3_apidef from neutron_lib.api.definitions import port as port_def from neutron_lib.api.definitions import subnet as subnet_def from neutron_lib.api.definitions import subnetpool as subnetpool_def @@ -20,7 +21,6 @@ from neutron_lib.plugins import directory from neutron.api import extensions from neutron.api.v2 import resource as api_resource -from neutron.extensions import l3 from neutron.extensions import tagging @@ -32,7 +32,7 @@ TAG_SUPPORTED_RESOURCES = { subnet_def.COLLECTION_NAME: subnet_def.RESOURCE_NAME, port_def.COLLECTION_NAME: port_def.RESOURCE_NAME, subnetpool_def.COLLECTION_NAME: subnetpool_def.RESOURCE_NAME, - l3.ROUTERS: l3.ROUTER, + l3_apidef.ROUTERS: l3_apidef.ROUTER, } diff --git a/neutron/scheduler/l3_agent_scheduler.py b/neutron/scheduler/l3_agent_scheduler.py index aa24cbe8ca1..179ce14728d 100644 --- a/neutron/scheduler/l3_agent_scheduler.py +++ b/neutron/scheduler/l3_agent_scheduler.py @@ -21,6 +21,7 @@ import random from neutron_lib.api.definitions import availability_zone as az_def from neutron_lib import constants as lib_const +from neutron_lib.exceptions import l3 as l3_exc from oslo_config import cfg from oslo_db import exception as db_exc from oslo_log import log as logging @@ -31,7 +32,6 @@ from neutron.common import utils from neutron.conf.db import l3_hamode_db from neutron.db import api as db_api from neutron.db.models import l3agent as rb_model -from neutron.extensions import l3 from neutron.objects import l3agent as rb_obj @@ -307,7 +307,7 @@ class L3Scheduler(object): # and RouterPort tables plugin._core_plugin.delete_port(context, port_id, l3_port_check=False) - except l3.RouterNotFound: + except l3_exc.RouterNotFound: LOG.debug('Router %s has already been removed ' 'by concurrent operation', router_id) # we try to clear the HA network here in case the port we created diff --git a/neutron/services/auto_allocate/db.py b/neutron/services/auto_allocate/db.py index 96d35abbeb8..c1f35815a0e 100644 --- a/neutron/services/auto_allocate/db.py +++ b/neutron/services/auto_allocate/db.py @@ -14,6 +14,7 @@ # License for the specific language governing permissions and limitations # under the License. +from neutron_lib.api.definitions import l3 as l3_apidef from neutron_lib.api.definitions import network as net_def from neutron_lib.callbacks import events from neutron_lib.callbacks import registry @@ -30,7 +31,6 @@ from neutron.db import _resource_extend as resource_extend from neutron.db import _utils as db_utils from neutron.db import api as db_api from neutron.db import common_db_mixin -from neutron.extensions import l3 from neutron.objects import auto_allocate as auto_allocate_obj from neutron.objects import base as base_obj from neutron.objects import network as net_obj @@ -297,7 +297,8 @@ class AutoAllocatedTopologyMixin(common_db_mixin.CommonDbMixin): """Uplink tenant subnet(s) to external network.""" router_args = { 'name': 'auto_allocated_router', - l3.EXTERNAL_GW_INFO: {'network_id': default_external_network}, + l3_apidef.EXTERNAL_GW_INFO: { + 'network_id': default_external_network}, 'tenant_id': tenant_id, 'admin_state_up': True } diff --git a/neutron/services/l3_router/l3_router_plugin.py b/neutron/services/l3_router/l3_router_plugin.py index c11f68b56f4..329d4be1c4c 100644 --- a/neutron/services/l3_router/l3_router_plugin.py +++ b/neutron/services/l3_router/l3_router_plugin.py @@ -13,6 +13,7 @@ # License for the specific language governing permissions and limitations # under the License. +from neutron_lib.api.definitions import l3 as l3_apidef from neutron_lib import constants as n_const from neutron_lib.plugins import constants as plugin_constants from neutron_lib.services import base as service_base @@ -36,7 +37,6 @@ from neutron.db import l3_gwmode_db from neutron.db import l3_hamode_db from neutron.db import l3_hascheduler_db from neutron.db.models import l3 as l3_models -from neutron.extensions import l3 from neutron.quota import resource_registry from neutron import service from neutron.services.l3_router.service_providers import driver_controller @@ -153,6 +153,6 @@ class L3RouterPlugin(service_base.ServicePluginBase, initial_status=n_const.FLOATINGIP_STATUS_DOWN) @staticmethod - @resource_extend.extends([l3.ROUTERS]) + @resource_extend.extends([l3_apidef.ROUTERS]) def add_flavor_id(router_res, router_db): router_res['flavor_id'] = router_db['flavor_id'] diff --git a/neutron/tests/functional/services/l3_router/test_l3_dvr_ha_router_plugin.py b/neutron/tests/functional/services/l3_router/test_l3_dvr_ha_router_plugin.py index 79e90962c34..92bf1961cdf 100644 --- a/neutron/tests/functional/services/l3_router/test_l3_dvr_ha_router_plugin.py +++ b/neutron/tests/functional/services/l3_router/test_l3_dvr_ha_router_plugin.py @@ -14,11 +14,11 @@ import mock from neutron_lib.api.definitions import external_net as extnet_apidef +from neutron_lib.api.definitions import l3 as l3_apidef from neutron_lib.api.definitions import portbindings from neutron_lib import constants from neutron.common import topics -from neutron.extensions import l3 from neutron.tests.common import helpers from neutron.tests.functional.services.l3_router import \ test_l3_dvr_router_plugin @@ -235,7 +235,7 @@ class L3DvrHATestCase(test_l3_dvr_router_plugin.L3DvrTestCase): gw_info = {'network_id': ext_net['network']['id']} self.l3_plugin.update_router( self.context, router['id'], - {'router': {l3.EXTERNAL_GW_INFO: gw_info}}) + {'router': {l3_apidef.EXTERNAL_GW_INFO: gw_info}}) self.l3_plugin.add_router_interface( self.context, router['id'], {'subnet_id': subnet['subnet']['id']}) @@ -266,7 +266,7 @@ class L3DvrHATestCase(test_l3_dvr_router_plugin.L3DvrTestCase): gw_info = {'network_id': ext_net['network']['id']} self.l3_plugin.update_router( self.context, router['id'], - {'router': {l3.EXTERNAL_GW_INFO: gw_info}}) + {'router': {l3_apidef.EXTERNAL_GW_INFO: gw_info}}) self.l3_plugin.add_router_interface( self.context, router['id'], {'subnet_id': subnet['subnet']['id']}) @@ -312,12 +312,12 @@ class L3DvrHATestCase(test_l3_dvr_router_plugin.L3DvrTestCase): gw_info = {'network_id': ext_net['network']['id']} self.l3_plugin.update_router( self.context, router['id'], - {'router': {l3.EXTERNAL_GW_INFO: gw_info}}) + {'router': {l3_apidef.EXTERNAL_GW_INFO: gw_info}}) def _clear_external_gateway(self, router): self.l3_plugin.update_router( self.context, router['id'], - {'router': {l3.EXTERNAL_GW_INFO: {}}}) + {'router': {l3_apidef.EXTERNAL_GW_INFO: {}}}) def _remove_interface_from_router(self, router, subnet): self.l3_plugin.remove_router_interface( diff --git a/neutron/tests/functional/services/l3_router/test_l3_dvr_router_plugin.py b/neutron/tests/functional/services/l3_router/test_l3_dvr_router_plugin.py index df7e852e12c..4886a19a926 100644 --- a/neutron/tests/functional/services/l3_router/test_l3_dvr_router_plugin.py +++ b/neutron/tests/functional/services/l3_router/test_l3_dvr_router_plugin.py @@ -14,6 +14,7 @@ import mock from neutron_lib.api.definitions import external_net as extnet_apidef +from neutron_lib.api.definitions import l3 as l3_apidef from neutron_lib.api.definitions import portbindings from neutron_lib.callbacks import events from neutron_lib.callbacks import registry @@ -25,7 +26,6 @@ from neutron_lib import context from neutron.api.rpc.handlers import l3_rpc from neutron.common import constants as n_const from neutron.common import topics -from neutron.extensions import l3 from neutron.tests.common import helpers from neutron.tests.unit.plugins.ml2 import base as ml2_test_base @@ -160,7 +160,7 @@ class L3DvrTestCase(L3DvrTestCaseBase): gw_info = {'network_id': ext_net['network']['id']} self.l3_plugin.update_router( self.context, router['id'], - {'router': {l3.EXTERNAL_GW_INFO: gw_info}}) + {'router': {l3_apidef.EXTERNAL_GW_INFO: gw_info}}) snat_router_intfs = self.l3_plugin._get_snat_sync_interfaces( self.context, [router['id']]) diff --git a/neutron/tests/unit/db/test_l3_db.py b/neutron/tests/unit/db/test_l3_db.py index 7fd939cb93c..c2d8df89c9e 100644 --- a/neutron/tests/unit/db/test_l3_db.py +++ b/neutron/tests/unit/db/test_l3_db.py @@ -21,13 +21,13 @@ from neutron_lib.callbacks import resources from neutron_lib import constants as n_const from neutron_lib import context from neutron_lib import exceptions as n_exc +from neutron_lib.exceptions import l3 as l3_exc from neutron_lib.plugins import directory from oslo_utils import uuidutils import testtools from neutron.db import l3_db from neutron.db.models import l3 as l3_models -from neutron.extensions import l3 from neutron.objects import router as l3_obj from neutron.tests import base @@ -184,7 +184,7 @@ class TestL3_NAT_dbonly_mixin(base.BaseTestCase): 'device_id': '44', 'id': 'f', 'fixed_ips': [{'ip_address': '1.1.1.1', 'subnet_id': '4'}]} self.db.get_router = mock.Mock() - self.db.get_router.side_effect = l3.RouterNotFound(router_id='44') + self.db.get_router.side_effect = l3_exc.RouterNotFound(router_id='44') self.db.prevent_l3_port_deletion(mock.Mock(), None) @mock.patch.object(directory, 'get_plugin') diff --git a/neutron/tests/unit/db/test_l3_dvr_db.py b/neutron/tests/unit/db/test_l3_dvr_db.py index df5890400bf..e09af96da32 100644 --- a/neutron/tests/unit/db/test_l3_dvr_db.py +++ b/neutron/tests/unit/db/test_l3_dvr_db.py @@ -21,6 +21,7 @@ from neutron_lib.callbacks import resources from neutron_lib import constants as const from neutron_lib import context from neutron_lib import exceptions +from neutron_lib.exceptions import l3 as l3_exc from neutron_lib.plugins import constants as plugin_constants from neutron_lib.plugins import directory from oslo_utils import uuidutils @@ -31,7 +32,6 @@ from neutron.db import l3_dvr_db from neutron.db import l3_dvrscheduler_db from neutron.db.models import l3 as l3_models from neutron.db import models_v2 -from neutron.extensions import l3 from neutron.objects import agent as agent_obj from neutron.objects import router as router_obj from neutron.tests.unit.db import test_db_base_plugin_v2 @@ -854,7 +854,7 @@ class L3DvrTestCase(test_db_base_plugin_v2.NeutronDbPluginV2TestCase): self.mixin, '_add_csnat_router_interface_port') as f: f.side_effect = RuntimeError() self.assertRaises( - l3.RouterInterfaceAttachmentConflict, + l3_exc.RouterInterfaceAttachmentConflict, self.mixin.add_router_interface, self.ctx, router['id'], {'subnet_id': subnet['subnet']['id']}) @@ -885,7 +885,7 @@ class L3DvrTestCase(test_db_base_plugin_v2.NeutronDbPluginV2TestCase): router_obj.RouterPort, 'create') as rtrport_update: rtrport_update.side_effect = Exception() self.assertRaises( - l3.RouterInterfaceAttachmentConflict, + l3_exc.RouterInterfaceAttachmentConflict, self.mixin.add_router_interface, self.ctx, router['id'], {'subnet_id': subnet['subnet']['id']}) diff --git a/neutron/tests/unit/db/test_l3_hamode_db.py b/neutron/tests/unit/db/test_l3_hamode_db.py index 2380143bb15..0959fba918f 100644 --- a/neutron/tests/unit/db/test_l3_hamode_db.py +++ b/neutron/tests/unit/db/test_l3_hamode_db.py @@ -24,6 +24,7 @@ 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 l3 as l3_exc from neutron_lib.exceptions import l3_ext_ha_mode as l3ha_exc from neutron_lib.objects import exceptions from neutron_lib.plugins import constants as plugin_constants @@ -43,7 +44,6 @@ from neutron.db import common_db_mixin from neutron.db import l3_agentschedulers_db from neutron.db import l3_hamode_db from neutron.db.models import l3ha as l3ha_model -from neutron.extensions import l3 from neutron.objects import l3_hamode from neutron.scheduler import l3_agent_scheduler from neutron.services.revisions import revision_plugin @@ -279,7 +279,7 @@ class L3HATestCase(L3HATestFramework): def test_ha_router_delete_with_distributed(self): router = self._create_router(ha=True, distributed=True) self.plugin.delete_router(self.admin_ctx, router['id']) - self.assertRaises(l3.RouterNotFound, self.plugin._get_router, + self.assertRaises(l3_exc.RouterNotFound, self.plugin._get_router, self.admin_ctx, router['id']) def test_migration_from_ha(self): @@ -1064,7 +1064,7 @@ class L3HAModeDbTestCase(L3HATestFramework): self.plugin.add_router_interface(self.admin_ctx, router['id'], interface_info) - self.assertRaises(l3.RouterInUse, self.plugin.delete_router, + self.assertRaises(l3_exc.RouterInUse, self.plugin.delete_router, self.admin_ctx, router['id']) bindings = self.plugin.get_ha_router_port_bindings( self.admin_ctx, [router['id']]) diff --git a/neutron/tests/unit/extensions/test_extraroute.py b/neutron/tests/unit/extensions/test_extraroute.py index 3c25c7cbdfd..162403d06c7 100644 --- a/neutron/tests/unit/extensions/test_extraroute.py +++ b/neutron/tests/unit/extensions/test_extraroute.py @@ -13,8 +13,6 @@ # License for the specific language governing permissions and limitations # under the License. -import copy - from neutron_lib.api.definitions import extraroute as xroute_apidef from neutron_lib import constants from neutron_lib import context @@ -36,7 +34,6 @@ _get_path = test_base._get_path class ExtraRouteTestExtensionManager(object): def get_resources(self): - l3.L3().update_attributes_map(xroute_apidef.RESOURCE_ATTRIBUTE_MAP) return l3.L3.get_resources() def get_actions(self): @@ -498,8 +495,6 @@ class ExtraRouteDBIntTestCase(test_l3.L3NatDBIntTestCase, ExtraRouteDBTestCaseBase): def setUp(self, plugin=None, ext_mgr=None): - self._backup = copy.deepcopy(l3.RESOURCE_ATTRIBUTE_MAP) - self.addCleanup(self._restore) if not plugin: plugin = ('neutron.tests.unit.extensions.test_extraroute.' 'TestExtraRouteIntPlugin') @@ -511,15 +506,10 @@ class ExtraRouteDBIntTestCase(test_l3.L3NatDBIntTestCase, ext_mgr=ext_mgr) self.setup_notification_driver() - def _restore(self): - l3.RESOURCE_ATTRIBUTE_MAP = self._backup - class ExtraRouteDBSepTestCase(test_l3.L3NatDBSepTestCase, ExtraRouteDBTestCaseBase): def setUp(self): - self._backup = copy.deepcopy(l3.RESOURCE_ATTRIBUTE_MAP) - self.addCleanup(self._restore) # the plugin without L3 support plugin = 'neutron.tests.unit.extensions.test_l3.TestNoL3NatPlugin' # the L3 service plugin @@ -536,6 +526,3 @@ class ExtraRouteDBSepTestCase(test_l3.L3NatDBSepTestCase, service_plugins=service_plugins) self.setup_notification_driver() - - def _restore(self): - l3.RESOURCE_ATTRIBUTE_MAP = self._backup diff --git a/neutron/tests/unit/extensions/test_l3.py b/neutron/tests/unit/extensions/test_l3.py index de46df98229..e2ad178132b 100644 --- a/neutron/tests/unit/extensions/test_l3.py +++ b/neutron/tests/unit/extensions/test_l3.py @@ -19,8 +19,8 @@ import copy import mock import netaddr -from neutron_lib.api.definitions import dns as dns_apidef from neutron_lib.api.definitions import external_net as extnet_apidef +from neutron_lib.api.definitions import l3 as l3_apidef from neutron_lib.api.definitions import portbindings from neutron_lib.callbacks import events from neutron_lib.callbacks import exceptions @@ -29,6 +29,7 @@ from neutron_lib.callbacks import resources from neutron_lib import constants as lib_constants from neutron_lib import context from neutron_lib import exceptions as n_exc +from neutron_lib.exceptions import l3 as l3_exc from neutron_lib.plugins import constants as plugin_constants from neutron_lib.plugins import directory from oslo_config import cfg @@ -623,7 +624,7 @@ class L3NatTestCaseBase(L3NatTestCaseMixin): self.extension_called = True resource_extend.register_funcs( - l3.ROUTERS, [_extend_router_dict_test_attr]) + l3_apidef.ROUTERS, [_extend_router_dict_test_attr]) self.assertFalse(self.extension_called) with self.router(): self.assertTrue(self.extension_called) @@ -897,7 +898,7 @@ class L3NatTestCaseBase(L3NatTestCaseMixin): plugin = directory.get_plugin(plugin_constants.L3) mock.patch.object( plugin, 'update_router', - side_effect=l3.RouterNotFound(router_id='1')).start() + side_effect=l3_exc.RouterNotFound(router_id='1')).start() # ensure the router disappearing doesn't interfere with subnet # creation self._create_subnet(self.fmt, net_id=n['network']['id'], @@ -2985,7 +2986,7 @@ class L3NatTestCaseBase(L3NatTestCaseMixin): if first_router_id: return first_router_id - raise l3.ExternalGatewayForFloatingIPNotFound( + raise l3_exc.ExternalGatewayForFloatingIPNotFound( subnet_id=internal_subnet['id'], external_network_id=external_network_id, port_id=internal_port['id']) @@ -3646,7 +3647,7 @@ class L3AgentDbTestCaseBase(L3NatTestCaseMixin): def test_router_create_event_exception_preserved(self): # this exception should be propagated out of the callback and # converted into its API equivalent of 404 - e404 = mock.Mock(side_effect=l3.RouterNotFound(router_id='1')) + e404 = mock.Mock(side_effect=l3_exc.RouterNotFound(router_id='1')) registry.subscribe(e404, resources.ROUTER, events.PRECOMMIT_CREATE) res = self._create_router(self.fmt, 'tenid') self.assertEqual(exc.HTTPNotFound.code, res.status_int) @@ -3668,7 +3669,7 @@ class L3AgentDbTestCaseBase(L3NatTestCaseMixin): def test_router_update_event_exception_preserved(self): # this exception should be propagated out of the callback and # converted into its API equivalent of 404 - e404 = mock.Mock(side_effect=l3.RouterNotFound(router_id='1')) + e404 = mock.Mock(side_effect=l3_exc.RouterNotFound(router_id='1')) registry.subscribe(e404, resources.ROUTER, events.PRECOMMIT_UPDATE) with self.router(name='a') as r: self._update('routers', r['router']['id'], @@ -3689,7 +3690,7 @@ class L3AgentDbTestCaseBase(L3NatTestCaseMixin): def test_router_delete_event_exception_preserved(self): # this exception should be propagated out of the callback and # converted into its API equivalent of 409 - e409 = mock.Mock(side_effect=l3.RouterInUse(router_id='1')) + e409 = mock.Mock(side_effect=l3_exc.RouterInUse(router_id='1')) registry.subscribe(e409, resources.ROUTER, events.PRECOMMIT_DELETE) with self.router() as r: self._delete('routers', r['router']['id'], @@ -3997,7 +3998,6 @@ class L3NatDBSepTestCase(L3BaseForSepTests, L3NatTestCaseBase, class L3TestExtensionManagerWithDNS(L3TestExtensionManager): def get_resources(self): - l3.L3().update_attributes_map(dns_apidef.RESOURCE_ATTRIBUTE_MAP) return l3.L3.get_resources() @@ -4017,8 +4017,6 @@ class L3NatDBFloatingIpTestCaseWithDNS(L3BaseForSepTests, L3NatTestCaseMixin): _extension_drivers = ['dns'] def setUp(self): - self._l3_resource_backup = copy.deepcopy(l3.RESOURCE_ATTRIBUTE_MAP) - self.addCleanup(self._restore) ext_mgr = L3TestExtensionManagerWithDNS() plugin = 'neutron.plugins.ml2.plugin.Ml2Plugin' cfg.CONF.set_override('extension_drivers', @@ -4030,9 +4028,6 @@ class L3NatDBFloatingIpTestCaseWithDNS(L3BaseForSepTests, L3NatTestCaseMixin): self.mock_client.reset_mock() self.mock_admin_client.reset_mock() - def _restore(self): - l3.RESOURCE_ATTRIBUTE_MAP = self._l3_resource_backup - def _create_network(self, fmt, name, admin_state_up, arg_list=None, set_context=False, tenant_id=None, **kwargs): diff --git a/neutron/tests/unit/extensions/test_l3_ext_gw_mode.py b/neutron/tests/unit/extensions/test_l3_ext_gw_mode.py index 5d7522ce822..8503c536165 100644 --- a/neutron/tests/unit/extensions/test_l3_ext_gw_mode.py +++ b/neutron/tests/unit/extensions/test_l3_ext_gw_mode.py @@ -14,11 +14,9 @@ # under the License. # -import copy - import mock import netaddr -from neutron_lib.api.definitions import l3_ext_gw_mode as l3gwm_apidef +from neutron_lib.api.definitions import l3 as l3_apidef from neutron_lib import constants from neutron_lib import context as nctx from neutron_lib.plugins import directory @@ -58,10 +56,6 @@ FAKE_ROUTER_PORT_MAC = 'bb:bb:bb:bb:bb:bb' class TestExtensionManager(object): def get_resources(self): - # Simulate extension of L3 attribute map - for key in l3.RESOURCE_ATTRIBUTE_MAP.keys(): - l3.RESOURCE_ATTRIBUTE_MAP[key].update( - l3gwm_apidef.RESOURCE_ATTRIBUTE_MAP.get(key, {})) return l3.L3.get_resources() def get_actions(self): @@ -303,14 +297,14 @@ class TestL3GwModeMixin(testlib_api.SqlTestCase): def test_make_router_dict_no_ext_gw(self): self._reset_ext_gw() router_dict = self.target_object._make_router_dict(self.router) - self.assertIsNone(router_dict[l3.EXTERNAL_GW_INFO]) + self.assertIsNone(router_dict[l3_apidef.EXTERNAL_GW_INFO]) def test_make_router_dict_with_ext_gw(self): router_dict = self.target_object._make_router_dict(self.router) self.assertEqual({'network_id': self.ext_net_id, 'enable_snat': True, 'external_fixed_ips': []}, - router_dict[l3.EXTERNAL_GW_INFO]) + router_dict[l3_apidef.EXTERNAL_GW_INFO]) def test_make_router_dict_with_ext_gw_snat_disabled(self): self.router.enable_snat = False @@ -318,7 +312,7 @@ class TestL3GwModeMixin(testlib_api.SqlTestCase): self.assertEqual({'network_id': self.ext_net_id, 'enable_snat': False, 'external_fixed_ips': []}, - router_dict[l3.EXTERNAL_GW_INFO]) + router_dict[l3_apidef.EXTERNAL_GW_INFO]) def test_build_routers_list_no_ext_gw(self): self._reset_ext_gw() @@ -368,8 +362,6 @@ class ExtGwModeIntTestCase(test_db_base_plugin_v2.NeutronDbPluginV2TestCase, test_l3.L3NatTestCaseMixin): def setUp(self, plugin=None, svc_plugins=None, ext_mgr=None): - # Store l3 resource attribute map as it will be updated - self._l3_attribute_map_bk = copy.deepcopy(l3.RESOURCE_ATTRIBUTE_MAP) plugin = plugin or ( 'neutron.tests.unit.extensions.test_l3_ext_gw_mode.' 'TestDbIntPlugin') @@ -379,10 +371,6 @@ class ExtGwModeIntTestCase(test_db_base_plugin_v2.NeutronDbPluginV2TestCase, super(ExtGwModeIntTestCase, self).setUp(plugin=plugin, ext_mgr=ext_mgr, service_plugins=svc_plugins) - self.addCleanup(self.restore_l3_attribute_map) - - def restore_l3_attribute_map(self): - l3.RESOURCE_ATTRIBUTE_MAP = self._l3_attribute_map_bk def _set_router_external_gateway(self, router_id, network_id, snat_enabled=None, @@ -531,9 +519,9 @@ class ExtGwModeSepTestCase(ExtGwModeIntTestCase): def setUp(self, plugin=None): # Store l3 resource attribute map as it will be updated self._l3_attribute_map_bk = {} - for item in l3.RESOURCE_ATTRIBUTE_MAP: + for item in l3_apidef.RESOURCE_ATTRIBUTE_MAP: self._l3_attribute_map_bk[item] = ( - l3.RESOURCE_ATTRIBUTE_MAP[item].copy()) + l3_apidef.RESOURCE_ATTRIBUTE_MAP[item].copy()) plugin = plugin or ( 'neutron.tests.unit.extensions.test_l3.TestNoL3NatPlugin') # the L3 service plugin @@ -544,4 +532,3 @@ class ExtGwModeSepTestCase(ExtGwModeIntTestCase): cfg.CONF.set_default('allow_overlapping_ips', True) super(ExtGwModeSepTestCase, self).setUp(plugin=plugin, svc_plugins=svc_plugins) - self.addCleanup(self.restore_l3_attribute_map) diff --git a/neutron/tests/unit/extensions/test_qos_fip.py b/neutron/tests/unit/extensions/test_qos_fip.py index d8df50d5b29..a67f4a5f026 100644 --- a/neutron/tests/unit/extensions/test_qos_fip.py +++ b/neutron/tests/unit/extensions/test_qos_fip.py @@ -28,8 +28,6 @@ from neutron.tests.unit.extensions import test_l3 class FloatingIPQoSTestExtensionManager(object): def get_resources(self): - l3.RESOURCE_ATTRIBUTE_MAP['floatingips'].update( - qos_fip.EXTENDED_ATTRIBUTES_2_0['floatingips']) return l3.L3.get_resources() def get_actions(self): diff --git a/neutron/tests/unit/extensions/test_router_availability_zone.py b/neutron/tests/unit/extensions/test_router_availability_zone.py index 476f05097ec..b09c0c008b4 100644 --- a/neutron/tests/unit/extensions/test_router_availability_zone.py +++ b/neutron/tests/unit/extensions/test_router_availability_zone.py @@ -11,9 +11,6 @@ # License for the specific language governing permissions and limitations # under the License. -import copy - -from neutron_lib.api.definitions import router_availability_zone as raz_apidef from neutron_lib.plugins import constants from neutron.db.availability_zone import router as router_az_db @@ -55,20 +52,10 @@ class TestAZRouterCase(test_az.AZTestCommon, test_l3.L3NatTestCaseMixin): 'test_router_availability_zone.AZRouterTestPlugin') service_plugins = {'l3_plugin_name': l3_plugin} - self._backup() - l3.RESOURCE_ATTRIBUTE_MAP['routers'].update( - raz_apidef.RESOURCE_ATTRIBUTE_MAP['routers']) ext_mgr = AZL3ExtensionManager() super(TestAZRouterCase, self).setUp(plugin=plugin, ext_mgr=ext_mgr, service_plugins=service_plugins) - def _backup(self): - self.contents_backup = copy.deepcopy(l3.RESOURCE_ATTRIBUTE_MAP) - self.addCleanup(self._restore) - - def _restore(self): - l3.RESOURCE_ATTRIBUTE_MAP = self.contents_backup - def test_create_router_with_az(self): self._register_azs() az_hints = ['nova2'] diff --git a/neutron/tests/unit/scheduler/test_l3_agent_scheduler.py b/neutron/tests/unit/scheduler/test_l3_agent_scheduler.py index 333cbcd8611..cc5e440eb5e 100644 --- a/neutron/tests/unit/scheduler/test_l3_agent_scheduler.py +++ b/neutron/tests/unit/scheduler/test_l3_agent_scheduler.py @@ -21,6 +21,7 @@ import mock from neutron_lib.api.definitions import portbindings from neutron_lib import constants from neutron_lib import context as n_context +from neutron_lib.exceptions import l3 as l3_exc from neutron_lib.plugins import constants as plugin_constants from neutron_lib.plugins import directory from oslo_config import cfg @@ -37,7 +38,6 @@ from neutron.db import l3_dvr_ha_scheduler_db from neutron.db import l3_dvrscheduler_db from neutron.db import l3_hamode_db from neutron.db import l3_hascheduler_db -from neutron.extensions import l3 from neutron.extensions import l3agentscheduler as l3agent from neutron import manager from neutron.objects import agent as agent_obj @@ -1399,7 +1399,8 @@ class L3HATestCaseMixin(testlib_api.SqlTestCase, with mock.patch.object(self.plugin.router_scheduler, 'bind_router'): with mock.patch.object( self.plugin, 'add_ha_port', - side_effect=l3.RouterNotFound(router_id='foo_router')),\ + side_effect=l3_exc.RouterNotFound( + router_id='foo_router')),\ mock.patch.object( self.plugin, 'safe_delete_ha_network') as sd_ha_net: self.plugin.router_scheduler.create_ha_port_and_bind(