Merge "Defer setting 'ha'/'distributed' flags in L3 code"

This commit is contained in:
Jenkins 2016-09-13 06:29:43 +00:00 committed by Gerrit Code Review
commit dedb632ba5
4 changed files with 29 additions and 5 deletions

View File

@ -71,11 +71,11 @@ class L3_NAT_with_dvr_db_mixin(l3_db.L3_NAT_db_mixin,
def _create_router_db(self, context, router, tenant_id):
"""Create a router db object with dvr additions."""
router['distributed'] = is_distributed_router(router)
with context.session.begin(subtransactions=True):
router_db = super(
L3_NAT_with_dvr_db_mixin, self)._create_router_db(
context, router, tenant_id)
router['distributed'] = is_distributed_router(router)
self._process_extra_attr_router_create(context, router_db, router)
return router_db

View File

@ -466,10 +466,15 @@ class L3_HA_NAT_db_mixin(l3_dvr_db.L3_NAT_with_dvr_db_mixin,
return n_utils.create_object_with_dependency(
creator, dep_getter, dep_creator, dep_id_attr, dep_deleter)
def _process_extra_attr_router_create(self, context, router_db,
router_res):
router_res['ha'] = self._is_ha(router_res)
super(L3_HA_NAT_db_mixin, self)._process_extra_attr_router_create(
context, router_db, router_res)
@db_api.retry_if_session_inactive()
def create_router(self, context, router):
is_ha = self._is_ha(router['router'])
router['router']['ha'] = is_ha
if is_ha:
# we set the allocating status to hide it from the L3 agents
# until we have created all of the requisite interfaces/networks

View File

@ -171,8 +171,9 @@ class DriverController(object):
def _attrs_to_driver(self, router):
"""Get a provider driver handle based on the ha/distributed flags."""
distributed = _is_distributed(router['distributed'])
ha = _is_ha(router['ha'])
distributed = _is_distributed(
router.get('distributed', lib_const.ATTR_NOT_SPECIFIED))
ha = _is_ha(router.get('ha', lib_const.ATTR_NOT_SPECIFIED))
drivers = self.drivers.values()
# make sure default is tried before the rest if defined
if self.default_provider:

View File

@ -44,6 +44,19 @@ class RoutersFlavorTestCase(base.BaseRouterTest):
cls.flavor['id'], sp['service_profile']['id'])
cls.flavor_service_profiles.append((cls.flavor['id'],
sp['service_profile']['id']))
# make another with a different driver
driver = ('neutron.services.l3_router.service_providers.'
'dvr.DvrDriver')
sp = cls.admin_client.create_service_profile(driver=driver)
cls.service_profiles.append(sp['service_profile'])
cls.prem_flavor = cls.create_flavor(
name='better_special_flavor',
description='econonomy comfort',
service_type='L3_ROUTER_NAT')
cls.admin_client.create_flavor_service_profile(
cls.prem_flavor['id'], sp['service_profile']['id'])
cls.flavor_service_profiles.append((cls.prem_flavor['id'],
sp['service_profile']['id']))
@classmethod
def resource_cleanup(cls):
@ -61,10 +74,15 @@ class RoutersFlavorTestCase(base.BaseRouterTest):
flavors = self.client.list_flavors(id=self.flavor['id'])
flavor = flavors['flavors'][0]
self.assertEqual('special_flavor', flavor['name'])
flavors = self.client.list_flavors(id=self.prem_flavor['id'])
prem_flavor = flavors['flavors'][0]
self.assertEqual('better_special_flavor', prem_flavor['name'])
# ensure client can create router with flavor
# ensure client can create router with both flavors
router = self.create_router('name', flavor_id=flavor['id'])
self.assertEqual(flavor['id'], router['flavor_id'])
router = self.create_router('name', flavor_id=prem_flavor['id'])
self.assertEqual(prem_flavor['id'], router['flavor_id'])
@test.idempotent_id('30e73858-a0fc-409c-a2e0-e9cd2826f6a2')
def test_delete_router_flavor_in_use(self):