Relocate SegmentHostMapping DB model

This patch relocates SegmentHostMapping db model to neutron/db/models.

Partial-Bug: #1597913

Change-Id: I630e5c42f9ab781ba6565cdf0f780bf78c2b5dc7
This commit is contained in:
Aradhana Singh 2016-08-26 16:01:49 -05:00
parent 992c006285
commit cf6d700390
6 changed files with 69 additions and 40 deletions

View File

@ -33,6 +33,7 @@ from neutron.common import exceptions as n_exc
from neutron.common import ipv6_utils
from neutron.common import utils as common_utils
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
@ -42,7 +43,6 @@ from neutron.extensions import segment
from neutron.ipam import exceptions as ipam_exceptions
from neutron.ipam import utils as ipam_utils
from neutron.objects import subnet as subnet_obj
from neutron.services.segments import db as segment_svc_db
from neutron.services.segments import exceptions as segment_exc
LOG = logging.getLogger(__name__)
@ -612,7 +612,7 @@ class IpamBackendMixin(db_base_plugin_common.DbBasePluginCommon):
*cannot* reach are excluded.
"""
Subnet = models_v2.Subnet
SegmentHostMapping = segment_svc_db.SegmentHostMapping
SegmentHostMapping = segment_model.SegmentHostMapping
# A host has been provided. Consider these two scenarios
# 1. Not a routed network: subnets are not on segments

View File

@ -48,7 +48,6 @@ from neutron.db import tag_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
from neutron.services.segments import db # noqa
from neutron.services.trunk import models as trunk_models # noqa

View File

@ -0,0 +1,43 @@
# Copyright 2016 Hewlett Packard Enterprise Development, LP
#
# 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 neutron.db import segments_db as db
class SegmentHostMapping(model_base.BASEV2):
segment_id = sa.Column(sa.String(36),
sa.ForeignKey('networksegments.id',
ondelete="CASCADE"),
primary_key=True,
index=True,
nullable=False)
host = sa.Column(sa.String(255),
primary_key=True,
index=True,
nullable=False)
# 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'))

View File

@ -26,11 +26,11 @@ from sqlalchemy import sql
from neutron._i18n import _LI, _LW
from neutron.db import agents_db
from neutron.db import api as db_api
from neutron.db.models import segment as segment_model
from neutron.db.network_dhcp_agent_binding import models as ndab_model
from neutron.extensions import availability_zone as az_ext
from neutron.scheduler import base_resource_filter
from neutron.scheduler import base_scheduler
from neutron.services.segments import db as segments_db
LOG = logging.getLogger(__name__)
@ -66,8 +66,8 @@ class AutoScheduler(object):
dhcp_agents = query.all()
query = context.session.query(
segments_db.SegmentHostMapping.segment_id)
query = query.filter(segments_db.SegmentHostMapping.host == host)
segment_model.SegmentHostMapping.segment_id)
query = query.filter(segment_model.SegmentHostMapping.host == host)
segments_on_host = {s.segment_id for s in query}
for dhcp_agent in dhcp_agents:

View File

@ -18,45 +18,25 @@
import functools
from neutron_lib import constants
from neutron_lib.db import model_base
from neutron_lib import exceptions as n_exc
from oslo_db import exception as db_exc
from oslo_log import helpers as log_helpers
from oslo_utils import uuidutils
import sqlalchemy as sa
from sqlalchemy import orm
from sqlalchemy.orm import exc
from neutron.callbacks import events
from neutron.callbacks import registry
from neutron.callbacks import resources
from neutron.common import _deprecate
from neutron.db import api as db_api
from neutron.db import common_db_mixin
from neutron.db.models import segment as segment_model
from neutron.db import segments_db as db
from neutron.extensions import segment as extension
from neutron import manager
from neutron.services.segments import exceptions
class SegmentHostMapping(model_base.BASEV2):
segment_id = sa.Column(sa.String(36),
sa.ForeignKey('networksegments.id',
ondelete="CASCADE"),
primary_key=True,
index=True,
nullable=False)
host = sa.Column(sa.String(255),
primary_key=True,
index=True,
nullable=False)
# 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'))
_deprecate._moved_global('SegmentHostMapping', new_module=segment_model)
class SegmentDbMixin(common_db_mixin.CommonDbMixin):
@ -179,8 +159,9 @@ class SegmentDbMixin(common_db_mixin.CommonDbMixin):
def get_segments_by_hosts(self, context, hosts):
if not hosts:
return []
query = context.session.query(SegmentHostMapping).filter(
SegmentHostMapping.host.in_(hosts))
query = context.session.query(
segment_model.SegmentHostMapping).filter(
segment_model.SegmentHostMapping.host.in_(hosts))
return list({mapping.segment_id for mapping in query})
@log_helpers.log_method_call
@ -211,16 +192,17 @@ class SegmentDbMixin(common_db_mixin.CommonDbMixin):
def update_segment_host_mapping(context, host, current_segment_ids):
with context.session.begin(subtransactions=True):
segments_host_query = context.session.query(
SegmentHostMapping).filter_by(host=host)
segment_model.SegmentHostMapping).filter_by(host=host)
previous_segment_ids = {
seg_host['segment_id'] for seg_host in segments_host_query}
for segment_id in current_segment_ids - previous_segment_ids:
context.session.add(SegmentHostMapping(segment_id=segment_id,
host=host))
context.session.add(segment_model.SegmentHostMapping(
segment_id=segment_id,
host=host))
stale_segment_ids = previous_segment_ids - current_segment_ids
if stale_segment_ids:
segments_host_query.filter(
SegmentHostMapping.segment_id.in_(
segment_model.SegmentHostMapping.segment_id.in_(
stale_segment_ids)).delete(synchronize_session=False)
@ -230,7 +212,7 @@ def get_hosts_mapped_with_segments(context):
L2 providers can use this method to get an overview of SegmentHostMapping,
and then delete the stale SegmentHostMapping.
"""
query = context.session.query(SegmentHostMapping.host)
query = context.session.query(segment_model.SegmentHostMapping.host)
return {row.host for row in query}
@ -269,8 +251,9 @@ def map_segment_to_hosts(context, segment_id, hosts):
"""Map segment to a collection of hosts."""
with db_api.autonested_transaction(context.session):
for host in hosts:
context.session.add(SegmentHostMapping(segment_id=segment_id,
host=host))
context.session.add(
segment_model.SegmentHostMapping(segment_id=segment_id,
host=host))
def _update_segment_host_mapping_for_agent(resource, event, trigger,
@ -341,3 +324,6 @@ def subscribe():
events.PRECOMMIT_DELETE)
subscribe()
_deprecate._MovedGlobals()

View File

@ -28,6 +28,7 @@ from neutron import context
from neutron.db import agents_db
from neutron.db import agentschedulers_db
from neutron.db import db_base_plugin_v2
from neutron.db.models import segment as segment_model
from neutron.db import portbindings_db
from neutron.db import segments_db
from neutron.extensions import ip_allocation
@ -471,7 +472,7 @@ class HostSegmentMappingTestCase(SegmentTestCase):
def _get_segments_for_host(self, host):
ctx = context.get_admin_context()
segments_host_list = ctx.session.query(
db.SegmentHostMapping).filter_by(host=host)
segment_model.SegmentHostMapping).filter_by(host=host)
return {seg_host['segment_id']: seg_host
for seg_host in segments_host_list}
@ -788,7 +789,7 @@ class TestSegmentAwareIpam(SegmentTestCase):
ctx = context.get_admin_context()
with ctx.session.begin(subtransactions=True):
for segment_id, host in mappings:
record = db.SegmentHostMapping(
record = segment_model.SegmentHostMapping(
segment_id=segment_id,
host=host)
ctx.session.add(record)