diff mbox series

[ovs-dev,v3,python] Handle refTable values with setkey()

Message ID 20200320152238.395-1-twilson@redhat.com
State Accepted
Commit 9435b0b8e6b89ddaec7f0a23ce613f4ae5a1f70b
Headers show
Series [ovs-dev,v3,python] Handle refTable values with setkey() | expand

Commit Message

Terry Wilson March 20, 2020, 3:22 p.m. UTC
For columns like QoS.queues where we have a map containing refTable
values, assigning w/ __setattr__ e.g. qos.queues={1: $queue_row}
works, but using using qos.setkey('queues', 1, $queue_row) results
in an Exception. The opdat argument can essentially just be the
JSON representation of the map column instead of trying to build
it.

Signed-off-by: Terry Wilson <twilson@redhat.com>
---
 python/ovs/db/idl.py    |  3 +--
 tests/idltest.ovsschema | 15 +++++++++++++++
 tests/ovsdb-idl.at      | 13 +++++++++++++
 tests/test-ovsdb.py     | 23 ++++++++++++++++++++++-
 4 files changed, 51 insertions(+), 3 deletions(-)

Comments

Ben Pfaff March 20, 2020, 3:48 p.m. UTC | #1
On Fri, Mar 20, 2020 at 03:22:38PM +0000, Terry Wilson wrote:
> For columns like QoS.queues where we have a map containing refTable
> values, assigning w/ __setattr__ e.g. qos.queues={1: $queue_row}
> works, but using using qos.setkey('queues', 1, $queue_row) results
> in an Exception. The opdat argument can essentially just be the
> JSON representation of the map column instead of trying to build
> it.
> 
> Signed-off-by: Terry Wilson <twilson@redhat.com>

Thanks, applied to master.
0-day Robot March 20, 2020, 4:16 p.m. UTC | #2
Bleep bloop.  Greetings Terry Wilson, I am a robot and I have tried out your patch.
Thanks for your contribution.

I encountered some error that I wasn't expecting.  See the details below.


checkpatch:
WARNING: Line is 110 characters long (recommended limit is 79)
#22 FILE: ofproto/ofproto-unixctl.man:12:
.IQ "\fBofproto/trace\-packet\-out\fR [\fIoptions\fR] \fIbridge\fR \fIbr_flow\fR [\fIpacket\fR] \fIactions\fR"

Lines checked: 28, Warnings: 1, Errors: 0


Please check this out.  If you feel there has been an error, please email aconole@redhat.com

Thanks,
0-day Robot
Terry Wilson April 30, 2020, 1:51 a.m. UTC | #3
Any chance we could get this ( 9435b0b8 ) backported to 2.13 and 2.12 (it
backported cleanly and passed tests on my box). Thanks!

On Fri, Mar 20, 2020 at 10:48 AM Ben Pfaff <blp@ovn.org> wrote:

> On Fri, Mar 20, 2020 at 03:22:38PM +0000, Terry Wilson wrote:
> > For columns like QoS.queues where we have a map containing refTable
> > values, assigning w/ __setattr__ e.g. qos.queues={1: $queue_row}
> > works, but using using qos.setkey('queues', 1, $queue_row) results
> > in an Exception. The opdat argument can essentially just be the
> > JSON representation of the map column instead of trying to build
> > it.
> >
> > Signed-off-by: Terry Wilson <twilson@redhat.com>
>
> Thanks, applied to master.
>
>
Ilya Maximets Nov. 28, 2020, 12:01 a.m. UTC | #4
On 4/30/20 3:51 AM, Terry Wilson wrote:
> Any chance we could get this ( 9435b0b8 ) backported to 2.13 and 2.12 (it
> backported cleanly and passed tests on my box). Thanks!

Hi.  I tried to backport other IDL patch today and there was conflict.
So, I found that this patch was not backported to stable branches.
Backported now to 2.13 and 2.12.

BTW, It might be better to add 'Fixes:' tag for a bug fix, this way it
will be more clear for committer that patch needs a backport.  Follow up
emails sometimes falls through the cracks.

Best regards, Ilya Maximets.

> 
> On Fri, Mar 20, 2020 at 10:48 AM Ben Pfaff <blp@ovn.org> wrote:
> 
>> On Fri, Mar 20, 2020 at 03:22:38PM +0000, Terry Wilson wrote:
>>> For columns like QoS.queues where we have a map containing refTable
>>> values, assigning w/ __setattr__ e.g. qos.queues={1: $queue_row}
>>> works, but using using qos.setkey('queues', 1, $queue_row) results
>>> in an Exception. The opdat argument can essentially just be the
>>> JSON representation of the map column instead of trying to build
>>> it.
>>>
>>> Signed-off-by: Terry Wilson <twilson@redhat.com>
>>
>> Thanks, applied to master.
diff mbox series

Patch

diff --git a/python/ovs/db/idl.py b/python/ovs/db/idl.py
index 020291d48..5850ac7ab 100644
--- a/python/ovs/db/idl.py
+++ b/python/ovs/db/idl.py
@@ -1567,10 +1567,9 @@  class Transaction(object):
                     for col, val in row._mutations['_inserts'].items():
                         column = row._table.columns[col]
                         if column.type.is_map():
-                            opdat = ["map"]
                             datum = data.Datum.from_python(column.type, val,
                                                            _row_to_uuid)
