diff --git a/ovsdbapp/schema/open_vswitch/commands.py b/ovsdbapp/schema/open_vswitch/commands.py index 0c9ab907..78ed03f7 100644 --- a/ovsdbapp/schema/open_vswitch/commands.py +++ b/ovsdbapp/schema/open_vswitch/commands.py @@ -163,31 +163,6 @@ class ListBridgesCommand(BaseCommand): self.api._tables['Bridge'].rows.values()] -class BrGetExternalIdCommand(BaseCommand): - def __init__(self, api, name, field): - super(BrGetExternalIdCommand, self).__init__(api) - self.name = name - self.field = field - - def run_idl(self, txn): - br = idlutils.row_by_value(self.api.idl, 'Bridge', 'name', self.name) - self.result = br.external_ids[self.field] - - -class BrSetExternalIdCommand(BaseCommand): - def __init__(self, api, name, field, value): - super(BrSetExternalIdCommand, self).__init__(api) - self.name = name - self.field = field - self.value = value - - def run_idl(self, txn): - br = idlutils.row_by_value(self.api.idl, 'Bridge', 'name', self.name) - external_ids = getattr(br, 'external_ids', {}) - external_ids[self.field] = self.value - br.external_ids = external_ids - - class SetControllerCommand(BaseCommand): def __init__(self, api, bridge, targets): super(SetControllerCommand, self).__init__(api) @@ -367,3 +342,56 @@ class InterfaceToBridgeCommand(BaseCommand): bridges = self.api._tables['Bridge'].rows.values() self.result = next(br.name for br in bridges if pname in br.ports) + + +class GetExternalIdCommand(BaseCommand): + def __init__(self, api, table, name, field): + super(GetExternalIdCommand, self).__init__(api) + self.table = table + self.name = name + self.field = field + + def run_idl(self, txn): + row = idlutils.row_by_value( + self.api.idl, self.table, 'name', self.name) + self.result = row.external_ids[self.field] + + +class SetExternalIdCommand(BaseCommand): + def __init__(self, api, table, name, field, value): + super(SetExternalIdCommand, self).__init__(api) + self.table = table + self.name = name + self.field = field + self.value = value + + def run_idl(self, txn): + row = idlutils.row_by_value( + self.api.idl, self.table, 'name', self.name) + external_ids = getattr(row, 'external_ids', {}) + external_ids[self.field] = self.value + row.external_ids = external_ids + + +class BrGetExternalIdCommand(GetExternalIdCommand): + def __init__(self, api, name, field): + super(BrGetExternalIdCommand, self).__init__( + api, 'Bridge', name, field) + + +class BrSetExternalIdCommand(SetExternalIdCommand): + def __init__(self, api, name, field, value): + super(BrSetExternalIdCommand, self).__init__( + api, 'Bridge', name, field, value) + + +class IfaceGetExternalIdCommand(GetExternalIdCommand): + def __init__(self, api, name, field): + super(IfaceGetExternalIdCommand, self).__init__( + api, 'Interface', name, field) + + +class IfaceSetExternalIdCommand(SetExternalIdCommand): + def __init__(self, api, name, field, value): + super(IfaceSetExternalIdCommand, self).__init__( + api, 'Interface', name, field, value) diff --git a/ovsdbapp/schema/open_vswitch/impl_idl.py b/ovsdbapp/schema/open_vswitch/impl_idl.py index df5113bc..afc90f2c 100644 --- a/ovsdbapp/schema/open_vswitch/impl_idl.py +++ b/ovsdbapp/schema/open_vswitch/impl_idl.py @@ -145,3 +145,9 @@ class OvsdbIdl(ovs_idl.Backend, api.API): def list_ifaces(self, bridge): return cmd.ListIfacesCommand(self, bridge) + + def iface_get_external_id(self, name, field): + return cmd.IfaceGetExternalIdCommand(self, name, field) + + def iface_set_external_id(self, name, field, value): + return cmd.IfaceSetExternalIdCommand(self, name, field, value) diff --git a/ovsdbapp/tests/functional/schema/open_vswitch/test_impl_idl.py b/ovsdbapp/tests/functional/schema/open_vswitch/test_impl_idl.py index a2706882..4c2f6f60 100644 --- a/ovsdbapp/tests/functional/schema/open_vswitch/test_impl_idl.py +++ b/ovsdbapp/tests/functional/schema/open_vswitch/test_impl_idl.py @@ -118,6 +118,26 @@ class TestOvsdbIdl(base.FunctionalTestCase): self.addCleanup(delattr, type(connection), '_is_running') self.assertFalse(connection.stop(1)) + def test_br_external_id(self): + KEY = "foo" + VALUE = "bar" + self.api.add_br(self.brname).execute(check_error=True) + self.api.br_set_external_id(self.brname, KEY, VALUE).execute( + check_error=True) + external_id = self.api.br_get_external_id(self.brname, KEY).execute( + check_error=True) + self.assertEqual(VALUE, external_id) + + def test_iface_external_id(self): + KEY = "foo" + VALUE = "bar" + self.api.add_br(self.brname).execute(check_error=True) + self.api.iface_set_external_id(self.brname, KEY, VALUE).execute( + check_error=True) + external_id = self.api.iface_get_external_id(self.brname, KEY).execute( + check_error=True) + self.assertEqual(VALUE, external_id) + class ImplIdlTestCase(base.FunctionalTestCase): schemas = ['Open_vSwitch']