Add Gateway_Chassis support

This adds basic support for adding Gateway_Chassis entries as part
of adding a Logical_Router_Port. Since Gateway_Chassis is not a
root table, creating one that wasn't linked to a LRP would be a
NoOp, so there are no API methods for creating/deleting GCs. They
will automatically be deleted by ovdsb-server when the parent LRP
is deleted.

Change-Id: I12d033fac8bcbed73f8de85c688d7cd18c8bdbfb
This commit is contained in:
Terry Wilson 2018-11-29 00:38:52 -06:00
parent 15de3c66aa
commit 2f824c1149
2 changed files with 43 additions and 0 deletions

View File

@ -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

View File

@ -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)