diff --git a/ovsdbapp/schema/ovn_northbound/commands.py b/ovsdbapp/schema/ovn_northbound/commands.py index 107a8c5f..8d77f55d 100644 --- a/ovsdbapp/schema/ovn_northbound/commands.py +++ b/ovsdbapp/schema/ovn_northbound/commands.py @@ -739,6 +739,13 @@ class LrpAddCommand(cmd.BaseCommand): if self.peer: lrp.peer = self.peer lr.addvalue('ports', lrp) + gwcs = self.columns.pop('gateway_chassis', []) + for n, chassis in enumerate(gwcs): + gwc_name = '%s_%s' % (lrp.name, chassis) + cmd = GatewayChassisAddCommand(self.api, gwc_name, chassis, + len(gwcs) - n, may_exist=True) + cmd.run_idl(txn) + lrp.addvalue('gateway_chassis', cmd.result) self.set_columns(lrp, **self.columns) self.result = lrp.uuid @@ -1291,3 +1298,30 @@ class PgDelPortCommand(_PgUpdatePortsHelper): class PgGetCommand(cmd.BaseGetRowCommand): table = 'Port_Group' + + +class GatewayChassisAddCommand(cmd.AddCommand): + table_name = 'Gateway_Chassis' + + def __init__(self, api, name, chassis_name, priority=0, may_exist=False, + **columns): + super(GatewayChassisAddCommand, self).__init__(api) + self.name = name + self.chassis_name = chassis_name + self.priority = priority + self.may_exist = may_exist + self.columns = columns + + def run_idl(self, txn): + if self.may_exist: + gwc = self.api.lookup(self.table_name, self.name, None) + else: + gwc = None + if not gwc: + # If gwc exists with name, this will properly fail if not may_exist + # since 'name' is indexed + gwc = txn.insert(self.api.tables[self.table_name]) + gwc.name = self.name + gwc.priority = self.priority + self.set_columns(gwc, **self.columns) + self.result = gwc diff --git a/ovsdbapp/tests/functional/schema/ovn_northbound/test_impl_idl.py b/ovsdbapp/tests/functional/schema/ovn_northbound/test_impl_idl.py index 6670a4bf..4785bef1 100644 --- a/ovsdbapp/tests/functional/schema/ovn_northbound/test_impl_idl.py +++ b/ovsdbapp/tests/functional/schema/ovn_northbound/test_impl_idl.py @@ -940,6 +940,15 @@ class TestLogicalRouterPortOps(OvnNorthboundTest): self.assertEqual(options, lrp.options) self.assertEqual(external_ids, lrp.external_ids) + def test_lrp_add_gw_chassis(self): + name, c1, c2 = [utils.get_rand_device_name() for _ in range(3)] + args = (name, 'de:ad:be:ef:4d:ad') + lrp = self._lrp_add(*args, gateway_chassis=(c1, c2)) + c1 = self.api.lookup('Gateway_Chassis', "%s_%s" % (lrp.name, c1)) + c2 = self.api.lookup('Gateway_Chassis', "%s_%s" % (lrp.name, c2)) + self.assertIn(c1, lrp.gateway_chassis) + self.assertIn(c2, lrp.gateway_chassis) + def test_lrp_del_uuid(self): lrp = self._lrp_add(None) self.api.lrp_del(lrp.uuid).execute(check_error=True)