Use revision_number instead of DFVersionObjects(port)

Change-Id: I14a64348bafd21d82cd723abc3b701e6ff2115a4
Partial-Bug: #1618738
This commit is contained in:
Hong Hui Xiao 2016-09-22 21:59:51 +08:00
parent 26af96bbf1
commit 66a2ccbde0
3 changed files with 51 additions and 27 deletions

View File

@ -32,7 +32,6 @@ from dragonflow.common import exceptions as df_exceptions
from dragonflow.common import utils as df_utils
from dragonflow.db import api_nb
from dragonflow.db.neutron import lockedobjects_db as lock_db
from dragonflow.db.neutron import versionobjects_db as version_db
from dragonflow.neutron.common import constants as df_const
LOG = log.getLogger(__name__)
@ -458,11 +457,6 @@ class DFMechDriver(driver_api.MechanismDriver):
LOG.info(_LI("DFMechDriver: delete subnet %s"), subnet_id)
def create_port_precommit(self, context):
port_version = version_db._create_db_version_row(
context._plugin_context.session, context.current['id'])
context.current['db_version'] = port_version
@lock_db.wrap_db_lock(lock_db.RESOURCE_ML2_CORE)
def create_port_postcommit(self, context):
port = context.current
@ -495,7 +489,7 @@ class DFMechDriver(driver_api.MechanismDriver):
name=port.get('name', df_const.DF_PORT_DEFAULT_NAME),
enabled=port.get('admin_state_up', False),
chassis=chassis, tunnel_key=tunnel_key,
version=port['db_version'],
version=port['revision_number'],
device_owner=port.get('device_owner', None),
device_id=port.get('device_id', None),
security_groups=port.get('security_groups', []),
@ -528,11 +522,6 @@ class DFMechDriver(driver_api.MechanismDriver):
else:
return False
def update_port_precommit(self, context):
port_version = version_db._update_db_version_row(
context._plugin_context.session, context.current['id'])
context.current['db_version'] = port_version
@lock_db.wrap_db_lock(lock_db.RESOURCE_ML2_CORE)
def update_port_postcommit(self, context):
updated_port = context.current
@ -589,15 +578,11 @@ class DFMechDriver(driver_api.MechanismDriver):
[]),
binding_profile=updated_port.get(portbindings.PROFILE, None),
binding_vnic_type=updated_port.get(portbindings.VNIC_TYPE, None),
version=updated_port['db_version'], remote_vtep=remote_vtep)
version=updated_port['revision_number'], remote_vtep=remote_vtep)
LOG.info(_LI("DFMechDriver: update port %s"), updated_port['id'])
return updated_port
def delete_port_precommit(self, context):
version_db._delete_db_version_row(context._plugin_context.session,
context.current['id'])
@lock_db.wrap_db_lock(lock_db.RESOURCE_ML2_CORE)
def delete_port_postcommit(self, context):
port = context.current

View File

@ -59,13 +59,12 @@ class TestObjectVersion(test_base.DFTestBase):
self.neutron, self.nb_api, network_id))
port_id = port.create()
self.assertTrue(port.exists())
version = self.nb_api.get_logical_port(port_id).get_version()
self.assertEqual(version, 0)
prev_version = self.nb_api.get_logical_port(port_id).get_version()
port.update()
self.assertTrue(port.exists())
version = self.nb_api.get_logical_port(port_id).get_version()
self.assertEqual(version, 1)
self.assertGreater(version, prev_version)
port.close()
self.assertFalse(port.exists())

View File

@ -32,7 +32,6 @@ mock.patch('dragonflow.db.neutron.lockedobjects_db.wrap_db_lock',
stub_wrap_db_lock).start()
from dragonflow.db.neutron import versionobjects_db as version_db
from dragonflow.neutron.ml2 import mech_driver
from neutron.db import securitygroups_db
from neutron.tests import base
from neutron.tests.unit.plugins.ml2 import test_plugin
@ -77,8 +76,6 @@ class TestDFMechDriver(base.BaseTestCase):
tunnel_key = '9999'
binding_profile = {"port_key": "remote_port", "host_ip": "20.0.0.2"}
securitygroups_db.SecurityGroupDbMixin._get_security_groups_on_port = \
mock.Mock(return_value=None)
self.driver._get_allowed_mac_addresses_from_port = mock.Mock(
return_value=allowed_macs)
self.driver.nb_api.allocate_tunnel_key = mock.Mock(
@ -105,9 +102,6 @@ class TestDFMechDriver(base.BaseTestCase):
tunnel_key = '9999'
binding_profile = {"port_key": "remote_port", "host_ip": "20.0.0.2"}
securitygroups_db.SecurityGroupDbMixin._get_security_groups_on_port = \
mock.Mock(return_value=None)
self.driver.nb_api.allocate_tunnel_key = mock.Mock(
return_value=tunnel_key)
port_context = self._get_port_context(tenant_id, network_id, port_id,
@ -178,7 +172,7 @@ class TestDFMechDriver(base.BaseTestCase):
'network_id': net_id,
'binding:profile': binding_profile,
'binding:vnic_type': 'ovs',
'db_version': self.dbversion}
'revision_number': self.dbversion}
return FakeContext(port)
def _get_network_context(self, tenant_id, net_id, network_type, seg_id):
@ -341,6 +335,52 @@ class TestDFMechDriverRevision(test_plugin.Ml2PluginV2TestCase):
subnet_id, network['id'], subnet['tenant_id'],
nw_version=new_network['revision_number'])
def test_create_update_port_revision(self):
with self.port(name='port', device_owner='fake_owner',
device_id='fake_id') as p:
port = p['port']
self.assertGreater(port['revision_number'], 0)
self.nb_api.create_lport.assert_called_with(
id=port['id'],
lswitch_id=port['network_id'],
topic=port['tenant_id'],
macs=[port['mac_address']], ips=mock.ANY,
subnets=mock.ANY, name=port['name'],
enabled=port['admin_state_up'],
chassis=mock.ANY, tunnel_key=mock.ANY,
version=port['revision_number'],
device_owner=port['device_owner'],
device_id=port['device_id'],
security_groups=mock.ANY,
port_security_enabled=mock.ANY,
remote_vtep=False,
allowed_address_pairs=mock.ANY,
binding_profile=mock.ANY,
binding_vnic_type=mock.ANY)
data = {'port': {'name': 'updated'}}
req = self.new_update_request('ports', data, port['id'])
req.get_response(self.api)
prev_version = port['revision_number']
port = self.driver.get_port(self.context, port['id'])
self.assertGreater(port['revision_number'], prev_version)
self.nb_api.update_lport.assert_called_with(
id=port['id'],
topic=port['tenant_id'],
macs=[port['mac_address']], ips=mock.ANY,
subnets=mock.ANY, name=port['name'],
enabled=port['admin_state_up'],
chassis=mock.ANY,
version=port['revision_number'],
device_owner=port['device_owner'],
device_id=port['device_id'],
remote_vtep=False,
security_groups=mock.ANY,
port_security_enabled=mock.ANY,
allowed_address_pairs=mock.ANY,
binding_profile=mock.ANY,
binding_vnic_type=mock.ANY)
class FakeNetworkContext(object):
"""To generate network context for testing purposes only."""