diff --git a/neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/commands.py b/neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/commands.py index b5cbc854d26..584668c55d8 100644 --- a/neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/commands.py +++ b/neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/commands.py @@ -554,8 +554,9 @@ class AddLRouterPortCommand(command.BaseCommand): if col == 'gateway_chassis': col, val = _add_gateway_chassis(self.api, txn, self.name, val) - setattr(lrouter_port, col, val) + self.set_column(lrouter_port, col, val) _addvalue_to_list(lrouter, 'ports', lrouter_port) + self.result = lrouter_port.uuid class UpdateLRouterPortCommand(command.BaseCommand): @@ -580,7 +581,7 @@ class UpdateLRouterPortCommand(command.BaseCommand): if col == 'gateway_chassis': col, val = _add_gateway_chassis(self.api, txn, self.name, val) - setattr(lrouter_port, col, val) + self.set_column(lrouter_port, col, val) class DelLRouterPortCommand(command.BaseCommand): diff --git a/neutron/tests/functional/plugins/ml2/drivers/ovn/mech_driver/ovsdb/test_impl_idl.py b/neutron/tests/functional/plugins/ml2/drivers/ovn/mech_driver/ovsdb/test_impl_idl.py index 3b441f2b123..40fb6049d66 100644 --- a/neutron/tests/functional/plugins/ml2/drivers/ovn/mech_driver/ovsdb/test_impl_idl.py +++ b/neutron/tests/functional/plugins/ml2/drivers/ovn/mech_driver/ovsdb/test_impl_idl.py @@ -819,6 +819,82 @@ class TestNbApi(BaseOvnIdlTest): cprio_res = self.nbapi._get_logical_router_port_ha_chassis_group(lrp) self.assertEqual([], cprio_res) + def test_create_lrp_with_ha_chassis_group_same_txn(self): + mac = next(net_utils.random_mac_generator(['ca', 'fe', 'ca', 'fe'])) + networks = ['192.0.2.0/24'] + lr_name = uuidutils.generate_uuid() + lrp_name = uuidutils.generate_uuid() + self.nbapi.lr_add(lr_name).execute(check_error=True) + + # Create the HCG and the LRP in the same transaction. + with self.nbapi.transaction(check_error=True) as txn: + hcg_cmd = txn.add(self.nbapi.ha_chassis_group_with_hc_add( + uuidutils.generate_uuid(), {'ch1': 1, 'ch2': 2})) + txn.add(self.nbapi.add_lrouter_port( + lrp_name, lr_name, mac=mac, networks=networks, + ha_chassis_group=hcg_cmd)) + + lrp = self.nbapi.lrp_get(lrp_name).execute(check_error=True) + self.assertEqual(hcg_cmd.result.uuid, lrp.ha_chassis_group[0].uuid) + + def test_create_lrp_with_ha_chassis_group_different_txn(self): + mac = next(net_utils.random_mac_generator(['ca', 'fe', 'ca', 'fe'])) + networks = ['192.0.2.0/24'] + lr_name = uuidutils.generate_uuid() + lrp_name = uuidutils.generate_uuid() + self.nbapi.lr_add(lr_name).execute(check_error=True) + + # Create the HCG and the LRP in two consecutive transactions. + hcg = self.nbapi.ha_chassis_group_with_hc_add( + uuidutils.generate_uuid(), {'ch1': 1, 'ch2': 2}).execute( + check_error=True) + self.nbapi.add_lrouter_port( + lrp_name, lr_name, mac=mac, networks=networks, + ha_chassis_group=hcg.uuid).execute(check_error=True) + + lrp = self.nbapi.lrp_get(lrp_name).execute(check_error=True) + self.assertEqual(hcg.uuid, lrp.ha_chassis_group[0].uuid) + + def test_update_lrp_with_ha_chassis_group_same_txn(self): + mac = next(net_utils.random_mac_generator(['ca', 'fe', 'ca', 'fe'])) + networks = ['192.0.2.0/24'] + lr_name = uuidutils.generate_uuid() + lrp_name = uuidutils.generate_uuid() + self.nbapi.lr_add(lr_name).execute(check_error=True) + self.nbapi.add_lrouter_port( + lrp_name, lr_name, mac=mac, + networks=networks).execute(check_error=True) + + # Create the HCG and update the LRP in the same transaction. + with self.nbapi.transaction(check_error=True) as txn: + hcg_cmd = txn.add(self.nbapi.ha_chassis_group_with_hc_add( + uuidutils.generate_uuid(), {'ch1': 1, 'ch2': 2})) + txn.add(self.nbapi.update_lrouter_port( + lrp_name, ha_chassis_group=hcg_cmd)) + + lrp = self.nbapi.lrp_get(lrp_name).execute(check_error=True) + self.assertEqual(hcg_cmd.result.uuid, lrp.ha_chassis_group[0].uuid) + + def test_update_lrp_with_ha_chassis_group_different_txn(self): + mac = next(net_utils.random_mac_generator(['ca', 'fe', 'ca', 'fe'])) + networks = ['192.0.2.0/24'] + lr_name = uuidutils.generate_uuid() + lrp_name = uuidutils.generate_uuid() + self.nbapi.lr_add(lr_name).execute(check_error=True) + self.nbapi.add_lrouter_port( + lrp_name, lr_name, mac=mac, + networks=networks).execute(check_error=True) + + # Create the HCG and update the LRP in two consecutive transactions. + hcg = self.nbapi.ha_chassis_group_with_hc_add( + uuidutils.generate_uuid(), {'ch1': 1, 'ch2': 2}).execute( + check_error=True) + self.nbapi.update_lrouter_port( + lrp_name, ha_chassis_group=hcg.uuid).execute(check_error=True) + + lrp = self.nbapi.lrp_get(lrp_name).execute(check_error=True) + self.assertEqual(hcg.uuid, lrp.ha_chassis_group[0].uuid) + class TestIgnoreConnectionTimeout(BaseOvnIdlTest): @classmethod