mirror of
https://github.com/openvswitch/ovs
synced 2025-10-27 15:18:06 +00:00
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>
This commit is contained in:
@@ -1567,10 +1567,9 @@ class Transaction(object):
|
|||||||
for col, val in row._mutations['_inserts'].items():
|
for col, val in row._mutations['_inserts'].items():
|
||||||
column = row._table.columns[col]
|
column = row._table.columns[col]
|
||||||
if column.type.is_map():
|
if column.type.is_map():
|
||||||
opdat = ["map"]
|
|
||||||
datum = data.Datum.from_python(column.type, val,
|
datum = data.Datum.from_python(column.type, val,
|
||||||
_row_to_uuid)
|
_row_to_uuid)
|
||||||
opdat.append(datum.as_list())
|
opdat = self._substitute_uuids(datum.to_json())
|
||||||
else:
|
else:
|
||||||
opdat = ["set"]
|
opdat = ["set"]
|
||||||
inner_opdat = []
|
inner_opdat = []
|
||||||
|
|||||||
@@ -171,6 +171,21 @@
|
|||||||
},
|
},
|
||||||
"isRoot" : false
|
"isRoot" : false
|
||||||
},
|
},
|
||||||
|
"simple5": {
|
||||||
|
"columns" : {
|
||||||
|
"name": {"type": "string"},
|
||||||
|
"irefmap": {
|
||||||
|
"type": {
|
||||||
|
"key": {"type": "integer"},
|
||||||
|
"value": {"type": "uuid",
|
||||||
|
"refTable": "simple3"},
|
||||||
|
"min": 0,
|
||||||
|
"max": "unlimited"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"isRoot": true
|
||||||
|
},
|
||||||
"singleton" : {
|
"singleton" : {
|
||||||
"columns" : {
|
"columns" : {
|
||||||
"name" : {
|
"name" : {
|
||||||
|
|||||||
@@ -955,6 +955,7 @@ AT_CHECK([sort stdout | uuidfilt], [0],
|
|||||||
# Check that ovsdb-idl figured out that table link2 and column l2 are missing.
|
# Check that ovsdb-idl figured out that table link2 and column l2 are missing.
|
||||||
AT_CHECK([grep ovsdb_idl stderr | sort], [0], [dnl
|
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 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|idltest database lacks singleton table (database needs upgrade?)
|
||||||
test-ovsdb|ovsdb_idl|link1 table in idltest database lacks l2 column (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
|
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],
|
m4_define([OVSDB_CHECK_IDL_PARTIAL_UPDATE_SET_COLUMN],
|
||||||
[AT_SETUP([$1 - C])
|
[AT_SETUP([$1 - C])
|
||||||
AT_KEYWORDS([ovsdb server idl partial update set column positive $5])
|
AT_KEYWORDS([ovsdb server idl partial update set column positive $5])
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ import ovs.util
|
|||||||
import ovs.vlog
|
import ovs.vlog
|
||||||
from ovs.db import data
|
from ovs.db import data
|
||||||
from ovs.db import error
|
from ovs.db import error
|
||||||
|
from ovs.db.idl import _row_to_uuid as row_to_uuid
|
||||||
from ovs.fatal_signal import signal_alarm
|
from ovs.fatal_signal import signal_alarm
|
||||||
|
|
||||||
vlog = ovs.vlog.Vlog("test-ovsdb")
|
vlog = ovs.vlog.Vlog("test-ovsdb")
|
||||||
@@ -159,7 +160,8 @@ def get_simple_printable_row_string(row, columns):
|
|||||||
is ovs.db.data.Atom):
|
is ovs.db.data.Atom):
|
||||||
value = getattr(row, column)
|
value = getattr(row, column)
|
||||||
if isinstance(value, dict):
|
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=%s " % (column, value)
|
||||||
s = s.strip()
|
s = s.strip()
|
||||||
s = re.sub('""|,|u?\'', "", s)
|
s = re.sub('""|,|u?\'', "", s)
|
||||||
@@ -212,6 +214,14 @@ def print_idl(idl, step):
|
|||||||
print(s)
|
print(s)
|
||||||
n += 1
|
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:
|
if "link1" in idl.tables:
|
||||||
l1 = idl.tables["link1"].rows
|
l1 = idl.tables["link1"].rows
|
||||||
for row in l1.values():
|
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)
|
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):
|
def idl_set(idl, commands, step):
|
||||||
txn = ovs.db.idl.Transaction(idl)
|
txn = ovs.db.idl.Transaction(idl)
|
||||||
increment = False
|
increment = False
|
||||||
@@ -524,6 +539,12 @@ def idl_set(idl, commands, step):
|
|||||||
setattr(new_row3, 'name', 'String3')
|
setattr(new_row3, 'name', 'String3')
|
||||||
new_row3.addvalue('uset', new_row41.uuid)
|
new_row3.addvalue('uset', new_row41.uuid)
|
||||||
assert len(getattr(new_row3, 'uset', [])) == 1
|
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:
|
else:
|
||||||
sys.stderr.write("unknown command %s\n" % name)
|
sys.stderr.write("unknown command %s\n" % name)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|||||||
Reference in New Issue
Block a user