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:
sindhu devale 2016-08-08 05:29:12 +00:00 committed by Victor Morales
parent 80d4df144d
commit 72ddd2338b
7 changed files with 74 additions and 77 deletions

View File

@ -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):

View File

@ -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

View File

@ -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'))

View File

@ -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()

View File

@ -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(),

View File

@ -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

View File

@ -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'])