Merge "Wrap nb_api calls with db_lock in the SFC driver"

This commit is contained in:
Zuul 2017-12-31 14:10:26 +00:00 committed by Gerrit Code Review
commit ff05f2b3a0
3 changed files with 29 additions and 2 deletions

View File

@ -50,6 +50,9 @@ RESOURCE_QOS = 9
RESOURCE_NEUTRON_LISTENER = 10
RESOURCE_BGP_SPEAKER = 11
RESOURCE_BGP_PEER = 12
RESOURCE_SFC_PORT_CHAIN = 13
RESOURCE_SFC_PORT_PAIR_GROUP = 14
RESOURCE_SFC_PORT_PAIR = 15
LOG = log.getLogger(__name__)
@ -122,6 +125,12 @@ def _get_lock_id_by_resource_type(resource_type, *args, **kwargs):
lock_id = args[2]
elif RESOURCE_BGP_PEER == resource_type:
lock_id = args[2]
elif RESOURCE_SFC_PORT_CHAIN == resource_type:
lock_id = args[1].current['id']
elif RESOURCE_SFC_PORT_PAIR == resource_type:
lock_id = args[1].current['id']
elif RESOURCE_SFC_PORT_PAIR_GROUP == resource_type:
lock_id = args[1].current['id']
else:
raise df_exc.UnknownResourceException(resource_type=resource_type)

View File

@ -13,6 +13,7 @@
from networking_sfc.services.sfc.drivers import base
from dragonflow.db.models import sfc
from dragonflow.db.neutron import lockedobjects_db as lock_db
from dragonflow.neutron.services import mixins
@ -37,6 +38,7 @@ class DfSfcDriver(base.SfcDriverBase, mixins.LazyNbApiMixin):
def initialize(self):
pass
@lock_db.wrap_db_lock(lock_db.RESOURCE_SFC_PORT_CHAIN)
def create_port_chain_postcommit(self, context):
port_chain = context.current
pc_params = port_chain.get('chain_parameters')
@ -53,6 +55,7 @@ class DfSfcDriver(base.SfcDriverBase, mixins.LazyNbApiMixin):
),
)
@lock_db.wrap_db_lock(lock_db.RESOURCE_SFC_PORT_CHAIN)
def update_port_chain_postcommit(self, context):
port_chain = context.current
extra_args = _get_optional_params(
@ -70,6 +73,7 @@ class DfSfcDriver(base.SfcDriverBase, mixins.LazyNbApiMixin):
),
)
@lock_db.wrap_db_lock(lock_db.RESOURCE_SFC_PORT_CHAIN)
def delete_port_chain_postcommit(self, context):
port_chain = context.current
@ -80,6 +84,7 @@ class DfSfcDriver(base.SfcDriverBase, mixins.LazyNbApiMixin):
),
)
@lock_db.wrap_db_lock(lock_db.RESOURCE_SFC_PORT_PAIR_GROUP)
def create_port_pair_group_postcommit(self, context):
port_pair_group = context.current
@ -93,6 +98,7 @@ class DfSfcDriver(base.SfcDriverBase, mixins.LazyNbApiMixin):
),
)
@lock_db.wrap_db_lock(lock_db.RESOURCE_SFC_PORT_PAIR_GROUP)
def update_port_pair_group_postcommit(self, context):
port_pair_group = context.current
extra_args = _get_optional_params(port_pair_group, 'port_pairs')
@ -106,6 +112,7 @@ class DfSfcDriver(base.SfcDriverBase, mixins.LazyNbApiMixin):
),
)
@lock_db.wrap_db_lock(lock_db.RESOURCE_SFC_PORT_PAIR_GROUP)
def delete_port_pair_group_postcommit(self, context):
port_pair_group = context.current
self.nb_api.delete(
@ -115,6 +122,7 @@ class DfSfcDriver(base.SfcDriverBase, mixins.LazyNbApiMixin):
),
)
@lock_db.wrap_db_lock(lock_db.RESOURCE_SFC_PORT_PAIR)
def create_port_pair_postcommit(self, context):
port_pair = context.current
sf_params = port_pair.get('service_function_parameters', {})
@ -133,6 +141,7 @@ class DfSfcDriver(base.SfcDriverBase, mixins.LazyNbApiMixin):
),
)
@lock_db.wrap_db_lock(lock_db.RESOURCE_SFC_PORT_PAIR)
def update_port_pair_postcommit(self, context):
port_pair = context.current
@ -144,6 +153,7 @@ class DfSfcDriver(base.SfcDriverBase, mixins.LazyNbApiMixin):
),
)
@lock_db.wrap_db_lock(lock_db.RESOURCE_SFC_PORT_PAIR)
def delete_port_pair_postcommit(self, context):
port_pair = context.current

View File

@ -25,7 +25,7 @@ from networking_sfc.tests.unit.db import test_flowclassifier_db
from networking_sfc.tests.unit.db import test_sfc_db
from dragonflow.db.models import sfc
from dragonflow.neutron.services.sfc import driver
from dragonflow.tests.common import utils
class TestDfSfcDriver(
@ -76,7 +76,15 @@ class TestDfSfcDriver(
app = config.load_paste_app('extensions_test_app')
self.ext_api = api_ext.ExtensionMiddleware(app, ext_mgr=ext_mgr)
self.ctx = context.get_admin_context()
self.driver = driver.DfSfcDriver()
self.fake_lockedobjects = mock.patch(
'dragonflow.db.neutron.lockedobjects_db.wrap_db_lock',
side_effect=utils.empty_wrapper)
self.fake_lockedobjects.start()
self.addCleanup(self.fake_lockedobjects.stop)
# Import must be done after mock.patch for wrap_db_lock
self.driver = importutils.import_object(
'dragonflow.neutron.services.sfc.driver.DfSfcDriver')
self.driver.initialize()
self.driver._nb_api = mock.Mock()