-                            opdat.append(datum.as_list())
+                            opdat = self._substitute_uuids(datum.to_json())
                         else:
                             opdat = ["set"]
                             inner_opdat = []
diff --git a/tests/idltest.ovsschema b/tests/idltest.ovsschema
index bee79fc50..e02b975bc 100644
--- a/tests/idltest.ovsschema
+++ b/tests/idltest.ovsschema
@@ -171,6 +171,21 @@ 
       },
       "isRoot" : false
     },
+    "simple5": {
+      "columns" : {
+        "name": {"type": "string"},
+        "irefmap": {
+          "type": {
+            "key": {"type": "integer"},
+            "value": {"type": "uuid",
+                      "refTable": "simple3"},
+            "min": 0,
+            "max": "unlimited"
+          }
+        }
+      },
+      "isRoot": true
+    },
     "singleton" : {
       "columns" : {
         "name" : {
diff --git a/tests/ovsdb-idl.at b/tests/ovsdb-idl.at
index cc38d69c1..564ef4c78 100644
--- a/tests/ovsdb-idl.at
+++ b/tests/ovsdb-idl.at
@@ -955,6 +955,7 @@  AT_CHECK([sort stdout | uuidfilt], [0],
 # Check that ovsdb-idl figured out that table link2 and column l2 are missing.
 AT_CHECK([grep ovsdb_idl stderr | sort], [0], [dnl
 test-ovsdb|ovsdb_idl|idltest database lacks link2 table (database needs upgrade?)
+test-ovsdb|ovsdb_idl|idltest database lacks simple5 table (database needs upgrade?)
 test-ovsdb|ovsdb_idl|idltest database lacks singleton table (database needs upgrade?)
 test-ovsdb|ovsdb_idl|link1 table in idltest database lacks l2 column (database needs upgrade?)
 ])
@@ -1288,6 +1289,18 @@  OVSDB_CHECK_IDL_PY([partial-map idl],
 009: done
 ]])
 
+OVSDB_CHECK_IDL_PY([partial-map update set refmap idl],
+[['["idltest", {"op":"insert", "table":"simple3", "row":{"name":"myString1"}},
+               {"op":"insert", "table":"simple5", "row":{"name":"myString2"}}]']],
+['partialmapmutateirefmap'],
+[[000: name=myString1 uset=[]
+000: name=myString2 irefmap=[]
+001: commit, status=success
+002: name=myString1 uset=[]
+002: name=myString2 irefmap=[(1 <0>)]
+003: done
+]])
+
 m4_define([OVSDB_CHECK_IDL_PARTIAL_UPDATE_SET_COLUMN],
   [AT_SETUP([$1 - C])
    AT_KEYWORDS([ovsdb server idl partial update set column positive $5])
diff --git a/tests/test-ovsdb.py b/tests/test-ovsdb.py
index 1b94b79a0..a19680274 100644
--- a/tests/test-ovsdb.py
+++ b/tests/test-ovsdb.py
@@ -28,6 +28,7 @@  import ovs.util
 import ovs.vlog
 from ovs.db import data
 from ovs.db import error
+from ovs.db.idl import _row_to_uuid as row_to_uuid
 from ovs.fatal_signal import signal_alarm
 
 vlog = ovs.vlog.Vlog("test-ovsdb")
@@ -159,7 +160,8 @@  def get_simple_printable_row_string(row, columns):
                                          is ovs.db.data.Atom):
             value = getattr(row, column)
             if isinstance(value, dict):
-                value = sorted(value.items())
+                value = sorted((row_to_uuid(k), row_to_uuid(v))
+                               for k, v in value.items())
             s += "%s=%s " % (column, value)
     s = s.strip()
     s = re.sub('""|,|u?\'', "", s)
@@ -212,6 +214,14 @@  def print_idl(idl, step):
             print(s)
             n += 1
 
+    if "simple5" in idl.tables:
+        simple5 = idl.tables["simple5"].rows
+        for row in simple5.values():
+            s = "%03d: " % step
+            s += get_simple_printable_row_string(row, ["name", "irefmap"])
+            print(s)
+            n += 1
+
     if "link1" in idl.tables:
         l1 = idl.tables["link1"].rows
         for row in l1.values():
@@ -303,6 +313,11 @@  def idltest_find_simple3(idl, i):
     return next(idl.index_equal("simple3", "simple3_by_name", i), None)
 
 
+def idltest_find(idl, table, col, match):
+    return next((r for r in idl.tables[table].rows.values() if
+                getattr(r, col) == match), None)
+
+
 def idl_set(idl, commands, step):
     txn = ovs.db.idl.Transaction(idl)
     increment = False
@@ -524,6 +539,12 @@  def idl_set(idl, commands, step):
             setattr(new_row3, 'name', 'String3')
             new_row3.addvalue('uset', new_row41.uuid)
             assert len(getattr(new_row3, 'uset', [])) == 1
+        elif name == 'partialmapmutateirefmap':
+            row3 = idltest_find_simple3(idl, "myString1")
+            row5 = idltest_find(idl, "simple5", "name", "myString2")
+            row5.setkey('irefmap', 1, row3.uuid)
+            maplen = len(row5.irefmap)
+            assert maplen == 1, "expected 1, got %d" % maplen
         else:
             sys.stderr.write("unknown command %s\n" % name)
             sys.exit(1)