From 225b582a8c218eec242921b0eed291cf6ec19b76 Mon Sep 17 00:00:00 2001 From: Isaku Yamahata Date: Thu, 13 Sep 2012 13:41:04 +0900 Subject: [PATCH] python/ovs/db/idl.py: Transaction._substitute doesn't handle list/tuple Since Transaction._substitute doesn't substitute elements of list/tuple, setting list references results in transaction error. Teach it such case. Example: {"op": "update", "row":{"bridges":["set",[["uuid", "1f42bc19-307f-42e7-a9c0-c12178bd8b51"], ["uuid", "f97e0c76-7146-489d-9bed-29bc704f65fe"]]]}, "table": "Open_vSwitch", "where":[["_uuid", "==", ["uuid", "20c2a046-ae7e-4453-a576-11034db24985"]]]} In the above case, uuid in "row" aren't replaced by "named-uuid" because the function doesn't look into elements of lists. When list/tuple is found, look into elements recursively. Signed-off-by: Isaku Yamahata Signed-off-by: Ben Pfaff --- python/ovs/db/idl.py | 2 ++ tests/ovsdb-idl.at | 10 ++++++++++ tests/test-ovsdb.py | 11 ++++++++++- 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/python/ovs/db/idl.py b/python/ovs/db/idl.py index 5330cea6..3a8dec28 100644 --- a/python/ovs/db/idl.py +++ b/python/ovs/db/idl.py @@ -758,6 +758,8 @@ class Transaction(object): row = self._txn_rows.get(uuid, None) if row and row._data is None: return ["named-uuid", _uuid_name_from_uuid(uuid)] + else: + return [self._substitute_uuids(elem) for elem in json] return json def __disassemble(self): diff --git a/tests/ovsdb-idl.at b/tests/ovsdb-idl.at index 48e74899..68fe8689 100644 --- a/tests/ovsdb-idl.at +++ b/tests/ovsdb-idl.at @@ -429,3 +429,13 @@ OVSDB_CHECK_IDL([external-linking idl, consistent ops], 002: i=1 k=1 ka=[] l2=0 uuid=<1> 003: done ]]) + +OVSDB_CHECK_IDL_PY([external-linking idl, insert ops], + [], + [['linktest']], + [[000: empty +001: commit, status=success +002: i=1 k=1 ka=[1] l2= uuid=<0> +002: i=2 k=1 ka=[1 2] l2= uuid=<1> +003: done +]]) diff --git a/tests/test-ovsdb.py b/tests/test-ovsdb.py index 1350ccde..170476de 100644 --- a/tests/test-ovsdb.py +++ b/tests/test-ovsdb.py @@ -180,7 +180,7 @@ def print_idl(idl, step): for row in l2.itervalues(): s = ["%03d: i=%s l1=" % (step, row.i)] if row.l1: - s.append(str(row.l1.i)) + s.append(str(row.l1[0].i)) s.append(" uuid=%s" % row.uuid) print(''.join(s)) n += 1 @@ -312,6 +312,15 @@ def idl_set(idl, commands, step): sys.stdout.flush() txn.abort() return + elif name == "linktest": + l1_0 = txn.insert(idl.tables["link1"]) + l1_0.i = 1 + l1_0.k = [l1_0] + l1_0.ka = [l1_0] + l1_1 = txn.insert(idl.tables["link1"]) + l1_1.i = 2 + l1_1.k = [l1_0] + l1_1.ka = [l1_0, l1_1] else: sys.stderr.write("unknown command %s\n" % name) sys.exit(1) -- 2.30.2