diff --git a/neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/maintenance.py b/neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/maintenance.py index e640581c7e6..4b6ad0ad3f9 100644 --- a/neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/maintenance.py +++ b/neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/maintenance.py @@ -600,11 +600,6 @@ class DBInconsistenciesPeriodics(SchemaAwarePeriodicsBase): spacing=ovn_const.MAINTENANCE_ONE_RUN_TASK_SPACING, run_immediately=True) def check_for_ha_chassis_group(self): - # If external ports is not supported stop running - # this periodic task - if not self._ovn_client.is_external_ports_supported(): - raise periodics.NeverAgain() - external_ports = self._nb_idl.db_find_rows( 'Logical_Switch_Port', ('type', '=', ovn_const.LSP_TYPE_EXTERNAL) ).execute(check_error=True) @@ -821,11 +816,6 @@ class DBInconsistenciesPeriodics(SchemaAwarePeriodicsBase): Update baremetal ports DHCP options based on the "disable_ovn_dhcp_for_baremetal_ports" configuration option. """ - # If external ports is not supported stop running - # this periodic task - if not self._ovn_client.is_external_ports_supported(): - raise periodics.NeverAgain() - context = n_context.get_admin_context() ports = ports_obj.Port.get_ports_by_vnic_type_and_host( context, portbindings.VNIC_BAREMETAL) diff --git a/neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/ovn_client.py b/neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/ovn_client.py index f2a60169cc5..b3cffff4d26 100644 --- a/neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/ovn_client.py +++ b/neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/ovn_client.py @@ -142,10 +142,6 @@ class OVNClient: for cmd in commands: txn.add(cmd) - def is_external_ports_supported(self): - return self._nb_idl.is_col_present( - 'Logical_Switch_Port', 'ha_chassis_group') - def _get_allowed_addresses_from_port(self, port): if not port.get(psec.PORTSECURITY): return [], [] @@ -440,12 +436,8 @@ class OVNClient: port_type = ovn_const.LSP_TYPE_LOCALPORT if utils.is_port_external(port): - if self.is_external_ports_supported(): - port_type = ovn_const.LSP_TYPE_EXTERNAL - else: - LOG.warning('The version of OVN used does not support ' - 'the "external ports" feature used for ' - 'SR-IOV ports with OVN native DHCP') + port_type = ovn_const.LSP_TYPE_EXTERNAL + addresses = [] port_security, new_macs = ( self._get_allowed_addresses_from_port(port)) @@ -619,8 +611,7 @@ class OVNClient: 'dhcpv6_options': dhcpv6_options } - if (self.is_external_ports_supported() and - port_info.type == ovn_const.LSP_TYPE_EXTERNAL): + if port_info.type == ovn_const.LSP_TYPE_EXTERNAL: kwargs['ha_chassis_group'], _ = ( utils.sync_ha_chassis_group_network( context, self._nb_idl, self._sb_idl, port['id'], @@ -752,15 +743,14 @@ class OVNClient: portbindings.VIF_TYPE_UNBOUND): columns_dict['addresses'] = [] - if self.is_external_ports_supported(): - if port_info.type == ovn_const.LSP_TYPE_EXTERNAL: - columns_dict['ha_chassis_group'], _ = ( - utils.sync_ha_chassis_group_network( - context, self._nb_idl, self._sb_idl, port['id'], - port['network_id'], txn)) - else: - # Clear the ha_chassis_group field - columns_dict['ha_chassis_group'] = [] + if port_info.type == ovn_const.LSP_TYPE_EXTERNAL: + columns_dict['ha_chassis_group'], _ = ( + utils.sync_ha_chassis_group_network( + context, self._nb_idl, self._sb_idl, port['id'], + port['network_id'], txn)) + else: + # Clear the ha_chassis_group field + columns_dict['ha_chassis_group'] = [] addr_pairs_diff = utils.compute_address_pairs_diff(ovn_port, port) @@ -2203,11 +2193,6 @@ class OVNClient: Check for changes in the HA Chassis Groups upon a network update. """ - # If there are no external ports in this network, there's - # no need to check the AZs - if self.is_external_ports_supported(): - return - # Check for changes in the network Availability Zones ovn_ls_azs = lswitch.external_ids.get( ovn_const.OVN_AZ_HINTS_EXT_ID_KEY, '') diff --git a/neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/ovsdb_monitor.py b/neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/ovsdb_monitor.py index d076fff125e..c16fbec00d5 100644 --- a/neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/ovsdb_monitor.py +++ b/neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/ovsdb_monitor.py @@ -117,9 +117,6 @@ class ChassisEvent(row_event.RowEvent): This method handles the inclusion and removal of Chassis to/from the default HA Chassis Group. """ - if not self.driver._ovn_client.is_external_ports_supported(): - return - is_gw_chassis = utils.is_gateway_chassis(row) # If the Chassis being created is not a gateway, ignore it if not is_gw_chassis and event == self.ROW_CREATE: diff --git a/neutron/tests/unit/plugins/ml2/drivers/ovn/mech_driver/ovsdb/test_maintenance.py b/neutron/tests/unit/plugins/ml2/drivers/ovn/mech_driver/ovsdb/test_maintenance.py index aaaf6176179..3f9608646c8 100644 --- a/neutron/tests/unit/plugins/ml2/drivers/ovn/mech_driver/ovsdb/test_maintenance.py +++ b/neutron/tests/unit/plugins/ml2/drivers/ovn/mech_driver/ovsdb/test_maintenance.py @@ -464,17 +464,9 @@ class TestDBInconsistenciesPeriodics(testlib_api.SqlTestCaseLight, ] nb_idl.db_set.assert_has_calls(expected_calls) - def test_check_for_ha_chassis_group_not_supported(self): - self.fake_ovn_client.is_external_ports_supported.return_value = False - self.assertRaises(periodics.NeverAgain, - self.periodic.check_for_ha_chassis_group) - self.assertFalse( - self.fake_ovn_client._nb_idl.ha_chassis_group_add.called) - @mock.patch.object(utils, 'sync_ha_chassis_group_network') def test_check_for_ha_chassis_group_no_external_ports( self, mock_sync_ha_chassis_group_network): - self.fake_ovn_client.is_external_ports_supported.return_value = True nb_idl = self.fake_ovn_client._nb_idl nb_idl.db_find_rows.return_value.execute.return_value = [] self.assertRaises(periodics.NeverAgain, @@ -484,7 +476,6 @@ class TestDBInconsistenciesPeriodics(testlib_api.SqlTestCaseLight, @mock.patch.object(utils, 'sync_ha_chassis_group_network') def test_check_for_ha_chassis_group(self, mock_sync_ha_chassis_group_network): - self.fake_ovn_client.is_external_ports_supported.return_value = True nb_idl = self.fake_ovn_client._nb_idl hcg0 = fakes.FakeOvsdbRow.create_one_ovsdb_row( @@ -766,7 +757,6 @@ class TestDBInconsistenciesPeriodics(testlib_api.SqlTestCaseLight, def _test_check_baremetal_ports_dhcp_options(self, dhcp_disabled=False): cfg.CONF.set_override('disable_ovn_dhcp_for_baremetal_ports', dhcp_disabled, group='ovn') - self.fake_ovn_client.is_external_ports_supported.return_value = True nb_idl = self.fake_ovn_client._nb_idl self.fake_ovn_client._get_port_options.return_value = 'fake-port-opts' diff --git a/neutron/tests/unit/plugins/ml2/drivers/ovn/mech_driver/ovsdb/test_ovsdb_monitor.py b/neutron/tests/unit/plugins/ml2/drivers/ovn/mech_driver/ovsdb/test_ovsdb_monitor.py index aa3a9fec690..cd041066e87 100644 --- a/neutron/tests/unit/plugins/ml2/drivers/ovn/mech_driver/ovsdb/test_ovsdb_monitor.py +++ b/neutron/tests/unit/plugins/ml2/drivers/ovn/mech_driver/ovsdb/test_ovsdb_monitor.py @@ -655,7 +655,6 @@ class TestChassisEvent(base.BaseTestCase): super().setUp() self.driver = mock.MagicMock() self.nb_ovn = self.driver.nb_ovn - self.driver._ovn_client.is_external_ports_supported.return_value = True self.event = ovsdb_monitor.ChassisEvent(self.driver) self.is_gw_ch_mock = mock.patch.object( utils, 'is_gateway_chassis').start() diff --git a/neutron/tests/unit/plugins/ml2/drivers/ovn/mech_driver/test_mech_driver.py b/neutron/tests/unit/plugins/ml2/drivers/ovn/mech_driver/test_mech_driver.py index 4e1764874cb..2c6bc26dd38 100644 --- a/neutron/tests/unit/plugins/ml2/drivers/ovn/mech_driver/test_mech_driver.py +++ b/neutron/tests/unit/plugins/ml2/drivers/ovn/mech_driver/test_mech_driver.py @@ -1155,6 +1155,7 @@ class TestOVNMechanismDriver(TestOVNMechanismDriverBase): mock_is_ext.return_value = is_extport_present self.sb_ovn.get_extport_chassis_from_cms_options.return_value = [ mock.Mock()] + mock_sync.return_value = (mock.ANY, mock.ANY) with self.network() as net1, \ self.subnet(network=net1) as subnet1, \ self.port(subnet=subnet1, is_admin=True, @@ -1189,9 +1190,12 @@ class TestOVNMechanismDriver(TestOVNMechanismDriverBase): ulsp.assert_called_once_with(mock.ANY, mock.ANY) if is_extport_present: - mock_sync.assert_called_once_with( + # Method "sync_ha_chassis_group_network" called twice: when the + # port is created and when the port is set to UP. + calls = [mock.call( mock.ANY, self.nb_ovn, self.sb_ovn, port1['port']['id'], - port1['port']['network_id'], mock.ANY) + port1['port']['network_id'], mock.ANY)] * 2 + mock_sync.assert_has_calls(calls) else: mock_sync.assert_not_called() @@ -4434,9 +4438,6 @@ class TestOVNMechanismDriverSecurityGroup( self.assertEqual( 3, self.mech_driver.nb_ovn.pg_add_ports.call_count) - @mock.patch('neutron.plugins.ml2.drivers.ovn.mech_driver.ovsdb.' - 'ovn_client.OVNClient.is_external_ports_supported', - lambda *_: True) @mock.patch.object(ovn_utils, 'sync_ha_chassis_group_network') def _test_create_port_with_vnic_type(self, vnic_type, sync_mock): fake_grp = 'fake-default-ha-group-uuid' diff --git a/releasenotes/notes/ovn-ha_chassis_group-support-40fcd1e4cb7f0e73.yaml b/releasenotes/notes/ovn-ha_chassis_group-support-40fcd1e4cb7f0e73.yaml new file mode 100644 index 00000000000..9ffbf18a9db --- /dev/null +++ b/releasenotes/notes/ovn-ha_chassis_group-support-40fcd1e4cb7f0e73.yaml @@ -0,0 +1,7 @@ +--- +features: + - | + Removed support for OVN versions under v20.03.0. The "ha_chassis_group" + field is expected in the "Logical_Router_Port" Northbound table. For more + information, see commit `ovn: Support a new Logical_Switch_Port.type - + 'external' `_.