11-18-2020 01:18 AM
Hi Nso dev,
I'm using json-rpc with react and read only mode is fine. Now, i try to create some objects/services on NSO 4.6 backend... In order to manage user commit concurrency, i want to lock the whole configuration and reject new write transaction if someone else is editing config tree.
Following the documentation, 'new_trans' json-rpc method allow exclusive flag. An error should be raised if configuration is lock by someone else:
{"type": "db.locked", "data": {"sessions": <array of string>}}
I have tried to reproduce the case with the following python script:
import requests import random import time s = requests.session() print("Login into NSO WebUi") login_data = {"jsonrpc":"2.0","method":"login","id":random.randint(200, 65544),"params":{"user":"user","passwd":"password"}} aaa = s.post("http://10.204.10.21:8808/jsonrpc", json=login_data) for i in range(1,20): print("Open Write transaction %d" % i) data = {"jsonrpc":"2.0","method":"new_trans","id":random.randint(200, 65544),"params":{"db":"candidate","mode":"read_write","conf_mode":"exclusive","on_pending_changes":"reject"}} print(data) r = s.post("http://10.204.10.21:8808/jsonrpc", json=data) print(r.json()) th = r.json()["result"]["th"] time.sleep(10) print("Logout into NSO WebUI") data = {"jsonrpc":"2.0","method":"logout","id":random.randint(200, 65544)} s.post("http://10.204.10.21:8808/jsonrpc", json=data)
And results:
python3 lock.py Login into NSO WebUi Open Write transaction 1 {'params': {'conf_mode': 'exclusive', 'on_pending_changes': 'reject', 'mode': 'read_write', 'db': 'candidate'}, 'id': 58763, 'jsonrpc': '2.0', 'method': 'new_trans'} {'result': {'th': 1}, 'id': 58763, 'jsonrpc': '2.0'} Open Write transaction 2 {'params': {'conf_mode': 'exclusive', 'on_pending_changes': 'reject', 'mode': 'read_write', 'db': 'candidate'}, 'id': 59148, 'jsonrpc': '2.0', 'method': 'new_trans'} {'result': {'th': 2}, 'id': 59148, 'jsonrpc': '2.0'} Open Write transaction 3 {'params': {'conf_mode': 'exclusive', 'on_pending_changes': 'reject', 'mode': 'read_write', 'db': 'candidate'}, 'id': 59485, 'jsonrpc': '2.0', 'method': 'new_trans'} {'result': {'th': 3}, 'id': 59485, 'jsonrpc': '2.0'}
But, over cli, behaviour is normal:
lchabert@ncs> configure exclusive Error: configuration database locked by: user http (webui from 127.0.0.1) on since 2020-11-06 17:35:50 Aborted: configuration locked [error][2020-11-06 18:08:54] lchabert@ncs>
Is it a normal behaviour with json-rpc interface ?
Why the json-rpc lock error is never raised on exclusive mode ?
Any mis-understanding of the documentation ?
Thanks in advance,
Best regards.
11-23-2020 08:45 AM - edited 11-23-2020 08:47 AM
There is currently no way to achieve the same behaviour in JSON-RPC as the CLI has,
i.e. aborting a new transaction in exclusive conf mode when an exclusive lock is taken.
The transaction will however fail "commit" and "validate_commit", the error message
for "commit" isn't particularly helpful but the error message for "validate_commit" is
basically the same as the CLI error message.
Furthermore, it is possible to call "resolve_trans" when the exclusive lock is released
and then commit will work.
It can be discussed whether the behaviour should be this way or not, or if one should be
able to choose. Please connect with TAC for further discussion.
Perhaps commit queues could be an alternative?
11-24-2020 07:59 AM
Thanks for your answer, i will take a look on validate_commit message when exclusive lock is taken.
I'm using commit queues to release webinterface and display user notification on task background. But i have two questions concerning commit queues:
Thanks in advance,
Regards.
11-24-2020 09:41 AM
It is also possible to explicitly take a lock with the lock_db method. It will fail if it's not
possible to take the lock.
Furthermore the documentation states the following when using on_pending_changes=reject:
The on_pending_changes param decides what to do if the candidate already
has been written to, e.g. a CLI user has started a shared configuration session
and changed a value in the configuration (without committing it). If this parameter
is omitted the default behavior is to silently reuse the candidate. If "reject" is
specified the call to the "new_trans" method will fail if the candidate is non-
empty. If "discard" is specified the candidate is silently cleared if it is non-empty.
Regarding commit queues see the youtube video for an introduction.
11-25-2020 12:56 AM
Note however that the candidate datastore is not available in NSO.
I realize that the webui docs need to be changed to reflect this and
have filed a ticket to fix them.
How did you manage to setup a new transaction with candidate as db?
11-25-2020 07:42 AM
I don't have any special magic trick, just posting the candidate JSON as shown on my first post
But no error raised from nso. Maybe NSO should raised an error ?
Thanks for the video. I will watch it as soon as possible.
If the speaker of video pass here, I can't find any source code. Could you please release it ? @dansullivan
Discover and save your favorite ideas. Come back to expert answers, step-by-step guides, recent topics, and more.
New here? Get started with these tips. How to use Community New member guide