Relocate Segment DB Models
As there would be issue of cyclic imports while implementation of objects for segments which has db models definition and mixins in same file, this patch will relocate segment models. Change-Id: I6f5aea69a0f7f1647bb06c86f1fac9367717033c Partial-Bug: #1597913 Co-Authored-By: Victor Morales <victor.morales@intel.com>
This commit is contained in:
parent
80d4df144d
commit
72ddd2338b
|
@ -36,7 +36,6 @@ from neutron.db import db_base_plugin_common
|
|||
from neutron.db.models import segment as segment_model
|
||||
from neutron.db.models import subnet_service_type as sst_model
|
||||
from neutron.db import models_v2
|
||||
from neutron.db import segments_db
|
||||
from neutron.extensions import ip_allocation as ipa
|
||||
from neutron.extensions import portbindings
|
||||
from neutron.extensions import segment
|
||||
|
@ -335,14 +334,15 @@ class IpamBackendMixin(db_base_plugin_common.DbBasePluginCommon):
|
|||
network_id=network_id)
|
||||
|
||||
if segment_id:
|
||||
query = context.session.query(segments_db.NetworkSegment)
|
||||
query = query.filter(segments_db.NetworkSegment.id == segment_id)
|
||||
segment_model = query.one()
|
||||
if segment_model.network_id != network_id:
|
||||
query = context.session.query(segment_model.NetworkSegment)
|
||||
query = query.filter(
|
||||
segment_model.NetworkSegment.id == segment_id)
|
||||
segment = query.one()
|
||||
if segment.network_id != network_id:
|
||||
raise segment_exc.NetworkIdsDontMatch(
|
||||
subnet_network=network_id,
|
||||
segment_id=segment_id)
|
||||
if segment_model.is_dynamic:
|
||||
if segment.is_dynamic:
|
||||
raise segment_exc.SubnetCantAssociateToDynamicSegment()
|
||||
|
||||
def _get_subnet_for_fixed_ip(self, context, fixed, subnets):
|
||||
|
|
|
@ -38,7 +38,6 @@ from neutron.db.port_security import models as ps_models # noqa
|
|||
from neutron.db.qos import models as qos_models # noqa
|
||||
from neutron.db.quota import models as quota_models # noqa
|
||||
from neutron.db import rbac_db_models # noqa
|
||||
from neutron.db import segments_db # noqa
|
||||
from neutron.ipam.drivers.neutrondb_ipam import db_models # noqa
|
||||
from neutron.plugins.ml2 import models as ml2_models # noqa
|
||||
from neutron.services.auto_allocate import models as aa_models # noqa
|
||||
|
|
|
@ -19,7 +19,40 @@ from neutron_lib.db import model_base
|
|||
import sqlalchemy as sa
|
||||
from sqlalchemy import orm
|
||||
|
||||
from neutron.db import segments_db as db
|
||||
from neutron.api.v2 import attributes
|
||||
from neutron.db import models_v2
|
||||
from neutron.db import standard_attr
|
||||
from neutron.extensions import segment
|
||||
|
||||
|
||||
# Some standalone plugins need a DB table to store provider
|
||||
# network information. Initially there was no such table,
|
||||
# but in Mitaka the ML2 NetworkSegment table was promoted here.
|
||||
class NetworkSegment(standard_attr.HasStandardAttributes,
|
||||
model_base.BASEV2, model_base.HasId):
|
||||
"""Represent persistent state of a network segment.
|
||||
|
||||
A network segment is a portion of a neutron network with a
|
||||
specific physical realization. A neutron network can consist of
|
||||
one or more segments.
|
||||
"""
|
||||
|
||||
network_id = sa.Column(sa.String(36),
|
||||
sa.ForeignKey('networks.id', ondelete="CASCADE"),
|
||||
nullable=False)
|
||||
network_type = sa.Column(sa.String(32), nullable=False)
|
||||
physical_network = sa.Column(sa.String(64))
|
||||
segmentation_id = sa.Column(sa.Integer)
|
||||
is_dynamic = sa.Column(sa.Boolean, default=False, nullable=False,
|
||||
server_default=sa.sql.false())
|
||||
segment_index = sa.Column(sa.Integer, nullable=False, server_default='0')
|
||||
name = sa.Column(sa.String(attributes.NAME_MAX_LEN),
|
||||
nullable=True)
|
||||
network = orm.relationship(models_v2.Network,
|
||||
backref=orm.backref("segments",
|
||||
lazy='joined',
|
||||
cascade='delete'))
|
||||
api_collections = [segment.SEGMENTS]
|
||||
|
||||
|
||||
class SegmentHostMapping(model_base.BASEV2):
|
||||
|
@ -38,6 +71,6 @@ class SegmentHostMapping(model_base.BASEV2):
|
|||
# Add a relationship to the NetworkSegment model in order to instruct
|
||||
# SQLAlchemy to eagerly load this association
|
||||
network_segment = orm.relationship(
|
||||
db.NetworkSegment, backref=orm.backref("segment_host_mapping",
|
||||
lazy='joined',
|
||||
cascade='delete'))
|
||||
NetworkSegment, backref=orm.backref("segment_host_mapping",
|
||||
lazy='joined',
|
||||
cascade='delete'))
|
||||
|
|
|
@ -10,62 +10,24 @@
|
|||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
from neutron_lib.db import model_base
|
||||
from oslo_log import log as logging
|
||||
from oslo_utils import uuidutils
|
||||
import sqlalchemy as sa
|
||||
from sqlalchemy import orm
|
||||
from sqlalchemy.orm import exc
|
||||
|
||||
from neutron._i18n import _LI
|
||||
from neutron.api.v2 import attributes
|
||||
from neutron.callbacks import events
|
||||
from neutron.callbacks import registry
|
||||
from neutron.callbacks import resources
|
||||
from neutron.db import models_v2
|
||||
from neutron.db import standard_attr
|
||||
from neutron.extensions import segment
|
||||
from neutron.common import _deprecate
|
||||
from neutron.db.models import segment as segments_model
|
||||
|
||||
_deprecate._moved_global('NetworkSegment', new_module=segments_model)
|
||||
|
||||
LOG = logging.getLogger(__name__)
|
||||
|
||||
|
||||
"""
|
||||
Some standalone plugins need a DB table to store provider
|
||||
network information. Initially there was no such table,
|
||||
but in Mitaka the ML2 NetworkSegment table was promoted here.
|
||||
"""
|
||||
|
||||
|
||||
class NetworkSegment(standard_attr.HasStandardAttributes,
|
||||
model_base.BASEV2, model_base.HasId):
|
||||
"""Represent persistent state of a network segment.
|
||||
|
||||
A network segment is a portion of a neutron network with a
|
||||
specific physical realization. A neutron network can consist of
|
||||
one or more segments.
|
||||
"""
|
||||
|
||||
network_id = sa.Column(sa.String(36),
|
||||
sa.ForeignKey('networks.id', ondelete="CASCADE"),
|
||||
nullable=False)
|
||||
network_type = sa.Column(sa.String(32), nullable=False)
|
||||
physical_network = sa.Column(sa.String(64))
|
||||
segmentation_id = sa.Column(sa.Integer)
|
||||
is_dynamic = sa.Column(sa.Boolean, default=False, nullable=False,
|
||||
server_default=sa.sql.false())
|
||||
segment_index = sa.Column(sa.Integer, nullable=False, server_default='0')
|
||||
name = sa.Column(sa.String(attributes.NAME_MAX_LEN),
|
||||
nullable=True)
|
||||
network = orm.relationship(models_v2.Network,
|
||||
backref=orm.backref("segments",
|
||||
lazy='joined',
|
||||
cascade='delete'))
|
||||
api_collections = [segment.SEGMENTS]
|
||||
|
||||
|
||||
NETWORK_TYPE = NetworkSegment.network_type.name
|
||||
PHYSICAL_NETWORK = NetworkSegment.physical_network.name
|
||||
SEGMENTATION_ID = NetworkSegment.segmentation_id.name
|
||||
NETWORK_TYPE = segments_model.NetworkSegment.network_type.name
|
||||
PHYSICAL_NETWORK = segments_model.NetworkSegment.physical_network.name
|
||||
SEGMENTATION_ID = segments_model.NetworkSegment.segmentation_id.name
|
||||
|
||||
|
||||
def _make_segment_dict(record):
|
||||
|
@ -79,7 +41,7 @@ def _make_segment_dict(record):
|
|||
def add_network_segment(context, network_id, segment, segment_index=0,
|
||||
is_dynamic=False):
|
||||
with context.session.begin(subtransactions=True):
|
||||
record = NetworkSegment(
|
||||
record = segments_model.NetworkSegment(
|
||||
id=uuidutils.generate_uuid(),
|
||||
network_id=network_id,
|
||||
network_type=segment.get(NETWORK_TYPE),
|
||||
|
@ -112,9 +74,10 @@ def get_networks_segments(session, network_ids, filter_dynamic=False):
|
|||
return {}
|
||||
|
||||
with session.begin(subtransactions=True):
|
||||
query = (session.query(NetworkSegment).
|
||||
filter(NetworkSegment.network_id.in_(network_ids)).
|
||||
order_by(NetworkSegment.segment_index))
|
||||
query = (session.query(segments_model.NetworkSegment).
|
||||
filter(segments_model.NetworkSegment.network_id
|
||||
.in_(network_ids)).
|
||||
order_by(segments_model.NetworkSegment.segment_index))
|
||||
if filter_dynamic is not None:
|
||||
query = query.filter_by(is_dynamic=filter_dynamic)
|
||||
records = query.all()
|
||||
|
@ -127,7 +90,7 @@ def get_networks_segments(session, network_ids, filter_dynamic=False):
|
|||
def get_segment_by_id(session, segment_id):
|
||||
with session.begin(subtransactions=True):
|
||||
try:
|
||||
record = (session.query(NetworkSegment).
|
||||
record = (session.query(segments_model.NetworkSegment).
|
||||
filter_by(id=segment_id).
|
||||
one())
|
||||
return _make_segment_dict(record)
|
||||
|
@ -139,7 +102,7 @@ def get_dynamic_segment(session, network_id, physical_network=None,
|
|||
segmentation_id=None):
|
||||
"""Return a dynamic segment for the filters provided if one exists."""
|
||||
with session.begin(subtransactions=True):
|
||||
query = (session.query(NetworkSegment).
|
||||
query = (session.query(segments_model.NetworkSegment).
|
||||
filter_by(network_id=network_id, is_dynamic=True))
|
||||
if physical_network:
|
||||
query = query.filter_by(physical_network=physical_network)
|
||||
|
@ -163,5 +126,8 @@ def get_dynamic_segment(session, network_id, physical_network=None,
|
|||
def delete_network_segment(session, segment_id):
|
||||
"""Release a dynamic segment for the params provided if one exists."""
|
||||
with session.begin(subtransactions=True):
|
||||
(session.query(NetworkSegment).
|
||||
(session.query(segments_model.NetworkSegment).
|
||||
filter_by(id=segment_id).delete())
|
||||
|
||||
|
||||
_deprecate._MovedGlobals()
|
||||
|
|
|
@ -17,11 +17,11 @@ from oslo_versionedobjects import fields as obj_fields
|
|||
|
||||
from neutron.db import api as db_api
|
||||
from neutron.db import dns_db
|
||||
from neutron.db.models import segment as segment_model
|
||||
from neutron.db import models_v2
|
||||
from neutron.db.port_security import models as ps_models
|
||||
from neutron.db.qos import models as qos_models
|
||||
from neutron.db import rbac_db_models
|
||||
from neutron.db import segments_db
|
||||
from neutron.extensions import availability_zone as az_ext
|
||||
from neutron.objects import base
|
||||
from neutron.objects import common_types
|
||||
|
@ -35,7 +35,7 @@ class NetworkSegment(base.NeutronDbObject):
|
|||
# Version 1.0: Initial version
|
||||
VERSION = '1.0'
|
||||
|
||||
db_model = segments_db.NetworkSegment
|
||||
db_model = segment_model.NetworkSegment
|
||||
|
||||
fields = {
|
||||
'id': obj_fields.UUIDField(),
|
||||
|
|
|
@ -58,7 +58,7 @@ class SegmentDbMixin(common_db_mixin.CommonDbMixin):
|
|||
def _get_segment(self, context, segment_id):
|
||||
try:
|
||||
return self._get_by_id(
|
||||
context, db.NetworkSegment, segment_id)
|
||||
context, segment_model.NetworkSegment, segment_id)
|
||||
except exc.NoResultFound:
|
||||
raise exceptions.SegmentNotFound(segment_id=segment_id)
|
||||
|
||||
|
@ -112,7 +112,7 @@ class SegmentDbMixin(common_db_mixin.CommonDbMixin):
|
|||
segment_index = (segments[-1].get('segment_index') + 1)
|
||||
args['segment_index'] = segment_index
|
||||
|
||||
new_segment = db.NetworkSegment(**args)
|
||||
new_segment = segment_model.NetworkSegment(**args)
|
||||
context.session.add(new_segment)
|
||||
# Do some preliminary operations before commiting the segment to db
|
||||
registry.notify(resources.SEGMENT, events.PRECOMMIT_CREATE, self,
|
||||
|
@ -140,7 +140,7 @@ class SegmentDbMixin(common_db_mixin.CommonDbMixin):
|
|||
marker_obj = self._get_marker_obj(context, 'segment', limit, marker)
|
||||
make_segment_dict = functools.partial(self._make_segment_dict)
|
||||
return self._get_collection(context,
|
||||
db.NetworkSegment,
|
||||
segment_model.NetworkSegment,
|
||||
make_segment_dict,
|
||||
filters=filters,
|
||||
fields=fields,
|
||||
|
@ -152,7 +152,7 @@ class SegmentDbMixin(common_db_mixin.CommonDbMixin):
|
|||
@log_helpers.log_method_call
|
||||
def get_segments_count(self, context, filters=None):
|
||||
return self._get_collection_count(context,
|
||||
db.NetworkSegment,
|
||||
segment_model.NetworkSegment,
|
||||
filters=filters)
|
||||
|
||||
@log_helpers.log_method_call
|
||||
|
@ -175,8 +175,8 @@ class SegmentDbMixin(common_db_mixin.CommonDbMixin):
|
|||
|
||||
# Delete segment in DB
|
||||
with context.session.begin(subtransactions=True):
|
||||
query = self._model_query(context, db.NetworkSegment)
|
||||
query = query.filter(db.NetworkSegment.id == uuid)
|
||||
query = self._model_query(context, segment_model.NetworkSegment)
|
||||
query = query.filter(segment_model.NetworkSegment.id == uuid)
|
||||
if 0 == query.delete():
|
||||
raise exceptions.SegmentNotFound(segment_id=uuid)
|
||||
# Do some preliminary operations before deleting segment in db
|
||||
|
@ -242,8 +242,8 @@ def get_segments_with_phys_nets(context, phys_nets):
|
|||
return []
|
||||
|
||||
with context.session.begin(subtransactions=True):
|
||||
segments = context.session.query(db.NetworkSegment).filter(
|
||||
db.NetworkSegment.physical_network.in_(phys_nets))
|
||||
segments = context.session.query(segment_model.NetworkSegment).filter(
|
||||
segment_model.NetworkSegment.physical_network.in_(phys_nets))
|
||||
return segments
|
||||
|
||||
|
||||
|
|
|
@ -32,7 +32,7 @@ from neutron.common import utils
|
|||
from neutron import context
|
||||
from neutron.db import db_base_plugin_v2
|
||||
from neutron.db import model_base
|
||||
from neutron.db import segments_db
|
||||
from neutron.db.models import segment as segments_model
|
||||
from neutron import objects
|
||||
from neutron.objects import base
|
||||
from neutron.objects import common_types
|
||||
|
@ -1150,9 +1150,8 @@ class BaseDbObjectTestCase(_BaseObjectTestCase,
|
|||
}
|
||||
# TODO(korzen): replace with segment.create() once we get an object
|
||||
# implementation for segments
|
||||
self._segment = obj_db_api.create_object(self.context,
|
||||
segments_db.NetworkSegment,
|
||||
test_segment)
|
||||
self._segment = obj_db_api.create_object(
|
||||
self.context, segments_model.NetworkSegment, test_segment)
|
||||
|
||||
def _create_test_port(self, network):
|
||||
self._port = self._create_port(network_id=network['id'])
|
||||
|
|
Loading…
Reference in New Issue