summaryrefslogtreecommitdiff
path: root/python/ovs/db
Commit message (Collapse)AuthorAgeFilesLines
* ovsdb-cs: Consider default conditions implicitly acked.Dumitru Ceara2022-12-131-2/+2
| | | | | | | | | | | | | | | | | When initializing a monitor table the default monitor condition is [True] which matches the behavior of the server (to send all rows of that table). There's no need to include this default condition in the initial monitor request so we can consider it implicitly acked by the server. This fixes the incorrect (one too large) expected condition sequence number reported by ovsdb_idl_set_condition() when application is trying to set a [True] condition for a new table. Reported-by: Numan Siddique <numans@ovn.org> Suggested-by: Ilya Maximets <i.maximets@ovn.org> Signed-off-by: Dumitru Ceara <dceara@redhat.com> Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
* ovsdb-idl: Add the support to specify the uuid for row insert.Numan Siddique2022-11-301-8/+18
| | | | | | | | | | | | | | | | | | | | | | | | ovsdb-server allows the OVSDB clients to specify the uuid for the row inserts [1]. Both the C IDL client library and Python IDL are missing this feature. This patch adds this support. In C IDL, for each schema table, a new function is generated - <schema_table>insert_persistent_uuid(txn, uuid) which can be used the clients to persist the uuid. ovs-vsctl and other derivatives of ctl now supports the same in the generic 'create' command with the option "--id=<UUID>". In Python IDL, the uuid to persist can be specified in the Transaction.insert() function. [1] - a529e3cd1f("ovsdb-server: Allow OVSDB clients to specify the UUID for inserted rows.:) Acked-by: Adrian Moreno <amorenoz@redhat.com> Acked-by: Han Zhou <hzhou@ovn.org> Acked-by: Terry Wilson <twilson@redhat.com> Signed-off-by: Numan Siddique <numans@ovn.org> Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
* python: idl: Fix idl.Row.__str__ method.Christopher Aubut2022-09-191-1/+2
| | | | | | | | | | | | | Fixes idl.Row's __str__ method to only print if the column exists on the object. The Row object passed to the 'updates' argument of Idl.notify only contains a subset of columns. Printing that argument causes an AttributeError. Fixes: 6a1c98461b46 ("Add a __str__ method to idl.Row") Submitted-at: https://github.com/openvswitch/ovs/pull/392 Acked-by: Terry Wilson <twilson@redhat.com> Signed-off-by: Christopher Aubut <christopher@aubut.me> Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
* python: Fix E275 missing whitespace after keyword.Ilya Maximets2022-08-041-2/+2
| | | | | | | | | | | | | | | | | | | | With just released flake8 5.0 we're getting a bunch of E275 errors: utilities/bugtool/ovs-bugtool.in:959:23: E275 missing whitespace after keyword tests/test-ovsdb.py:623:11: E275 missing whitespace after keyword python/setup.py:105:8: E275 missing whitespace after keyword python/setup.py:106:8: E275 missing whitespace after keyword python/ovs/db/idl.py:145:15: E275 missing whitespace after keyword python/ovs/db/idl.py:167:15: E275 missing whitespace after keyword make[2]: *** [flake8-check] Error 1 This breaks CI on branches below 2.16. We don't see a problem right now on newer branches because we're installing extra dependencies that backtrack flake8 down to 4.1 or even 3.9. Acked-by: Mike Pattrick <mkp@redhat.com> Acked-by: Dumitru Ceara <dceara@redhat.com> Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
* python: idl: Raise AttributeError from uuid_to_row.Terry Wilson2022-05-021-1/+6
| | | | | | | | | | | | | | | Prior to 4e3966e64, when calling _uuid_to_row, it would raise an AttributeError when trying to access base.ref_table.rows if the referenced table was not registered. When called from Row.__getattr__(), this would appropriately raise an AttributeError. After 4e3966e64, a KeyError would be raised, which is not expected from a getattr() or hasattr() call, which could break existing code. Fixes: 4e3966e64bed ("python: Politely handle misuse of table.condition.") Signed-off-by: Terry Wilson <twilson@redhat.com> Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
* python: Politely handle misuse of table.condition.Terry Wilson2022-04-271-35/+67
| | | | | | | | | | | | | | | | | | | | | | | | | | | | Before 46d44cf3b, it was technically possible to assign a monitor condition directly to Idl.tables[table_name].condition. If done before the connection was established, it would successfully apply the condition (where cond_change() actually would fail). Although this wasn't meant to be supported, several OpenStack projects made use of this. After 46d44cf3b, .condition is no longer a list, but a ConditionState. Assigning a list to it breaks the Idl. The Neutron and ovsdbapp projects have patches in-flight to use Idl.cond_change() if ConditionState exists, as it now works before connection as well, but here could be other users that also start failing when upgrading to OVS 2.17. Instead of directly adding attributes to TableSchema, this adds the IdlTable/IdlColumn objects which hold Idl-specific data and adds a 'condition' property to TableSchema that maintains the old interface. Fixes: 46d44cf3be0d ("python: idl: Add monitor_cond_since support.") Signed-off-by: Terry Wilson <twilson@redhat.com> Acked-by: Dumitru Ceara <dceara@redhat.com> Acked-By: Timothy Redaelli <tredaelli@redhat.com> Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
* python: idl: Set cond_changed to true if condition change requested.Wentao Jia2022-04-041-1/+1
| | | | | | | | | | | cond_changed set to true if _req_cond (requested condition change) is not none. This can avoid falling into an endless poll loop, because cond_changed is true will trigger immediate_wake(). Fixes: 46d44cf3be0d ("python: idl: Add monitor_cond_since support.") Signed-off-by: Wentao Jia <wentao.jia@easystack.cn> Acked-by: Dumitru Ceara <dceara@redhat.com> Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
* python: idl: Set cond_changed to false if last id is zero.Wentao Jia2022-04-041-0/+3
| | | | | | | | | | After reconnection, cond_changed will be set to true, poll will be called and never block causing cpu high load forever. Fixes: 46d44cf3be0d ("python: idl: Add monitor_cond_since support.") Acked-by: Dumitru Ceara <dceara@redhat.com> Signed-off-by: Wentao Jia <wentao.jia@easystack.cn> Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
* python: idl: Clear last_id on reconnect if condition changes in-flight.Dumitru Ceara2022-01-311-1/+17
| | | | | | | | | | | | | | | | | | | | When reconnecting, if there are condition changes already sent to the server but not yet acked, reset the db's 'last-id', esentially clearing the local cache after reconnect. This is needed because the client cannot easily differentiate between the following cases: a. either the server already processed the requested monitor condition change but the FSM was restarted before the client was notified. In this case the client should clear its local cache because it's out of sync with the monitor view on the server side. b. OR the server hasn't processed the requested monitor condition change yet. Fixes: 46d44cf3be0d ("python: idl: Add monitor_cond_since support.") Signed-off-by: Dumitru Ceara <dceara@redhat.com> Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
* python: idl: Resend requested but not acked conditions when reconnecting.Dumitru Ceara2022-01-311-2/+4
| | | | | | | | | | | | When reconnecting forget about in-flight monitor condition changes if the user requested a newer condition already. This matches the C implementation, in ovsdb_cs_db_sync_condition(). Fixes: 46d44cf3be0d ("python: idl: Add monitor_cond_since support.") Signed-off-by: Dumitru Ceara <dceara@redhat.com> Acked-By: Terry Wilson <twilson@redhat.com> Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
* python: idl: Add monitor_cond_since support.Terry Wilson2022-01-061-35/+210
| | | | | | | | | | Add support for monitor_cond_since / update3 to python-ovs to allow more efficient reconnections when connecting to clustered OVSDB servers. Signed-off-by: Terry Wilson <twilson@redhat.com> Acked-by: Dumitru Ceara <dceara@redhat.com> Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
* ovsdb-data: Consolidate ovsdb atom and json strings.Ilya Maximets2021-11-301-4/+6
| | | | | | | | | | | | | | ovsdb_atom_string and json_string are basically the same data structure and ovsdb-server frequently needs to convert one to another. We can avoid that by using json_string from the beginning for all ovsdb strings. So, the conversion turns into simple json_clone(), i.e. increment of a reference counter. This change gives a moderate performance boost in some scenarios, improves the code clarity and may be useful for future development. Acked-by: Mike Pattrick <mkp@redhat.com> Acked-by: Dumitru Ceara <dceara@redhat.com> Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
* python: idl: Avoid pre-allocating column defaults.Terry Wilson2021-11-301-6/+33
| | | | | | | | | | | | | | | | | | | | | Many python implementations pre-allocate space for multiple objects in empty dicts and lists. Using a custom dict-like object that only generates these objects when they are accessed can save memory. On a fairly pathological case where the DB has 1000 networks each with 100 ports, with only 'name' fields set, this saves around 300MB of memory. One could argue that if values are not going to change from their defaults, then users should not be monitoring those columns, but it's also probably good to not waste memory even if user code is sub-optimal. Signed-off-by: Terry Wilson <twilson@redhat.com> Acked-by: Dumitru Ceara <dceara@redhat.com> Acked-by: Flavio Fernandes <flavio@flaviof.com> Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
* python: db: Avoid allocation of an attr dict/row+column.Terry Wilson2021-11-091-0/+4
| | | | | | | | | | | | | | | | | Python objects normally have a dictionary named __dict__ allocated for handling dynamically assigned attributes. Depending on architecture and Python version, that empty dict may be between 64 and 280 bytes. Seeing as Atom and Datum objects do not need dynamic attribute support and there can be millions of rows in a database, avoiding this allocation with __slots__ can save 100s of MBs of memory per Idl process. Signed-off-by: Terry Wilson <twilson@redhat.com> Acked-by: Timothy Redaelli <tredaelli@redhat.com> Tested-by: Timothy Redaelli <tredaelli@redhat.com> Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
* python: idl: Avoid sending transactions when the DB is not synced up.Terry Wilson2021-10-121-0/+5
| | | | | | | | | | | | | | This ports the C IDL change f50714b to the Python IDL: Until now the code here would happily try to send transactions to the database server even if the database connection was not in the correct state. In some cases this could lead to strange behavior, such as sending a database transaction for a database that the IDL had just learned did not exist on the server. Signed-off-by: Terry Wilson <twilson@redhat.com> Acked-by: Dumitru Ceara <dceara@redhat.com> Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
* ovsdb-data: Deduplicate string atoms.Ilya Maximets2021-09-242-21/+45
| | | | | | | | | | | | | | | | | | | | | | | | | ovsdb-server spends a lot of time cloning atoms for various reasons, e.g. to create a diff of two rows or to clone a row to the transaction. All atoms, except for strings, contains a simple value that could be copied in efficient way, but duplicating strings every time has a significant performance impact. Introducing a new reference-counted structure 'ovsdb_atom_string' that allows to not copy strings every time, but just increase a reference counter. This change allows to increase transaction throughput in benchmarks up to 2x for standalone databases and 3x for clustered databases, i.e. number of transactions that ovsdb-server can handle per second. It also noticeably reduces memory consumption of ovsdb-server. Next step will be to consolidate this structure with json strings, so we will not need to duplicate strings while converting database objects to json and back. Signed-off-by: Ilya Maximets <i.maximets@ovn.org> Acked-by: Dumitru Ceara <dceara@redhat.com> Acked-by: Mark D. Gray <mark.d.gray@redhat.com>
* ovsdb-cs: Perform forced reconnects without a backoff.Dumitru Ceara2021-07-231-0/+11
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The ovsdb-cs layer triggers a forced reconnect in various cases: - when an inconsistency is detected in the data received from the remote server. - when the remote server is running in clustered mode and transitioned to "follower", if the client is configured in "leader-only" mode. - when explicitly requested by upper layers (e.g., by the user application, through the IDL layer). In such cases it's desirable that reconnection should happen as fast as possible, without the current exponential backoff maintained by the underlying reconnect object. Furthermore, since 3c2d6274bcee ("raft: Transfer leadership before creating snapshots."), leadership changes inside the clustered database happen more often and, therefore, "leader-only" clients need to reconnect more often too. Forced reconnects call jsonrpc_session_force_reconnect() which will not reset backoff. To make sure clients reconnect as fast as possible in the aforementioned scenarios we first call the new API, jsonrpc_session_reset_backoff(), in ovsdb-cs, for sessions that are in state CS_S_MONITORING (i.e., the remote is likely still alive and functioning fine). jsonrpc_session_reset_backoff() resets the number of backoff-free reconnect retries to the number of remotes configured for the session, ensuring that all remotes are retried exactly once with backoff 0. This commit also updates the Python IDL and jsonrpc implementations. The Python IDL wasn't tracking the IDL_S_MONITORING state explicitly, we now do that too. Tests were also added to make sure the IDL forced reconnects happen without backoff. Reported-at: https://bugzilla.redhat.com/1977264 Suggested-by: Ilya Maximets <i.maximets@ovn.org> Signed-off-by: Dumitru Ceara <dceara@redhat.com> Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
* python: Add cooperative_yield() API method to Idl.Terry Wilson2021-07-161-0/+11
| | | | | | | | | | | | When using eventlet monkey_patch()'d code, greenthreads can be blocked on connection for several seconds while the database contents are parsed. Eventlet recommends adding a sleep(0) call to cooperatively yield in cpu-bound code. asyncio code has asyncio.sleep(0). This patch adds an API method that defaults to doing nothing, but can be overridden to yield as needed. Signed-off-by: Terry Wilson <twilson@redhat.com> Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
* ovsdb: Make clients aware of relay service model.Ilya Maximets2021-07-151-0/+16
| | | | | | | | | | | Clients needs to re-connect from the relay that has no connection with the database source. Also, relay acts similarly to the follower from a clustered model from the consistency point of view, so it's not suitable for leader-only connections. Acked-by: Mark D. Gray <mark.d.gray@redhat.com> Acked-by: Dumitru Ceara <dceara@redhat.com> Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
* python: Fix Idl.run change_seqno update.Bodo Petermann2021-07-071-5/+6
| | | | | | | | | | | | | | | | | Fix an issue where Idl.run() returned False even if there was a change. If Idl.run() reads multiple messages from the database server, some may constitute changes and some may not. Changed the way change_seqno is reset: if a message is not a change, reset change_seqno only to the value before reading this message, not to the value before reading the first message. This will fix the return value in a scenario where some message was a change and the last one wasn't. The new change_seqno will now be the value after handling the message with the last change. Fixes: c39751e44539 ("python: Monitor Database table to manage lifecycle of IDL client.") Signed-off-by: Bodo Petermann <b.petermann@syseleven.de> Acked-by: Alin Gabriel Serdean <aserdean@ovn.org> Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
* python: idl: Allow retry even when using a single remote.Ilya Maximets2021-06-111-2/+1
| | | | | | | | | | | | As described in commit [1], it's possible that remote IP is backed by a load-balancer and re-connection to this same IP will lead to connection to a different server. This case is supported for C version of IDL and should be supported in a same way for python implementation. [1] ca367fa5f8bb ("ovsdb-idl.c: Allows retry even when using a single remote.") Signed-off-by: Ilya Maximets <i.maximets@ovn.org> Acked-by: Dumitru Ceara <dceara@redhat.com>
* python: Send notifications after the transaction ends.Terry Wilson2021-03-151-15/+24
| | | | | | | | | | | | | | | | | | | | | | | | | The Python IDL notification mechanism was sending a notification for each processed update in a transaction as it was processed. This causes issues with multi-row changes that contain references to each other. For example, if a Logical_Router_Port is created along with a Gateway_Chassis, and the LRP.gateway_chassis set to that GC, then when the notify() passes the CREATE event for the LRP, the GC will not yet have been processed, so __getattr__ when _uuid_to_row fails to find the GC, will return the default value for LRP.gateway_chassis which is []. This patch has the process_update methods return the notifications that would be produced when a row changes, so they can be queued and sent after all rows have been processed. Fixes: d7d417fcddf9 ("Allow subclasses of Idl to define a notification hook") Signed-off-by: Terry Wilson <twilson@redhat.com> Acked-by: Brian Haley <haleyb.dev@gmail.com> Acked-by: Dumitru Ceara <dceara@redhat.com> Tested-by: Flavio Fernandes <flavio@flaviof.com> Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
* python: Fix plural forms of OVSDB types.Ben Pfaff2020-07-071-1/+10
| | | | | | | | | | | | Fixes two problems. First, the plural of chassis is also chassis. Second, for linguistic analysis we need to consider plain words, not words that have (e.g.) \fB and \fR pasted into them for nroff output. This makes the OVN manpage for ovn-sb(5) talk about "set of Chassis" not "set of Chassiss". Acked-by: Numan Siddique <numans@ovn.org> Signed-off-by: Ben Pfaff <blp@ovn.org>
* Handle refTable values with setkey()Terry Wilson2020-03-201-2/+1
| | | | | | | | | | | | 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>
* Remove dependency on python3-sixTimothy Redaelli2019-12-205-86/+75
| | | | | | | | | | | Since Python 2 support was removed in 1ca0323e7c29 ("Require Python 3 and remove support for Python 2."), python3-six is not needed anymore. Moreover python3-six is not available on RHEL/CentOS7 without using EPEL and so this patch is needed in order to release OVS 2.13 on RHEL7. Signed-off-by: Timothy Redaelli <tredaelli@redhat.com> Signed-off-by: Ben Pfaff <blp@ovn.org>
* Add a __str__ method to idl.RowTerry Wilson2019-09-251-0/+6
| | | | | | | | | | It's sometimes handy to log an entire Row object, so this just adds a string representation of the object as: Tablename(col1=val1, col2=val2, ..., coln=valn) Signed-off-by: Terry Wilson <twilson@redhat.com> Signed-off-by: Ben Pfaff <blp@ovn.org>
* python: Monitor Database table to manage lifecycle of IDL client.Ted Elhourani2019-03-221-15/+204
| | | | | | | | | | | | | | | | | | | | | | | | The Python IDL implementation supports ovsdb cluster connections. This patch is a follow up to commit 31e434fc98, it adds the option of connecting to the leader (the default) in the Raft-based cluster. It mimics the exisiting C IDL support for clusters introduced in commit 1b1d2e6daa. The _Server database schema is first requested, then a monitor of the Database table in the _Server Database. Method __check_server_db verifies the eligibility of the server. If the attempt to obtain a monitor of the _Server database fails and a cluster id was not provided this implementation proceeds to request the data monitor. If a cluster id was provided via the set_cluster_id method then the connection is aborted and a connection to a different node is instead attempted, until a valid cluster node is found. Thus, when supplied, cluster id is interpreted as the intention to only allow connections to a clustered database. If not supplied, connections to standalone nodes, or nodes that do not have the _Server database are allowed. change_seqno is not incremented in the case of Database table updates. Acked-by: Numan Siddique <nusiddiq@redhat.com> Signed-off-by: Ted Elhourani <ted.elhourani@nutanix.com> Signed-off-by: Ben Pfaff <blp@ovn.org>
* python: Fix E117 over-indented.Ilya Maximets2019-02-121-1/+1
| | | | | | | | | | | | | | | | New check was added to recent pycodestyle-2.5.0 and flake8 complains while building on Travis: ../utilities/bugtool/ovs-bugtool.in:767:17: E117 over-indented ../utilities/bugtool/ovs-bugtool.in:771:17: E117 over-indented ../utilities/bugtool/ovs-bugtool.in:774:17: E117 over-indented ../utilities/bugtool/ovs-bugtool.in:778:17: E117 over-indented ../python/ovs/db/error.py:33:17: E117 over-indented ../python/ovs/poller.py:118:21: E117 over-indented ../python/ovs/reconnect.py:244:17: E117 over-indented Signed-off-by: Ilya Maximets <i.maximets@samsung.com> Signed-off-by: Ben Pfaff <blp@ovn.org>
* python: Fix invalid escape sequences.Ben Pfaff2019-01-111-1/+1
| | | | | | | | | | It appears that Python silently treats invalid escape sequences in strings as literals, e.g. "\." is the same as "\\.". Newer versions of checkpatch complain, and it does seem reasonable to me to fix these. Acked-by: Numan Siddique <nusiddiq@redhat.com> Tested-by: Numan Siddique <nusiddiq@redhat.com> Signed-off-by: Ben Pfaff <blp@ovn.org>
* Python: Make Row's __getattr__ less error proneLucas Alvares Gomes2018-10-051-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Calling getattr() on a Row object after invoking delkey() with a value that does not exist in the object will cause getattr() to fail with a KeyError error. For example: Oct 05 14:59:28 neutron-server[28435]: File "/usr/local/lib/python2.7/dist-packages/ovsdbapp/backend/ovs_idl/connection.py", line 122, in run Oct 05 14:59:28 neutron-server[28435]: txn.results.put(txn.do_commit()) Oct 05 14:59:28 neutron-server[28435]: File "/usr/local/lib/python2.7/dist-packages/ovsdbapp/backend/ovs_idl/transaction.py", line 86, in do_commit Oct 05 14:59:28 neutron-server[28435]: command.run_idl(txn) Oct 05 14:59:28 neutron-server[28435]: File "/usr/local/lib/python2.7/dist-packages/ovsdbapp/backend/ovs_idl/command.py", line 299, in run_idl Oct 05 14:59:28 neutron-server[28435]: if isinstance(getattr(record, self.column), dict): Oct 05 14:59:28 neutron-server[28435]: File "/usr/local/lib/python2.7/dist-packages/ovs/db/idl.py", line 843, in __getattr__ Oct 05 14:59:28 neutron-server[28435]: del dmap[key] Oct 05 14:59:28 neutron-server[28435]: KeyError: 'bogusvalue' This patch is replacing the "del dmap[key]" instruction with a "dmap.pop(key, None)" instruction instead because a pop() (with a default value) will not raise an exception in case the key does not exist in the object in the first place, it will just ignore it. Signed-off-by: Lucas Alvares Gomes <lucasagomes@gmail.com> Signed-off-by: Ben Pfaff <blp@ovn.org>
* python jsonrpc: Allow jsonrpc_session to have more than one remote.Numan Siddique2018-08-141-1/+18
| | | | | | | | | | | | | | Python IDL implementation doesn't have the support to connect to the cluster dbs. This patch adds this support. We are still missing the support in python idl class to connect to the cluster master. That support will be added in an upcoming patch. This patch is similar to the commit 8cf6bbb184 which added multiple remote support in the C jsonrpc implementation. Acked-by: Mark Michelson <mmichels@redhat.com> Signed-off-by: Numan Siddique <nusiddiq@redhat.com> Signed-off-by: Ben Pfaff <blp@ovn.org>
* python: Update docstring in ovs.db.idl.Idl class.Toms Atteka2018-06-051-11/+12
| | | | | | | | | Adjusted docstring and variable names according to previous code changes; Fixed grammar "a attribute" > "an attribute". Fixes: bf42f674 (idl: Convert python daemons to utilize SchemaHelper) Signed-off-by: Toms Atteka <cpp.code.lv@gmail.com> Signed-off-by: Ben Pfaff <blp@ovn.org>
* Embrace anonymous unions.Ben Pfaff2018-05-251-4/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Several OVS structs contain embedded named unions, like this: struct { ... union { ... } u; }; C11 standardized a feature that many compilers already implemented anyway, where an embedded union may be unnamed, like this: struct { ... union { ... }; }; This is more convenient because it allows the programmer to omit "u." in many places. OVS already used this feature in several places. This commit embraces it in several others. Signed-off-by: Ben Pfaff <blp@ovn.org> Acked-by: Justin Pettit <jpettit@ovn.org> Tested-by: Alin Gabriel Serdean <aserdean@ovn.org> Acked-by: Alin Gabriel Serdean <aserdean@ovn.org>
* Add multi-column index support for the Python IDLTerry Wilson2018-04-172-11/+198
| | | | | | | | | | This adds multi-column index support for the Python IDL that is similar to the feature in the C IDL. Since it adds sortedcontainers as a dependency and some distros don't yet package it, the library is copied in-tree and used if sortedcontainers is not installed. Signed-off-by: Terry Wilson <twilson@redhat.com> Signed-off-by: Ben Pfaff <blp@ovn.org>
* ovsdb-idl: Use modern form of <monitor-requests>.Ben Pfaff2018-03-141-2/+3
| | | | | | | | | | | Long ago, a <monitor-requests> object in the OVSDB protocol mapped a table name to a single <monitor-request>. Since then, it has mapped a table name to an *array of* <monitor-request> objects, but the OVSDB IDL has never been updated to use the modern form. This commit makes that change. Reported-by: Anil Jangam <anilj.mailing@gmail.com> Signed-off-by: Ben Pfaff <blp@ovn.org> Acked-by: Justin Pettit <jpettit@ovn.org>
* python: KeyError shouldn't be raised from __getattr__Timothy Redaelli2018-03-141-1/+5
| | | | | | | | | | | | On Python 3 hasattr only intercepts AttributeError exception. On Python2, instead, hasattr intercepts all the exceptions. This means __getattr__ shouldn't return KeyError when the attribute doesn't exists, but it should raise AttributeError instead. Fixes: 2d54d8011e14 ("Python-IDL: getattr after mutate fix") Signed-off-by: Timothy Redaelli <tredaelli@redhat.com> Signed-off-by: Russell Bryant <russell@ovn.org>
* python: avoid useless JSON conversion to enhance performanceDaniel Alvarez2018-02-281-7/+5
| | | | | | | | | | | | | | | | | | | This patch removes a useless conversion to/from JSON in the processing of any 'modify' operations inside the process_update2 method in Python IDL implementation. Previous code will make resources creation take longer as the number of elements in the row grows because of that JSON conversion. This patch eliminates it and now the time remains consant regardless of the database contents improving performance and scaling. Reported-by: Daniel Alvarez <dalvarez@redhat.com> Reported-at: https://mail.openvswitch.org/pipermail/ovs-discuss/2018-February/046263.html Signed-off-by: Daniel Alvarez <dalvarez@redhat.com> Acked-by: Terry Wilson <twilson@redhat.com> Tested-By: Terry Wilson <twilson@redhat.com> Acked-by: Han Zhou <hzhou8@ebay.com> Signed-off-by: Ben Pfaff <blp@ovn.org>
* ovsdb-idlc: Add infrastructure for IDL schema extensions.Ben Pfaff2018-02-161-11/+26
| | | | | | | | | | | An IDL schema is an OVSDB schema with some extra stuff in it. So far, all of the extras have been at the top level. This commit makes it possible for IDL schemas to have extra information at the table and column levels as long as it is in an "extensions" member. No extensions are actually supported yet. Signed-off-by: Ben Pfaff <blp@ovn.org>
* ovsdb-idlc: Add "cDecls" and "hDecls" IDL schema extensions.Ben Pfaff2018-02-161-2/+9
| | | | | | | | | | An IDL schema is an OVSDB schema with some extra stuff in it: an idlPrefix and an idlHeader at the top level to indicate what ovsdb-idlc needs to generate the interface definitions. This commit adds support for two more optional IDL schema extensions that allow extra code to be written to the .c and .h file that ovsdb-idlc generates. Signed-off-by: Ben Pfaff <blp@ovn.org>
* python: Allow tuning the session probe_interval from IDLLucas Alvares Gomes2017-04-131-3/+9
| | | | | | | | | | | | | This patch is adding a new parameter called "probe_interval" to the constructor of the Idl class. This new parameter will be used to tune the database connection probing for that IDL session, some users might want to tune it to be less agressive than the current 5s default in OVS or even disable it. Reported-at: https://bugs.launchpad.net/networking-ovn/+bug/1680146 Signed-off-by: Lucas Alvares Gomes <lucasagomes@gmail.com> Acked-by: Daniel Alvarez <dalvarez@redhat.com> Signed-off-by: Russell Bryant <russell@ovn.org>
* Adapt to flake8-import-orderxurong000379972017-03-085-20/+19
| | | | | | | | | | https://review.openstack.org/#/c/432906/ flake8-import-order adds 3 new flake8 warnings: I100: Your import statements are in the wrong order. I101: The names in your from import are in the wrong order. I201: Missing newline between sections or imports. Signed-off-by: Ben Pfaff <blp@ovn.org>
* python: Prevent extra unexpected reply debug logs.Terry Wilson2017-02-171-0/+1
| | | | | | | | | | | Since __txn_process_reply always returns None, the existing code will always hit the final else for replies and log a debug message about receiving an unexpected reply. In the C version, ovsdb_idl_txn_process_reply returns true any time the txn is found, so that behavior is duplicated here. Signed-off-by: Terry Wilson <twilson@redhat.com> Signed-off-by: Russell Bryant <russell@ovn.org>
* ovsdb: Print enum elements for man pages in alphabetical order.Justin Pettit2017-02-141-0/+1
| | | | | | | The previous behavior printed them in a pseudorandom order, which made them look odd in man pages. Signed-off-by: Justin Pettit <jpettit@ovn.org>
* ovsdb-idl: Change interface to conditional monitoring.Ben Pfaff2016-12-191-16/+15
| | | | | | | | | | | | | | | | | | | | | | | | Most users of OVSDB react to whatever is currently in their view of the database, as opposed to keeping track of changes and reacting to those changes individually. The interface to conditional monitoring was different, in that it expected the client to say what to add or remove from monitoring instead of what to monitor. This seemed reasonable at the time, but in practice it turns out that the usual approach actually works better, because the condition is generally a function of the data visible in the database. This commit changes the approach. This commit also changes the meaning of an empty condition for a table. Previously, an empty condition meant to replicate every row. Now, an empty condition means to replicate no rows. This is more convenient for code that gradually constructs conditions, because it does not need special cases for replicating nothing. This commit also changes the internal implementation of conditions from linked lists to arrays. I just couldn't see an advantage to using linked lists. Signed-off-by: Ben Pfaff <blp@ovn.org> Acked-by: Liran Schour <lirans@il.ibm.com>
* python: Add double newline after fuction or class (E305).Daniele Di Proietto2016-12-021-0/+1
| | | | | | | | pycodestyle >= 2.1.0 reports E305 otherwise, and the flake8-check step fails. Signed-off-by: Daniele Di Proietto <diproiettod@vmware.com> Acked-by: Ben Pfaff <blp@ovn.org>
* ovsdb-idlc: Eliminate <prefix>_init() function from generated code.Ben Pfaff2016-10-192-64/+78
| | | | | Signed-off-by: Ben Pfaff <blp@ovn.org> Acked-by: Andy Zhou <azhou@ovn.org>
* Python-IDL: getattr after mutate fixAmitabha Biswas2016-10-141-14/+24
| | | | | | | | | | | This commit returns the updated column value when getattr is done after a mutate operation is performed (but before the commit). Signed-off-by: Amitabha Biswas <azbiswas@gmail.com> Reported-by: Richard Theis <rtheis@us.ibm.com> Reported-at: http://openvswitch.org/pipermail/dev/2016-September/080120.html Fixes: a59912a0ee8e ("python: Add support for partial map and set updates") Signed-off-by: Russell Bryant <russell@ovn.org>
* ovsdb-idlc: Make set and map update operations take const arguments.Ben Pfaff2016-08-311-1/+13
| | | | | | | | | | In a call like "ovsrec_bridge_update_ports_delvalue(bridge, port)", there's no reason for the port argument to be nonconst, because the call doesn't do anything to the port at all--it only searches the list of ports in the bridge for that particular port and, if it finds it, removes it. Signed-off-by: Ben Pfaff <blp@ovn.org> Acked-by: Russell Bryant <russell@ovn.org>
* ovsdb: Fix mutation of newly inserted rows from Python IDL.Amitabha Biswas2016-08-301-1/+7
| | | | | | | | | | | | | | | This patch fixes the scenario, where the mutate operation on a row is sent in the same transaction as row insert operation. It was obvserved that this mutate operation was not getting committed to the OVSDB. To get around the above problem the "where" condition in an mutate operation is modified to use the named-uuid to identify a row created in the current transaction. Signed-off-by: Amitabha Biswas <abiswas@us.ibm.com> Suggested-by: Richard Theis <rtheis@us.ibm.com> Signed-off-by: Ben Pfaff <blp@ovn.org>
* ovsdb: Fix reference to table's row on condition_add|remove_clauseLiran Schour2016-08-261-3/+10
| | | | | | | | Use struct uuid * on [add|remove]_clause on columns which are references to tables. That prevents use-after-free errors. Signed-off-by: Liran Schour <lirans@il.ibm.com> Signed-off-by: Ben Pfaff <blp@ovn.org>