Skip to content

Commit

Permalink
Handle refTable values with setkey()
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Ben Pfaff <[email protected]>
  • Loading branch information
otherwiseguy authored and blp committed Mar 20, 2020
1 parent 047b920 commit 9435b0b
Show file tree
Hide file tree
Showing 4 changed files with 51 additions and 3 deletions.
3 changes: 1 addition & 2 deletions python/ovs/db/idl.py
Original file line number Diff line number Diff line change
Expand Up @@ -1567,10 +1567,9 @@ def commit(self):
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 = []
Expand Down
15 changes: 15 additions & 0 deletions tests/idltest.ovsschema
Original file line number Diff line number Diff line change
Expand Up @@ -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" : {
Expand Down
13 changes: 13 additions & 0 deletions tests/ovsdb-idl.at
Original file line number Diff line number Diff line change
Expand Up @@ -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?)
])
Expand Down Expand Up @@ -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])
Expand Down
23 changes: 22 additions & 1 deletion tests/test-ovsdb.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
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")
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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():
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -524,6 +539,12 @@ def notify(event, row, updates=None):
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)
Expand Down

0 comments on commit 9435b0b

Please sign in to comment.