[ovs-dev] [PATCH 4/5] python/ovs/db/idl.py: Transaction._substitute doesn't handle list/tuple

Reid Price reid at nicira.com
Wed Sep 12 15:32:15 UTC 2012


One note inline

On Sep 11, 2555 BE, at 23:17, Isaku Yamahata <yamahata at valinux.co.jp> wrote:

> 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>
> ---
> python/ovs/db/idl.py |    4 ++++
> tests/ovsdb-idl.at   |   10 ++++++++++
> tests/test-ovsdb.py  |   11 ++++++++++-
> 3 files changed, 24 insertions(+), 1 deletions(-)
> 
> diff --git a/python/ovs/db/idl.py b/python/ovs/db/idl.py
> index 7fed0cf..249fbaf 100644
> --- a/python/ovs/db/idl.py
> +++ b/python/ovs/db/idl.py
> @@ -758,6 +758,10 @@ 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:
> +                json = [self._substitute_uuids(element) for element in json]
> +                if type(json) == tuple:
> +                    json = tuple(json)

Didn't look at context, but this can't be correct, right?  Last two lines are
A) Impossible to hit
B) A no-op if json was local already

Do you just mean

 json = tuple(self._substitute_uuids(e) for e 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
> 
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev



More information about the dev mailing list