diff --git a/neutron/db/external_net_db.py b/neutron/db/external_net_db.py index 399b883eab3..9e852a819a1 100644 --- a/neutron/db/external_net_db.py +++ b/neutron/db/external_net_db.py @@ -15,12 +15,8 @@ from neutron_lib.api import validators from neutron_lib import constants as lib_constants -from neutron_lib.db import model_base from neutron_lib import exceptions as n_exc -import sqlalchemy as sa -from sqlalchemy import orm from sqlalchemy.orm import exc -from sqlalchemy import sql from sqlalchemy.sql import expression as expr from neutron._i18n import _ @@ -29,7 +25,9 @@ from neutron.callbacks import events from neutron.callbacks import exceptions as c_exc from neutron.callbacks import registry from neutron.callbacks import resources +from neutron.common import _deprecate from neutron.db import db_base_plugin_v2 +from neutron.db.models import external_net as ext_net_models from neutron.db.models import l3 as l3_models from neutron.db import models_v2 from neutron.db import rbac_db_models as rbac_db @@ -41,29 +39,16 @@ from neutron.plugins.common import constants as service_constants DEVICE_OWNER_ROUTER_GW = lib_constants.DEVICE_OWNER_ROUTER_GW - -class ExternalNetwork(model_base.BASEV2): - network_id = sa.Column(sa.String(36), - sa.ForeignKey('networks.id', ondelete="CASCADE"), - primary_key=True) - # introduced by auto-allocated-topology extension - is_default = sa.Column(sa.Boolean(), nullable=False, - server_default=sql.false()) - # Add a relationship to the Network model in order to instruct - # SQLAlchemy to eagerly load this association - network = orm.relationship( - models_v2.Network, - backref=orm.backref("external", lazy='joined', - uselist=False, cascade='delete')) +_deprecate._moved_global('ExternalNetwork', new_module=ext_net_models) class External_net_db_mixin(object): """Mixin class to add external network methods to db_base_plugin_v2.""" def _network_model_hook(self, context, original_model, query): - query = query.outerjoin(ExternalNetwork, + query = query.outerjoin(ext_net_models.ExternalNetwork, (original_model.id == - ExternalNetwork.network_id)) + ext_net_models.ExternalNetwork.network_id)) return query def _network_filter_hook(self, context, original_model, conditions): @@ -87,8 +72,10 @@ class External_net_db_mixin(object): if not vals: return query if vals[0]: - return query.filter((ExternalNetwork.network_id != expr.null())) - return query.filter((ExternalNetwork.network_id == expr.null())) + return query.filter( + ext_net_models.ExternalNetwork.network_id != expr.null()) + return query.filter( + ext_net_models.ExternalNetwork.network_id == expr.null()) # TODO(salvatore-orlando): Perform this operation without explicitly # referring to db_base_plugin_v2, as plugins that do not extend from it @@ -102,8 +89,9 @@ class External_net_db_mixin(object): def _network_is_external(self, context, net_id): try: - context.session.query(ExternalNetwork).filter_by( - network_id=net_id).one() + context.session.query( + ext_net_models.ExternalNetwork).filter_by( + network_id=net_id).one() return True except exc.NoResultFound: return False @@ -136,7 +124,8 @@ class External_net_db_mixin(object): except c_exc.CallbackFailure as e: # raise the underlying exception raise e.errors[0].error - context.session.add(ExternalNetwork(network_id=net_data['id'])) + context.session.add( + ext_net_models.ExternalNetwork(network_id=net_data['id'])) context.session.add(rbac_db.NetworkRBAC( object_id=net_data['id'], action='access_as_external', target_tenant='*', tenant_id=net_data['tenant_id'])) @@ -165,7 +154,8 @@ class External_net_db_mixin(object): return if new_value: - context.session.add(ExternalNetwork(network_id=net_id)) + context.session.add( + ext_net_models.ExternalNetwork(network_id=net_id)) net_data[external_net.EXTERNAL] = True if allow_all: context.session.add(rbac_db.NetworkRBAC( @@ -181,7 +171,7 @@ class External_net_db_mixin(object): if port: raise external_net.ExternalNetworkInUse(net_id=net_id) - context.session.query(ExternalNetwork).filter_by( + context.session.query(ext_net_models.ExternalNetwork).filter_by( network_id=net_id).delete() context.session.query(rbac_db.NetworkRBAC).filter_by( object_id=net_id, action='access_as_external').delete() @@ -248,8 +238,9 @@ class External_net_db_mixin(object): # deleting the wildcard is okay as long as the tenants with # attached routers have their own entries and the network is # not the default external network. - is_default = context.session.query(ExternalNetwork).filter_by( - network_id=policy['object_id'], is_default=True).count() + is_default = context.session.query( + ext_net_models.ExternalNetwork).filter_by( + network_id=policy['object_id'], is_default=True).count() if is_default: msg = _("Default external networks must be shared to " "everyone.") @@ -284,3 +275,6 @@ class External_net_db_mixin(object): new = super(External_net_db_mixin, cls).__new__(cls, *args, **kwargs) new._register_external_net_rbac_hooks() return new + + +_deprecate._MovedGlobals() diff --git a/neutron/db/migration/models/head.py b/neutron/db/migration/models/head.py index 4f0b7a61139..8bb8ef1964c 100644 --- a/neutron/db/migration/models/head.py +++ b/neutron/db/migration/models/head.py @@ -30,7 +30,6 @@ from neutron.db import agents_db # noqa from neutron.db import agentschedulers_db # noqa from neutron.db import dns_db # noqa from neutron.db import dvr_mac_db # noqa -from neutron.db import external_net_db # noqa from neutron.db.extra_dhcp_opt import models as edo_models # noqa from neutron.db import extraroute_db # noqa from neutron.db import flavors_db # noqa diff --git a/neutron/db/models/external_net.py b/neutron/db/models/external_net.py new file mode 100644 index 00000000000..5619dac0c72 --- /dev/null +++ b/neutron/db/models/external_net.py @@ -0,0 +1,37 @@ +# Copyright (c) 2013 OpenStack Foundation. +# All Rights Reserved. +# +# 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 neutron_lib.db import model_base +import sqlalchemy as sa +from sqlalchemy import orm +from sqlalchemy import sql + +from neutron.db import models_v2 + + +class ExternalNetwork(model_base.BASEV2): + network_id = sa.Column(sa.String(36), + sa.ForeignKey('networks.id', ondelete="CASCADE"), + primary_key=True) + # introduced by auto-allocated-topology extension + is_default = sa.Column(sa.Boolean(), nullable=False, + server_default=sql.false()) + # Add a relationship to the Network model in order to instruct + # SQLAlchemy to eagerly load this association + network = orm.relationship( + models_v2.Network, + backref=orm.backref("external", lazy='joined', + uselist=False, cascade='delete')) diff --git a/neutron/services/auto_allocate/db.py b/neutron/services/auto_allocate/db.py index 8df74efd85a..e534b353bd6 100644 --- a/neutron/services/auto_allocate/db.py +++ b/neutron/services/auto_allocate/db.py @@ -28,7 +28,7 @@ from neutron.common import exceptions as c_exc from neutron.db import api as db_api from neutron.db import common_db_mixin from neutron.db import db_base_plugin_v2 -from neutron.db import external_net_db +from neutron.db.models import external_net as ext_net_models from neutron.db import models_v2 from neutron.db import standard_attr from neutron.extensions import l3 @@ -57,14 +57,14 @@ def _ensure_external_network_default_value_callback( is_default = request.get(IS_DEFAULT, False) if event in (events.BEFORE_CREATE, events.BEFORE_UPDATE) and is_default: # ensure there is only one default external network at any given time - obj = (context.session.query(external_net_db.ExternalNetwork). + obj = (context.session.query(ext_net_models.ExternalNetwork). filter_by(is_default=True)).first() if obj and network['id'] != obj.network_id: raise exceptions.DefaultExternalNetworkExists( net_id=obj.network_id) # Reflect the status of the is_default on the create/update request - obj = (context.session.query(external_net_db.ExternalNetwork). + obj = (context.session.query(ext_net_models.ExternalNetwork). filter_by(network_id=network['id'])) obj.update({IS_DEFAULT: is_default}) @@ -220,7 +220,7 @@ class AutoAllocatedTopologyMixin(common_db_mixin.CommonDbMixin): """Get the default external network for the deployment.""" with context.session.begin(subtransactions=True): default_external_networks = (context.session.query( - external_net_db.ExternalNetwork). + ext_net_models.ExternalNetwork). filter_by(is_default=sql.true()). join(models_v2.Network). join(standard_attr.StandardAttribute). diff --git a/neutron/tests/functional/scheduler/test_l3_agent_scheduler.py b/neutron/tests/functional/scheduler/test_l3_agent_scheduler.py index 9ad8c1ae659..ed8d5c03244 100644 --- a/neutron/tests/functional/scheduler/test_l3_agent_scheduler.py +++ b/neutron/tests/functional/scheduler/test_l3_agent_scheduler.py @@ -21,7 +21,7 @@ from oslo_utils import uuidutils import testscenarios from neutron import context -from neutron.db import external_net_db +from neutron.db.models import external_net as ext_net_models from neutron.scheduler import l3_agent_scheduler from neutron.services.l3_router import l3_router_plugin from neutron.tests.common import helpers @@ -590,7 +590,7 @@ class L3DVRSchedulerBaseTest(L3SchedulerBaseTest): {'network': network_dict}) if external: with self.adminContext.session.begin(): - network = external_net_db.ExternalNetwork(network_id=net_id) + network = ext_net_models.ExternalNetwork(network_id=net_id) self.adminContext.session.add(network) return network 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 0fd5ad38cd5..05af987aa3a 100644 --- a/neutron/tests/unit/extensions/test_l3_ext_gw_mode.py +++ b/neutron/tests/unit/extensions/test_l3_ext_gw_mode.py @@ -25,9 +25,9 @@ from webob import exc from neutron import context as nctx from neutron.db import api as db_api -from neutron.db import external_net_db from neutron.db import l3_db from neutron.db import l3_gwmode_db +from neutron.db.models import external_net as ext_net_models from neutron.db.models import l3 as l3_models from neutron.db import models_v2 from neutron.extensions import l3 @@ -132,7 +132,7 @@ class TestL3GwModeMixin(testlib_api.SqlTestCase): tenant_id=self.tenant_id, admin_state_up=True, status=constants.NET_STATUS_ACTIVE) - self.net_ext = external_net_db.ExternalNetwork( + self.net_ext = ext_net_models.ExternalNetwork( network_id=self.ext_net_id) self.context.session.add(self.network) # The following is to avoid complaints from SQLite on