From fce516e3461054716ff2d4623c240d3e006acbeb Mon Sep 17 00:00:00 2001 From: Rodolfo Alonso Hernandez Date: Thu, 9 Feb 2023 16:36:14 +0100 Subject: [PATCH] [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 --- .../trunk/drivers/ovn/trunk_driver.py | 24 +++++++++++++++---- .../trunk/drivers/ovn/test_trunk_driver.py | 4 ++++ .../trunk/drivers/ovn/test_trunk_driver.py | 2 ++ 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 0056edf2b7a..650fe1d119c 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 0c42fbff3dc..fed86fabbb4 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 986380e598e..894520bf860 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: