diff --git a/SOURCES/openvswitch-3.2.0.patch b/SOURCES/openvswitch-3.2.0.patch index 8bed4c7..4b81398 100644 --- a/SOURCES/openvswitch-3.2.0.patch +++ b/SOURCES/openvswitch-3.2.0.patch @@ -5869,8 +5869,37 @@ index 82a5087874..84cf2eab57 100644 install-data-local: ovs-install-data-local UNINSTALL_LOCAL += ovs-uninstall-local +diff --git a/python/ovs/db/custom_index.py b/python/ovs/db/custom_index.py +index 587caf5e3e..3fa03d3c95 100644 +--- a/python/ovs/db/custom_index.py ++++ b/python/ovs/db/custom_index.py +@@ -90,14 +90,21 @@ class IndexedRows(DictBase, object): + index = self.indexes[name] = MultiColumnIndex(name) + return index + ++ def __getitem__(self, key): ++ return self.data[key][-1] ++ + def __setitem__(self, key, item): +- self.data[key] = item ++ try: ++ self.data[key].append(item) ++ except KeyError: ++ self.data[key] = [item] + for index in self.indexes.values(): + index.add(item) + + def __delitem__(self, key): +- val = self.data[key] +- del self.data[key] ++ val = self.data[key].pop() ++ if len(self.data[key]) == 0: ++ del self.data[key] + for index in self.indexes.values(): + index.remove(val) + diff --git a/python/ovs/db/idl.py b/python/ovs/db/idl.py -index 9fc2159b04..a80da84e7a 100644 +index 9fc2159b04..52f08e881a 100644 --- a/python/ovs/db/idl.py +++ b/python/ovs/db/idl.py @@ -299,6 +299,7 @@ class Idl(object): @@ -5934,8 +5963,54 @@ index 9fc2159b04..a80da84e7a 100644 def compose_cond_change(self): if not self.cond_changed: return +@@ -980,7 +1013,9 @@ class Idl(object): + if not row: + raise error.Error('Modify non-existing row') + ++ del table.rows[uuid] + old_row = self.__apply_diff(table, row, row_update['modify']) ++ table.rows[uuid] = row + return Notice(ROW_UPDATE, row, Row(self, table, uuid, old_row)) + else: + raise error.Error(' unknown operation', +@@ -1011,9 +1046,10 @@ class Idl(object): + op = ROW_UPDATE + vlog.warn("cannot add existing row %s to table %s" + % (uuid, table.name)) ++ del table.rows[uuid] ++ + changed |= self.__row_update(table, row, new) +- if op == ROW_CREATE: +- table.rows[uuid] = row ++ table.rows[uuid] = row + if changed: + return Notice(ROW_CREATE, row) + else: +@@ -1025,9 +1061,11 @@ class Idl(object): + # XXX rate-limit + vlog.warn("cannot modify missing row %s in table %s" + % (uuid, table.name)) ++ else: ++ del table.rows[uuid] ++ + changed |= self.__row_update(table, row, new) +- if op == ROW_CREATE: +- table.rows[uuid] = row ++ table.rows[uuid] = row + if changed: + return Notice(op, row, Row.from_json(self, table, uuid, old)) + return False +@@ -1821,7 +1859,7 @@ class Transaction(object): + if row._data is None: + op["op"] = "insert" + if row._persist_uuid: +- op["uuid"] = row.uuid ++ op["uuid"] = str(row.uuid) + else: + op["uuid-name"] = _uuid_name_from_uuid(row.uuid) + diff --git a/python/ovs/flow/odp.py b/python/ovs/flow/odp.py -index 88aee17fb2..7d9b165d46 100644 +index 88aee17fb2..a8f8c067a9 100644 --- a/python/ovs/flow/odp.py +++ b/python/ovs/flow/odp.py @@ -204,6 +204,7 @@ class ODPFlow(Flow): @@ -5946,7 +6021,7 @@ index 88aee17fb2..7d9b165d46 100644 "lb_output": decode_int, "trunc": decode_int, "recirc": decode_int, -@@ -334,8 +335,31 @@ class ODPFlow(Flow): +@@ -334,48 +335,60 @@ class ODPFlow(Flow): ) ), **ODPFlow._tnl_action_decoder_args(), @@ -5978,10 +6053,10 @@ index 88aee17fb2..7d9b165d46 100644 _decoders["clone"] = nested_kv_decoder( KVDecoders(decoders=_decoders, default_free=decode_free_output), is_list=True, -@@ -343,20 +367,6 @@ class ODPFlow(Flow): + ) - return { - **_decoders, +- return { +- **_decoders, - "sample": nested_kv_decoder( - KVDecoders( - { @@ -5996,27 +6071,50 @@ index 88aee17fb2..7d9b165d46 100644 - } - ) - ), - "check_pkt_len": nested_kv_decoder( - KVDecoders( - { -@@ -365,13 +375,15 @@ class ODPFlow(Flow): - KVDecoders( - decoders=_decoders, - default_free=decode_free_output, +- "check_pkt_len": nested_kv_decoder( +- KVDecoders( +- { +- "size": decode_int, +- "gt": nested_kv_decoder( +- KVDecoders( +- decoders=_decoders, +- default_free=decode_free_output, - ) -+ ), -+ is_list=True, ++ _decoders["check_pkt_len"] = nested_kv_decoder( ++ KVDecoders( ++ { ++ "size": decode_int, ++ "gt": nested_kv_decoder( ++ KVDecoders( ++ decoders=_decoders, ++ default_free=decode_free_output, ), - "le": nested_kv_decoder( - KVDecoders( - decoders=_decoders, - default_free=decode_free_output, +- "le": nested_kv_decoder( +- KVDecoders( +- decoders=_decoders, +- default_free=decode_free_output, - ) -+ ), -+ is_list=True, ++ is_list=True, ++ ), ++ "le": nested_kv_decoder( ++ KVDecoders( ++ decoders=_decoders, ++ default_free=decode_free_output, ), - } - ) +- } +- ) +- ), ++ is_list=True, ++ ), ++ } ++ ) ++ ) ++ ++ return { ++ **_decoders, + } + + @staticmethod diff --git a/python/ovs/flow/ofp.py b/python/ovs/flow/ofp.py index 20231fd9f3..3d3226c919 100644 --- a/python/ovs/flow/ofp.py @@ -6062,7 +6160,7 @@ index d5127268aa..d9fe27aec6 100644 self.remotes = remotes random.shuffle(self.remotes) diff --git a/python/ovs/tests/test_odp.py b/python/ovs/tests/test_odp.py -index a50d3185cc..f19ec386e8 100644 +index a50d3185cc..d514e9be32 100644 --- a/python/ovs/tests/test_odp.py +++ b/python/ovs/tests/test_odp.py @@ -13,6 +13,32 @@ from ovs.flow.decoders import ( @@ -6126,7 +6224,7 @@ index a50d3185cc..f19ec386e8 100644 @pytest.mark.parametrize( -@@ -512,48 +519,41 @@ def test_odp_fields(input_string, expected): +@@ -512,48 +519,70 @@ def test_odp_fields(input_string, expected): "check_pkt_len", { "size": 200, @@ -6159,6 +6257,35 @@ index a50d3185cc..f19ec386e8 100644 ], ), + ( ++ "actions:check_pkt_len(size=200,gt(check_pkt_len(size=400,gt(4),le(2))),le(check_pkt_len(size=100,gt(1),le(drop))))", # noqa: E501 ++ [ ++ KeyValue( ++ "check_pkt_len", ++ { ++ "size": 200, ++ "gt": [ ++ { ++ "check_pkt_len": { ++ "size": 400, ++ "gt": [{"output": {"port": 4}}], ++ "le": [{"output": {"port": 2}}], ++ } ++ } ++ ], ++ "le": [ ++ { ++ "check_pkt_len": { ++ "size": 100, ++ "gt": [{"output": {"port": 1}}], ++ "le": [{"drop": True}], ++ } ++ } ++ ], ++ }, ++ ) ++ ], ++ ), ++ ( + "actions:meter(1),hash(l4(0))", + [ + KeyValue("meter", 1), @@ -7492,7 +7619,7 @@ index 9fbf5dc897..987e05103d 100644 OVS_START_SHELL_HELPERS diff --git a/tests/ovsdb-idl.at b/tests/ovsdb-idl.at -index df5a9d2fd2..fb568dd823 100644 +index df5a9d2fd2..79e85d7068 100644 --- a/tests/ovsdb-idl.at +++ b/tests/ovsdb-idl.at @@ -29,8 +29,8 @@ m4_define([OVSDB_START_IDLTEST], @@ -7519,7 +7646,93 @@ index df5a9d2fd2..fb568dd823 100644 m4_if([$2], [], [], [--remote=$2]) s$i.db]) done -@@ -1466,6 +1466,56 @@ OVSDB_CHECK_IDL_TRACK([track, simple idl, initially populated, references, singl +@@ -167,8 +167,17 @@ m4_define([OVSDB_CHECK_IDL_REGISTER_COLUMNS_PY], + OVSDB_START_IDLTEST + m4_if([$2], [], [], + [AT_CHECK([ovsdb-client transact unix:socket $2], [0], [ignore], [ignore])]) +- AT_CHECK([$PYTHON3 $srcdir/test-ovsdb.py -t10 idl $srcdir/idltest.ovsschema unix:socket ?simple:b,ba,i,ia,r,ra,s,sa,u,ua?simple3:name,uset,uref?simple4:name?simple6:name,weak_ref?link1:i,k,ka,l2?link2:i,l1?singleton:name $3], +- [0], [stdout], [ignore]) ++ m4_define([REGISTER], m4_joinall([?], [], ++ [simple:b,ba,i,ia,r,ra,s,sa,u,ua], ++ [simple3:name,uset,uref], ++ [simple4:name], ++ [simple6:name,weak_ref], ++ [link1:i,k,ka,l2], ++ [link2:i,l1], ++ [indexed:i], ++ [singleton:name])) ++ AT_CHECK([$PYTHON3 $srcdir/test-ovsdb.py -t10 idl $srcdir/idltest.ovsschema \ ++ unix:socket REGISTER $3], [0], [stdout], [ignore]) + AT_CHECK([sort stdout | uuidfilt]m4_if([$6],,, [[| $6]]), + [0], [$4]) + OVSDB_SERVER_SHUTDOWN +@@ -747,6 +756,31 @@ OVSDB_CHECK_IDL([simple idl, conditional, multiple tables], + 009: done + ]]) + ++OVSDB_CHECK_IDL([indexed idl, modification and removal], ++ [], ++ [['["idltest", ++ {"op": "insert", ++ "table": "indexed", ++ "row": {"i": 123 }}]' \ ++ '["idltest", ++ {"op": "update", ++ "table": "indexed", ++ "where": [["i", "==", 123]], ++ "row": {"i": 456}}]' \ ++ '["idltest", ++ {"op": "delete", ++ "table": "indexed", ++ "where": [["i", "==", 456]]}]']], ++ [[000: empty ++001: {"error":null,"result":[{"uuid":["uuid","<0>"]}]} ++002: table indexed: i=123 uuid=<0> ++003: {"error":null,"result":[{"count":1}]} ++004: table indexed: i=456 uuid=<0> ++005: {"error":null,"result":[{"count":1}]} ++006: empty ++007: done ++]]) ++ + OVSDB_CHECK_IDL([self-linking idl, consistent ops], + [], + [['["idltest", +@@ -1274,6 +1308,33 @@ OVSDB_CHECK_IDL_TRACK([track, simple idl, initially populated], + 003: done + ]]) + ++OVSDB_CHECK_IDL_TRACK([track, indexed idl, modification and removal], ++ [], ++ [['["idltest", ++ {"op": "insert", ++ "table": "indexed", ++ "row": {"i": 123 }}]' \ ++ '["idltest", ++ {"op": "update", ++ "table": "indexed", ++ "where": [["i", "==", 123]], ++ "row": {"i": 456}}]' \ ++ '["idltest", ++ {"op": "delete", ++ "table": "indexed", ++ "where": [["i", "==", 456]]}]']], ++ [[000: empty ++001: {"error":null,"result":[{"uuid":["uuid","<0>"]}]} ++002: table indexed: inserted row: i=123 uuid=<0> ++002: table indexed: updated columns: i ++003: {"error":null,"result":[{"count":1}]} ++004: table indexed: i=456 uuid=<0> ++004: table indexed: updated columns: i ++005: {"error":null,"result":[{"count":1}]} ++006: empty ++007: done ++]]) ++ + dnl This test creates database with weak references and checks that orphan + dnl rows created for weak references are not available for iteration via + dnl list of tracked changes. +@@ -1466,6 +1527,56 @@ OVSDB_CHECK_IDL_TRACK([track, simple idl, initially populated, references, singl 006: done ]]) @@ -7576,7 +7789,44 @@ index df5a9d2fd2..fb568dd823 100644 dnl This test checks that deleting both the destination and source of the dnl reference doesn't remove the reference in the source tracked record. OVSDB_CHECK_IDL_TRACK([track, simple idl, initially populated, weak references, multiple deletes], -@@ -2332,6 +2382,23 @@ CHECK_STREAM_OPEN_BLOCK([Python3], [$PYTHON3 $srcdir/test-stream.py], +@@ -1972,6 +2083,36 @@ OVSDB_CHECK_IDL_NOTIFY([simple idl verify notify], + 015: done + ]]) + ++OVSDB_CHECK_IDL_NOTIFY([indexed idl, modification and removal notify], ++ [['track-notify' \ ++ '["idltest", ++ {"op": "insert", ++ "table": "indexed", ++ "row": {"i": 123 }}]' \ ++ '["idltest", ++ {"op": "update", ++ "table": "indexed", ++ "where": [["i", "==", 123]], ++ "row": {"i": 456}}]' \ ++ '["idltest", ++ {"op": "delete", ++ "table": "indexed", ++ "where": [["i", "==", 456]]}]']], ++ [[000: empty ++000: event:create, row={}, uuid=<0>, updates=None ++000: event:create, row={}, uuid=<1>, updates=None ++001: {"error":null,"result":[{"uuid":["uuid","<2>"]}]} ++002: event:create, row={i=123}, uuid=<2>, updates=None ++002: table indexed: i=123 uuid=<2> ++003: {"error":null,"result":[{"count":1}]} ++004: event:update, row={i=456}, uuid=<2>, updates={i=123} ++004: table indexed: i=456 uuid=<2> ++005: {"error":null,"result":[{"count":1}]} ++006: empty ++006: event:delete, row={i=456}, uuid=<2>, updates=None ++007: done ++]]) ++ + # Tests to verify the functionality of the one column compound index. + # It tests index for one column string and integer indexes. + # The run of test-ovsdb generates the output of the display of data using the different indexes defined in +@@ -2332,6 +2473,23 @@ CHECK_STREAM_OPEN_BLOCK([Python3], [$PYTHON3 $srcdir/test-stream.py], CHECK_STREAM_OPEN_BLOCK([Python3], [$PYTHON3 $srcdir/test-stream.py], [ssl6], [[[::1]]]) @@ -7600,7 +7850,7 @@ index df5a9d2fd2..fb568dd823 100644 # same as OVSDB_CHECK_IDL but uses Python IDL implementation with tcp # with multiple remotes to assert the idl connects to the leader of the Raft cluster m4_define([OVSDB_CHECK_IDL_LEADER_ONLY_PY], -@@ -2347,10 +2414,11 @@ m4_define([OVSDB_CHECK_IDL_LEADER_ONLY_PY], +@@ -2347,10 +2505,11 @@ m4_define([OVSDB_CHECK_IDL_LEADER_ONLY_PY], pids=$(cat s2.pid s3.pid s1.pid | tr '\n' ',') echo $pids AT_CHECK([$PYTHON3 $srcdir/test-ovsdb.py -t30 idl-cluster $srcdir/idltest.ovsschema $remotes $pids $3], @@ -7613,7 +7863,7 @@ index df5a9d2fd2..fb568dd823 100644 AT_CLEANUP]) OVSDB_CHECK_IDL_LEADER_ONLY_PY([Check Python IDL connects to leader], 3, ['remote']) -@@ -2393,6 +2461,7 @@ m4_define([OVSDB_CHECK_CLUSTER_IDL_C], +@@ -2393,6 +2552,7 @@ m4_define([OVSDB_CHECK_CLUSTER_IDL_C], AT_CHECK([sort stdout | uuidfilt]m4_if([$7],,, [[| $7]]), [0], [$5]) m4_ifval([$8], [AT_CHECK([grep '$8' stderr], [1])], [], []) @@ -7621,7 +7871,7 @@ index df5a9d2fd2..fb568dd823 100644 AT_CLEANUP]) # Same as OVSDB_CHECK_CLUSTER_IDL_C but uses the Python IDL implementation. -@@ -2413,6 +2482,7 @@ m4_define([OVSDB_CHECK_CLUSTER_IDL_PY], +@@ -2413,6 +2573,7 @@ m4_define([OVSDB_CHECK_CLUSTER_IDL_PY], AT_CHECK([sort stdout | uuidfilt]m4_if([$7],,, [[| $7]]), [0], [$5]) m4_if([$8], [AT_CHECK([grep '$8' stderr], [1])], [], []) @@ -7629,7 +7879,7 @@ index df5a9d2fd2..fb568dd823 100644 AT_CLEANUP]) m4_define([OVSDB_CHECK_CLUSTER_IDL], -@@ -2686,3 +2756,93 @@ OVSDB_CHECK_IDL_PERS_UUID_INSERT([simple idl, persistent uuid insert], +@@ -2686,3 +2847,93 @@ OVSDB_CHECK_IDL_PERS_UUID_INSERT([simple idl, persistent uuid insert], 011: done ]], [['This UUID would duplicate a UUID already present within the table or deleted within the same transaction']]) @@ -10667,10 +10917,95 @@ index a38bf9e6df..86a223caff 100644 for (i = 0; i < n_threads; i++) { printf(" %6" PRIu64, thread_working_ms[i]); diff --git a/tests/test-ovsdb.c b/tests/test-ovsdb.c -index c761822e62..d6a47de336 100644 +index c761822e62..e6d83e12da 100644 --- a/tests/test-ovsdb.c +++ b/tests/test-ovsdb.c -@@ -2800,6 +2800,13 @@ do_idl(struct ovs_cmdl_context *ctx) +@@ -2023,6 +2023,24 @@ print_idl_row_updated_link2(const struct idltest_link2 *l2, int step) + } + } + ++static void ++print_idl_row_updated_indexed(const struct idltest_indexed *ind, int step) ++{ ++ struct ds updates = DS_EMPTY_INITIALIZER; ++ ++ for (size_t i = 0; i < IDLTEST_INDEXED_N_COLUMNS; i++) { ++ if (idltest_indexed_is_updated(ind, i)) { ++ ds_put_format(&updates, " %s", idltest_indexed_columns[i].name); ++ } ++ } ++ if (updates.length) { ++ print_and_log("%03d: table %s: updated columns:%s", ++ step, ind->header_.table->class_->name, ++ ds_cstr(&updates)); ++ ds_destroy(&updates); ++ } ++} ++ + static void + print_idl_row_updated_simple3(const struct idltest_simple3 *s3, int step) + { +@@ -2172,6 +2190,21 @@ print_idl_row_link2(const struct idltest_link2 *l2, int step, bool terse) + print_idl_row_updated_link2(l2, step); + } + ++static void ++print_idl_row_indexed(const struct idltest_indexed *ind, int step, bool terse) ++{ ++ struct ds msg = DS_EMPTY_INITIALIZER; ++ ++ ds_put_format(&msg, "i=%"PRId64, ind->i); ++ ++ char *row_msg = format_idl_row(&ind->header_, step, ds_cstr(&msg), terse); ++ print_and_log("%s", row_msg); ++ ds_destroy(&msg); ++ free(row_msg); ++ ++ print_idl_row_updated_indexed(ind, step); ++} ++ + static void + print_idl_row_simple3(const struct idltest_simple3 *s3, int step, bool terse) + { +@@ -2252,6 +2285,7 @@ print_idl_row_singleton(const struct idltest_singleton *sng, int step, + static void + print_idl(struct ovsdb_idl *idl, int step, bool terse) + { ++ const struct idltest_indexed *ind; + const struct idltest_simple3 *s3; + const struct idltest_simple4 *s4; + const struct idltest_simple6 *s6; +@@ -2285,6 +2319,10 @@ print_idl(struct ovsdb_idl *idl, int step, bool terse) + print_idl_row_simple6(s6, step, terse); + n++; + } ++ IDLTEST_INDEXED_FOR_EACH (ind, idl) { ++ print_idl_row_indexed(ind, step, terse); ++ n++; ++ } + IDLTEST_SINGLETON_FOR_EACH (sng, idl) { + print_idl_row_singleton(sng, step, terse); + n++; +@@ -2297,6 +2335,7 @@ print_idl(struct ovsdb_idl *idl, int step, bool terse) + static void + print_idl_track(struct ovsdb_idl *idl, int step, bool terse) + { ++ const struct idltest_indexed *ind; + const struct idltest_simple3 *s3; + const struct idltest_simple4 *s4; + const struct idltest_simple6 *s6; +@@ -2329,6 +2368,10 @@ print_idl_track(struct ovsdb_idl *idl, int step, bool terse) + print_idl_row_simple6(s6, step, terse); + n++; + } ++ IDLTEST_INDEXED_FOR_EACH (ind, idl) { ++ print_idl_row_indexed(ind, step, terse); ++ n++; ++ } + + if (!n) { + print_and_log("%03d: empty", step); +@@ -2800,6 +2843,13 @@ do_idl(struct ovs_cmdl_context *ctx) } else { print_idl(idl, step++, terse); } @@ -10685,7 +11020,7 @@ index c761822e62..d6a47de336 100644 seqno = ovsdb_idl_get_seqno(idl); diff --git a/tests/test-ovsdb.py b/tests/test-ovsdb.py -index a841adba4e..48f8ee2d70 100644 +index a841adba4e..67a45f044b 100644 --- a/tests/test-ovsdb.py +++ b/tests/test-ovsdb.py @@ -37,7 +37,7 @@ vlog.init(None) @@ -10697,7 +11032,33 @@ index a841adba4e..48f8ee2d70 100644 return json[0] else: return json -@@ -325,9 +325,9 @@ def substitute_uuids(json, symtab): +@@ -228,6 +228,10 @@ def get_link2_table_printable_row(row): + return s + + ++def get_indexed_table_printable_row(row): ++ return "i=%s" % row.i ++ ++ + def get_singleton_table_printable_row(row): + return "name=%s" % row.name + +@@ -307,6 +311,14 @@ def print_idl(idl, step, terse=False): + terse) + n += 1 + ++ if "indexed" in idl.tables: ++ ind = idl.tables["indexed"].rows ++ for row in ind.values(): ++ print_row("indexed", row, step, ++ get_indexed_table_printable_row(row), ++ terse) ++ n += 1 ++ + if "singleton" in idl.tables: + sng = idl.tables["singleton"].rows + for row in sng.values(): +@@ -325,9 +337,9 @@ def substitute_uuids(json, symtab): symbol = symtab.get(json) if symbol: return str(symbol) @@ -10709,7 +11070,7 @@ index a841adba4e..48f8ee2d70 100644 d = {} for key, value in json.items(): d[key] = substitute_uuids(value, symtab) -@@ -341,10 +341,10 @@ def parse_uuids(json, symtab): +@@ -341,10 +353,10 @@ def parse_uuids(json, symtab): name = "#%d#" % len(symtab) sys.stderr.write("%s = %s\n" % (name, json)) symtab[name] = json @@ -10722,7 +11083,26 @@ index a841adba4e..48f8ee2d70 100644 for value in json.values(): parse_uuids(value, symtab) -@@ -757,16 +757,23 @@ def do_idl(schema_file, remote, *commands): +@@ -434,7 +446,7 @@ def idl_set(idl, commands, step): + sys.stderr.write('"set" command requires 2 argument\n') + sys.exit(1) + +- s = txn.insert(idl.tables["simple"], new_uuid=args[0], ++ s = txn.insert(idl.tables["simple"], new_uuid=uuid.UUID(args[0]), + persist_uuid=True) + s.i = int(args[1]) + elif name == "delete": +@@ -690,6 +702,9 @@ def do_idl(schema_file, remote, *commands): + idl = ovs.db.idl.Idl(remote, schema_helper, leader_only=False) + if "simple3" in idl.tables: + idl.index_create("simple3", "simple3_by_name") ++ if "indexed" in idl.tables: ++ idx = idl.index_create("indexed", "indexed_by_i") ++ idx.add_column("i") + + if commands: + remotes = remote.split(',') +@@ -757,16 +772,23 @@ def do_idl(schema_file, remote, *commands): poller.block() else: # Wait for update. @@ -10754,7 +11134,7 @@ index a841adba4e..48f8ee2d70 100644 seqno = idl.change_seqno -@@ -1049,14 +1056,14 @@ def main(argv): +@@ -1049,14 +1071,14 @@ def main(argv): sys.exit(1) func, n_args = commands[command_name] diff --git a/SPECS/openvswitch3.2.spec b/SPECS/openvswitch3.2.spec index b6b7b9d..8474372 100644 --- a/SPECS/openvswitch3.2.spec +++ b/SPECS/openvswitch3.2.spec @@ -57,7 +57,7 @@ Summary: Open vSwitch Group: System Environment/Daemons daemon/database/utilities URL: http://www.openvswitch.org/ Version: 3.2.0 -Release: 85%{?dist} +Release: 86%{?dist} # Nearly all of openvswitch is ASL 2.0. The bugtool is LGPLv2+, and the # lib/sflow*.[ch] files are SISSL @@ -761,6 +761,15 @@ exit 0 %endif %changelog +* Fri Jun 07 2024 Open vSwitch CI - 3.2.0-86 +- Merging upstream branch-3.2 [RH git: 2459af6f98] + Commit list: + fcc1137449 python: ovs: flow: Fix nested check_pkt_len acts. + b612222c4f python: idl: Fix index not being updated on row modification. + 8b0bbd5119 python: ovsdb-idl: Convert new_uuid insert() arg to UUID. + 585a876798 python: ovsdb-idl: Make IndexedRows mirror hmap. + + * Wed Jun 05 2024 Open vSwitch CI - 3.2.0-85 - Merging upstream branch-3.2 [RH git: 96ddb6c5de] Commit list: