[ovs-dev] [PATCH 4/5] python/ovs/db/idl.py: Transaction._substitute doesn't handle list/tuple
Isaku Yamahata
yamahata at valinux.co.jp
Thu Sep 13 04:41:04 UTC 2012
On Wed, Sep 12, 2012 at 08:56:41PM -0700, Ben Pfaff wrote:
> On Thu, Sep 13, 2012 at 11:30:23AM +0900, Isaku Yamahata wrote:
> > From: Isaku Yamahata <yamahata at valinux.co.jp>
> > Date: Mon, 10 Sep 2012 18:21:20 +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.
>
> That's a bad bug, and I'm surprised that we haven't caught it before.
> But I think that there is still a bug: the C version of
> substitute_uuids(), in ovsdb-idl.c, also recurses through JSON objects.
> Doesn't the Python version need to, similarly, recurse through Python
> dictionaries?
No. Python dictionary isn't passed because JSON map/set are represented
as python list. Please refer to Datum.to_json. Not Datum.to_python.
JSON map is represented as
["map", [['key0': value0], ['key2': value2] ...]]
JSON set is represented as
["set", [value0, value1, ...]]
Here's updated one according to Reid comment.
>From dc1f8fb764060fc9f678349f03801ace6b136fa0 Mon Sep 17 00:00:00 2001
Message-Id: <dc1f8fb764060fc9f678349f03801ace6b136fa0.1347511176.git.yamahata at valinux.co.jp>
In-Reply-To: <cover.1347511176.git.yamahata at valinux.co.jp>
References: <cover.1347511176.git.yamahata at valinux.co.jp>
From: Isaku Yamahata <yamahata at valinux.co.jp>
Date: Mon, 10 Sep 2012 18:21:20 +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 <yamahata at valinux.co.jp>
---
changes v2 -> v3:
- simplify a bit
changes v1 -> v2:
- tuple case wasn't handled correctly.
---
python/ovs/db/idl.py | 2 ++
tests/ovsdb-idl.at | 10 ++++++++++
tests/test-ovsdb.py | 11 ++++++++++-
3 files changed, 22 insertions(+), 1 deletions(-)
diff --git a/python/ovs/db/idl.py b/python/ovs/db/idl.py
index 5330cea..3a8dec2 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 48e7489..68fe868 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 1350ccd..170476d 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)
--
1.7.1.1
--
yamahata
More information about the dev
mailing list