Add OVO for AutoAllocatedTopology

This patch integrates and implements Oslo-Versioned Objects for Auto
Allocated Topology.

Change-Id: I478af7aa118a947cc9eab36b047cecea6ddd5170
Partially-Implements: blueprint adopt-oslo-versioned-objects-for-db
Co-Authored-By: Anindita Das <anindita.das@intel.com>
This commit is contained in:
Mohit Malik 2016-08-18 14:42:20 -07:00 committed by Victor Morales
parent 31d70948bb
commit 39c74b0533
4 changed files with 82 additions and 17 deletions

View File

@ -0,0 +1,37 @@
# Copyright (c) 2016 Intel Corporation.
# 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 oslo_versionedobjects import base as obj_base
from oslo_versionedobjects import fields as obj_fields
from neutron.objects import base
from neutron.objects import common_types
from neutron.services.auto_allocate import models
@obj_base.VersionedObjectRegistry.register
class AutoAllocatedTopology(base.NeutronDbObject):
# Version 1.0: Initial version
VERSION = '1.0'
db_model = models.AutoAllocatedTopology
primary_keys = ['project_id']
fields = {
'project_id': obj_fields.StringField(),
'network_id': common_types.UUIDField(),
'router_id': common_types.UUIDField(nullable=True),
}

View File

@ -17,7 +17,6 @@
from neutron_lib import constants
from neutron_lib import exceptions as n_exc
from neutron_lib.plugins import directory
from oslo_db import exception as db_exc
from oslo_log import log as logging
from sqlalchemy import sql
@ -35,9 +34,10 @@ 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
from neutron.objects import auto_allocate as auto_allocate_obj
from neutron.objects import exceptions as obj_exc
from neutron.plugins.common import utils as p_utils
from neutron.services.auto_allocate import exceptions
from neutron.services.auto_allocate import models
LOG = logging.getLogger(__name__)
IS_DEFAULT = 'is_default'
@ -198,9 +198,8 @@ class AutoAllocatedTopologyMixin(common_db_mixin.CommonDbMixin):
def _get_auto_allocated_topology(self, context, tenant_id):
"""Return the auto allocated topology record if present or None."""
with context.session.begin(subtransactions=True):
return (context.session.query(models.AutoAllocatedTopology).
filter_by(tenant_id=tenant_id).first())
return auto_allocate_obj.AutoAllocatedTopology.get_object(
context, project_id=tenant_id)
def _get_auto_allocated_network(self, context, tenant_id):
"""Get the auto allocated network for the tenant."""
@ -331,21 +330,13 @@ class AutoAllocatedTopologyMixin(common_db_mixin.CommonDbMixin):
def _save(self, context, tenant_id, network_id, router_id, subnets):
"""Save auto-allocated topology, or revert in case of DB errors."""
try:
# NOTE(armax): saving the auto allocated topology in a
# separate transaction will keep the Neutron DB and the
# Neutron plugin backend in sync, thus allowing for a
# more bullet proof cleanup. Any other error will have
# to bubble up.
with context.session.begin(subtransactions=True):
context.session.add(
models.AutoAllocatedTopology(
tenant_id=tenant_id,
network_id=network_id,
router_id=router_id))
auto_allocate_obj.AutoAllocatedTopology(
context, project_id=tenant_id, network_id=network_id,
router_id=router_id).create()
self.core_plugin.update_network(
context, network_id,
{'network': {'admin_state_up': True}})
except db_exc.DBDuplicateEntry:
except obj_exc.NeutronDbObjectDuplicateEntry:
LOG.debug("Multiple auto-allocated networks detected for "
"tenant %s. Attempting clean up for network %s "
"and router %s.",

View File

@ -0,0 +1,36 @@
# Copyright (c) 2016 Intel Corporation.
#
# 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.objects import auto_allocate
from neutron.tests.unit.objects import test_base as obj_test_base
from neutron.tests.unit import testlib_api
class AutoAllocateTopologyIfaceObjectTestCase(
obj_test_base.BaseObjectIfaceTestCase):
_test_class = auto_allocate.AutoAllocatedTopology
class AutoAllocateTopologyDbObjectTestCase(obj_test_base.BaseDbObjectTestCase,
testlib_api.SqlTestCase):
_test_class = auto_allocate.AutoAllocatedTopology
def setUp(self):
super(AutoAllocateTopologyDbObjectTestCase, self).setUp()
self._create_test_network()
self._create_test_router()
self.update_obj_fields({'network_id': self._network['id'],
'router_id': self._router['id']})

View File

@ -31,6 +31,7 @@ object_data = {
'AddressScope': '1.0-dd0dfdb67775892d3adc090e28e43bd8',
'Agent': '1.0-7106cb40117a8d1f042545796ed8787d',
'AllowedAddressPair': '1.0-9f9186b6f952fbf31d257b0458b852c0',
'AutoAllocatedTopology': '1.0-74642e58c53bf3610dc224c59f81b242',
'DistributedPortBinding': '1.0-39c0d17b281991dcb66716fee5a8bef2',
'DNSNameServer': '1.0-bf87a85327e2d812d1666ede99d9918b',
'ExtraDhcpOpt': '1.0-632f689cbeb36328995a7aed1d0a78d3',