summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRodolfo Alonso Hernandez <ralonsoh@redhat.com>2023-02-09 16:36:14 +0100
committerRodolfo Alonso <ralonsoh@redhat.com>2023-02-14 08:53:03 +0000
commitccd9d47cba5af6ec18c5289893d57b965404392c (patch)
treeae1f081ec50f7e8b75eab755850766ba758a4c0c
parentf597154473281233f63b9bc32cb607e801c368a3 (diff)
downloadneutron-ccd9d47cba5af6ec18c5289893d57b965404392c.tar.gz
[OVN] Bump the port revision number in trunk driver
When the subport binding information is updated in the OVN trunk driver, the OVN revision number should be updated too, same as in other ``ovn_client`` method, for example. Closes-Bug: #2006734 Change-Id: Icda34910ea7fe308814e0cc60999b465d3540b67 (cherry picked from commit fce516e3461054716ff2d4623c240d3e006acbeb)
-rw-r--r--neutron/services/trunk/drivers/ovn/trunk_driver.py24
-rw-r--r--neutron/tests/functional/services/trunk/drivers/ovn/test_trunk_driver.py4
-rw-r--r--neutron/tests/unit/services/trunk/drivers/ovn/test_trunk_driver.py2
3 files changed, 25 insertions, 5 deletions
diff --git a/neutron/services/trunk/drivers/ovn/trunk_driver.py b/neutron/services/trunk/drivers/ovn/trunk_driver.py
index ea9186c2f6..721cdc5292 100644
--- a/neutron/services/trunk/drivers/ovn/trunk_driver.py
+++ b/neutron/services/trunk/drivers/ovn/trunk_driver.py
@@ -22,6 +22,8 @@ from oslo_config import cfg
from oslo_log import log
from neutron.common.ovn import constants as ovn_const
+from neutron.db import db_base_plugin_common
+from neutron.db import ovn_revision_numbers_db as db_rev
from neutron.objects import ports as port_obj
from neutron.services.trunk.drivers import base as trunk_base
@@ -47,20 +49,23 @@ class OVNTrunkHandler(object):
context = n_context.get_admin_context()
db_parent_port = port_obj.Port.get_object(context, id=parent_port)
parent_port_status = db_parent_port.status
- for port in subports:
+ for subport in subports:
with db_api.CONTEXT_WRITER.using(context), (
txn(check_error=True)) as ovn_txn:
- self._set_binding_profile(context, port, parent_port,
- parent_port_status, ovn_txn)
+ port = self._set_binding_profile(context, subport, parent_port,
+ parent_port_status, ovn_txn)
+ db_rev.bump_revision(context, port, ovn_const.TYPE_PORTS)
def _unset_sub_ports(self, subports):
txn = self.plugin_driver.nb_ovn.transaction
context = n_context.get_admin_context()
- for port in subports:
+ for subport in subports:
with db_api.CONTEXT_WRITER.using(context), (
txn(check_error=True)) as ovn_txn:
- self._unset_binding_profile(context, port, ovn_txn)
+ port = self._unset_binding_profile(context, subport, ovn_txn)
+ db_rev.bump_revision(context, port, ovn_const.TYPE_PORTS)
+ @db_base_plugin_common.convert_result_to_dict
def _set_binding_profile(self, context, subport, parent_port,
parent_port_status, ovn_txn):
LOG.debug("Setting parent %s for subport %s",
@@ -71,6 +76,9 @@ class OVNTrunkHandler(object):
"binding_profile: %s",
subport.port_id)
return
+ check_rev_cmd = self.plugin_driver.nb_ovn.check_revision_number(
+ db_port.id, db_port, ovn_const.TYPE_PORTS)
+ ovn_txn.add(check_rev_cmd)
try:
# NOTE(flaviof): We expect binding's host to be set. Otherwise,
# sub-port will not transition from DOWN to ACTIVE.
@@ -103,7 +111,9 @@ class OVNTrunkHandler(object):
))
LOG.debug("Done setting parent %s for subport %s",
parent_port, subport.port_id)
+ return db_port
+ @db_base_plugin_common.convert_result_to_dict
def _unset_binding_profile(self, context, subport, ovn_txn):
LOG.debug("Unsetting parent for subport %s", subport.port_id)
db_port = port_obj.Port.get_object(context, id=subport.port_id)
@@ -112,6 +122,9 @@ class OVNTrunkHandler(object):
"binding_profile: %s",
subport.port_id)
return
+ check_rev_cmd = self.plugin_driver.nb_ovn.check_revision_number(
+ db_port.id, db_port, ovn_const.TYPE_PORTS)
+ ovn_txn.add(check_rev_cmd)
try:
db_port.device_owner = ''
for binding in db_port.bindings:
@@ -140,6 +153,7 @@ class OVNTrunkHandler(object):
external_ids_update=ext_ids,
))
LOG.debug("Done unsetting parent for subport %s", subport.port_id)
+ return db_port
def trunk_created(self, trunk):
# Check if parent port is handled by OVN.
diff --git a/neutron/tests/functional/services/trunk/drivers/ovn/test_trunk_driver.py b/neutron/tests/functional/services/trunk/drivers/ovn/test_trunk_driver.py
index 0c42fbff3d..fed86fabbb 100644
--- a/neutron/tests/functional/services/trunk/drivers/ovn/test_trunk_driver.py
+++ b/neutron/tests/functional/services/trunk/drivers/ovn/test_trunk_driver.py
@@ -64,10 +64,13 @@ class TestOVNTrunkDriver(base.TestOVNFunctionalBase):
if row.parent_name and row.tag:
device_owner = row.external_ids[
ovn_const.OVN_DEVICE_OWNER_EXT_ID_KEY]
+ revision_number = row.external_ids[
+ ovn_const.OVN_REV_NUM_EXT_ID_KEY]
ovn_trunk_info.append({'port_id': row.name,
'parent_port_id': row.parent_name,
'tag': row.tag,
'device_owner': device_owner,
+ 'revision_number': revision_number,
})
return ovn_trunk_info
@@ -80,6 +83,7 @@ class TestOVNTrunkDriver(base.TestOVNFunctionalBase):
'parent_port_id': [trunk['port_id']],
'tag': [subport['segmentation_id']],
'device_owner': trunk_consts.TRUNK_SUBPORT_OWNER,
+ 'revision_number': '2',
})
# Check that the subport has the binding is active.
binding = obj_reg.load_class('PortBinding').get_object(
diff --git a/neutron/tests/unit/services/trunk/drivers/ovn/test_trunk_driver.py b/neutron/tests/unit/services/trunk/drivers/ovn/test_trunk_driver.py
index 986380e598..894520bf86 100644
--- a/neutron/tests/unit/services/trunk/drivers/ovn/test_trunk_driver.py
+++ b/neutron/tests/unit/services/trunk/drivers/ovn/test_trunk_driver.py
@@ -87,6 +87,8 @@ class TestTrunkHandler(base.BaseTestCase):
"neutron.objects.ports.PortBinding.update_object").start()
self.mock_clear_levels = mock.patch(
"neutron.objects.ports.PortBindingLevel.delete_objects").start()
+ self.mock_bump_revision = mock.patch(
+ "neutron.db.ovn_revision_numbers_db.bump_revision").start()
def _get_fake_port_obj(self, port_id):
with mock.patch('uuid.UUID') as mock_uuid: