summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTerry Wilson <twilson@redhat.com>2020-03-20 15:22:38 +0000
committerIlya Maximets <i.maximets@ovn.org>2021-03-16 15:42:21 +0100
commitbf3ef6a869a4fbecf64378ef290e4732edd1b61d (patch)
tree4ab6783976c920fc671b6f9db17563850b759f0c
parente9ad1da4f4d82ebfd80b019b02b6002faed9dc47 (diff)
downloadopenvswitch-bf3ef6a869a4fbecf64378ef290e4732edd1b61d.tar.gz
Handle refTable values with setkey()
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> Signed-off-by: Ben Pfaff <blp@ovn.org> Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
-rw-r--r--python/ovs/db/idl.py3
-rw-r--r--tests/idltest.ovsschema15
-rw-r--r--tests/ovsdb-idl.at13
-rw-r--r--tests/test-ovsdb.py23
4 files changed, 51 insertions, 3 deletions
diff --git a/python/ovs/db/idl.py b/python/ovs/db/idl.py
index 250e89756..fcb3e97c5 100644
--- a/python/ovs/db/idl.py
+++ b/python/ovs/db/idl.py
@@ -1374,10 +1374,9 @@ class Transaction(object):
for col, val in six.iteritems(row._mutations['_inserts']):
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 3661816f6..70ad67fe2 100644
--- a/tests/ovsdb-idl.at
+++ b/tests/ovsdb-idl.at
@@ -983,6 +983,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?)
])
@@ -1334,6 +1335,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 1d7c023da..8cab8b47b 100644
--- a/tests/test-ovsdb.py
+++ b/tests/test-ovsdb.py
@@ -30,6 +30,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
import six
@@ -163,7 +164,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)
@@ -216,6 +218,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 six.itervalues(l1):
@@ -307,6 +317,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
@@ -531,6 +546,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)