05-20-2022 08:31 AM
Hi Team !
I am trying to create a script to fetch a list of devices recorded into NSO thanks to this code :
#!/usr/local/bin/python3 import requests from pprint import pprint nso_server = { "ip": "10.10.0.1", "username": "admin", "password": "admin", "port": "8080", } headers = { "Accept" : "application/yang-data+xml", "Content-Type" : "application/yang-data+xml", } module = "tailf-ncs:devices" url = f"http://{nso_server['ip']}:{nso_server['port']}/restconf/data/{module}" response = requests.get(url, headers=headers, auth=(nso_server['username'], nso_server['password']), verify=False).json() devices = response['tailf-ncs:devices']['device'] # print out all the device name and IP for device in devices: if 'test' not in device['name']: dev_name = device['name'] url_sync = url+'/'+f"device={dev_name}"+'/'+'sync-from' sync = requests.post(url_sync, headers=headers, auth=(nso_server['username'], nso_server['password']), verify=False) print(f"device:{device['name']} -ip:{device['address']} -port:{device['port']} -sync result:{sync.text}")
As i am a python padawan, i can not even understand the errors returned when script execution fails :
Traceback (most recent call last): File "/usr/local/lib/python3.9/site-packages/urllib3/response.py", line 700, in _update_chunk_length self.chunk_left = int(line, 16) ValueError: invalid literal for int() with base 16: b'' During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/usr/local/lib/python3.9/site-packages/urllib3/response.py", line 441, in _error_catcher yield File "/usr/local/lib/python3.9/site-packages/urllib3/response.py", line 767, in read_chunked self._update_chunk_length() File "/usr/local/lib/python3.9/site-packages/urllib3/response.py", line 704, in _update_chunk_length raise InvalidChunkLength(self, line) urllib3.exceptions.InvalidChunkLength: InvalidChunkLength(got length b'', 0 bytes read) During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/usr/local/lib/python3.9/site-packages/requests/models.py", line 760, in generate for chunk in self.raw.stream(chunk_size, decode_content=True): File "/usr/local/lib/python3.9/site-packages/urllib3/response.py", line 575, in stream for line in self.read_chunked(amt, decode_content=decode_content): File "/usr/local/lib/python3.9/site-packages/urllib3/response.py", line 796, in read_chunked self._original_response.close() File "/usr/local/Cellar/python@3.9/3.9.12/Frameworks/Python.framework/Versions/3.9/lib/python3.9/contextlib.py", line 137, in __exit__ self.gen.throw(typ, value, traceback) File "/usr/local/lib/python3.9/site-packages/urllib3/response.py", line 458, in _error_catcher raise ProtocolError("Connection broken: %r" % e, e) urllib3.exceptions.ProtocolError: ("Connection broken: InvalidChunkLength(got length b'', 0 bytes read)", InvalidChunkLength(got length b'', 0 bytes read)) During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/Users/jeyriku/Documents/dev/ztp/Python_&_Rest/python_rest_v0.1.py", line 22, in <module> response = requests.get(url, headers=headers, auth=(nso_server['username'], nso_server['password']), verify=False).json() File "/usr/local/lib/python3.9/site-packages/requests/api.py", line 75, in get return request('get', url, params=params, **kwargs) File "/usr/local/lib/python3.9/site-packages/requests/api.py", line 61, in request return session.request(method=method, url=url, **kwargs) File "/usr/local/lib/python3.9/site-packages/requests/sessions.py", line 529, in request resp = self.send(prep, **send_kwargs) File "/usr/local/lib/python3.9/site-packages/requests/sessions.py", line 687, in send r.content File "/usr/local/lib/python3.9/site-packages/requests/models.py", line 838, in content self._content = b''.join(self.iter_content(CONTENT_CHUNK_SIZE)) or b'' File "/usr/local/lib/python3.9/site-packages/requests/models.py", line 763, in generate raise ChunkedEncodingError(e) requests.exceptions.ChunkedEncodingError: ("Connection broken: InvalidChunkLength(got length b'', 0 bytes read)", InvalidChunkLength(got length b'', 0 bytes read))
Some help would be appreciated !!!
Thanks in advance !
Kind Regards,
Jerems
Solved! Go to Solution.
05-20-2022 09:02 AM
Hello ,
I changed your script and it's working
#!/usr/local/bin/python3 import requests from pprint import pprint nso_server = { "ip": "10.10.0.1", "username": "admin", "password": "admin", "port": "8080", } headers = { "Accept" : "application/yang-data+json", "Content-Type" : "application/yang-data+json" } module = "tailf-ncs:devices/" path="tailf-ncs:devices/device?fields=name;address;port" url = f"http://{nso_server['ip']}:{nso_server['port']}/restconf/data/{path}" device_url=f"http://{nso_server['ip']}:{nso_server['port']}/restconf/data/{module}" response = requests.get(url, headers=headers, auth=(nso_server['username'], nso_server['password']), verify=False).json() devices = response['tailf-ncs:device'] # print out all the device name and IP for device in devices: if 'test' not in device['name']: dev_name = device['name'] url_sync = device_url+'/'+f"device={dev_name}"+'/'+'sync-from' sync = requests.post(url_sync, headers=headers, auth=(nso_server['username'], nso_server['password']), verify=False) print(f"device:{device['name']} -ip:{device['address']} -port:{device['port']} -sync result:{sync.text}")
Here the output that i got
device:NETSIM0 -ip:127.0.0.1 -port:10031 -sync result:{ "tailf-ncs:output": { "result": false, "info": "Failed to authenticate towards device NETSIM0: SSH host key mismatch" } } device:TEST-IOS-XR-3.00 -ip:127.0.0.1 -port:10025 -sync result:{ "tailf-ncs:output": { "result": true } } device:TEST-IOS-XR-3.01 -ip:127.0.0.1 -port:10026 -sync result:{ "tailf-ncs:output": { "result": true } }
05-20-2022 08:34 AM
It could be file permission related...let's check !
05-20-2022 08:55 AM - edited 05-20-2022 08:56 AM
It's not permission related but urlib3 failure !
Let's Dig into that then !
A curl request does not lead to such issue.
05-20-2022 09:02 AM
Hello ,
I changed your script and it's working
#!/usr/local/bin/python3 import requests from pprint import pprint nso_server = { "ip": "10.10.0.1", "username": "admin", "password": "admin", "port": "8080", } headers = { "Accept" : "application/yang-data+json", "Content-Type" : "application/yang-data+json" } module = "tailf-ncs:devices/" path="tailf-ncs:devices/device?fields=name;address;port" url = f"http://{nso_server['ip']}:{nso_server['port']}/restconf/data/{path}" device_url=f"http://{nso_server['ip']}:{nso_server['port']}/restconf/data/{module}" response = requests.get(url, headers=headers, auth=(nso_server['username'], nso_server['password']), verify=False).json() devices = response['tailf-ncs:device'] # print out all the device name and IP for device in devices: if 'test' not in device['name']: dev_name = device['name'] url_sync = device_url+'/'+f"device={dev_name}"+'/'+'sync-from' sync = requests.post(url_sync, headers=headers, auth=(nso_server['username'], nso_server['password']), verify=False) print(f"device:{device['name']} -ip:{device['address']} -port:{device['port']} -sync result:{sync.text}")
Here the output that i got
device:NETSIM0 -ip:127.0.0.1 -port:10031 -sync result:{ "tailf-ncs:output": { "result": false, "info": "Failed to authenticate towards device NETSIM0: SSH host key mismatch" } } device:TEST-IOS-XR-3.00 -ip:127.0.0.1 -port:10025 -sync result:{ "tailf-ncs:output": { "result": true } } device:TEST-IOS-XR-3.01 -ip:127.0.0.1 -port:10026 -sync result:{ "tailf-ncs:output": { "result": true } }
05-23-2022 01:48 AM
Hi @Nabsch,
I was missing the correct parameter typo:
?fields
in my restconf get method.
Moreover, The expected format was json instead of xml.
Why do i get an error when trying xml ?
Thank you so much,
Jerems
05-23-2022 03:58 PM - edited 05-26-2022 04:16 PM
Hello,
It's not working because when you try to retrieve your devices and you have more than one device. So NSO will try to send more than 1 device and you will have more than one root Element which is not Valid in XML.
I try on device it's fails but working on authgroup because i have only one.
nabil@DESKTOP-8ECTID4:~$ curl -i -u admin:admin "http://localhost:8080/restconf/data/tailf-ncs:devices/device?fields=name;address;port" -H "Accept :application/yang-data+xml" HTTP/1.1 400 Bad Request Date: Mon, 23 May 2022 22:54:42 GMT Cache-Control: private, no-cache, must-revalidate, proxy-revalidate Content-Length: 230 Content-Type: application/yang-data+xml X-Cisco-NSO-Trace-ID: a4e9f8ab-d6a1-4ed7-927f-de7e11404c39 Pragma: no-cache Content-Security-Policy: default-src 'self'; block-all-mixed-content; base-uri 'self'; frame-ancestors 'none'; Strict-Transport-Security: max-age=15552000; includeSubDomains X-Content-Type-Options: nosniff X-Frame-Options: DENY X-XSS-Protection: 1; mode=block <errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"> <error> <error-type>application</error-type> <error-tag>invalid-value</error-tag> <error-message>too many instances: 6</error-message> </error> </errors> nabil@DESKTOP-8ECTID4:~$ curl -i -u admin:admin "http://localhost:8080/restconf/data/tailf-ncs:devices/authgroups/group" -H "Accept :application/yang-data+xml" HTTP/1.1 200 OK Date: Mon, 23 May 2022 22:50:04 GMT Last-Modified: Fri, 20 May 2022 19:13:03 GMT Cache-Control: private, no-cache, must-revalidate, proxy-revalidate Etag: "1653-74064-499717" Content-Type: application/yang-data+xml Transfer-Encoding: chunked X-Cisco-NSO-Trace-ID: 9727915c-d6a3-40ac-8696-4d1d5455d35e Pragma: no-cache Content-Security-Policy: default-src 'self'; block-all-mixed-content; base-uri 'self'; frame-ancestors 'none'; Strict-Transport-Security: max-age=15552000; includeSubDomains X-Content-Type-Options: nosniff X-Frame-Options: DENY X-XSS-Protection: 1; mode=block <group xmlns="http://tail-f.com/ns/ncs" xmlns:ncs="http://tail-f.com/ns/ncs"> <name>default</name> <umap> <local-user>admin</local-user> <remote-name>admin</remote-name> <remote-password>$9$09ec/rAIrWPCWZZIv87YrZD8Q2oJa0RET3sX0JMadic=</remote-password> </umap> <umap> <local-user>oper</local-user> <remote-name>oper</remote-name> <remote-password>$9$afUGLCtUdztJBsxAnS6yULzCCqv10jzfe1f8OWw6pYc=</remote-password> </umap> </group>
You have another option is to switch to Collection.
nabil@DESKTOP-8ECTID4:~$ curl -i -u admin:admin "http://localhost:8080/restconf/data/tailf-ncs:devices/device?fields=name;address;port" -H "Accept : application/vnd.yang.collection+xml" HTTP/1.1 200 OK Date: Mon, 23 May 2022 22:56:22 GMT Last-Modified: Fri, 20 May 2022 19:13:03 GMT Cache-Control: private, no-cache, must-revalidate, proxy-revalidate Etag: "1653-74064-499717" Content-Type: application/vnd.yang.collection+xml Transfer-Encoding: chunked X-Cisco-NSO-Trace-ID: 3b8fb897-2894-4099-9ac6-4c0766e5224d Pragma: no-cache Content-Security-Policy: default-src 'self'; block-all-mixed-content; base-uri 'self'; frame-ancestors 'none'; Strict-Transport-Security: max-age=15552000; includeSubDomains X-Content-Type-Options: nosniff X-Frame-Options: DENY X-XSS-Protection: 1; mode=block <collection xmlns="http://tail-f.com/ns/restconf/collection/1.0"> <device xmlns="http://tail-f.com/ns/ncs" xmlns:ncs="http://tail-f.com/ns/ncs"> <name>TEST-IOS-XR-3.00</name> <address>127.0.0.1</address> <port>10025</port> </device> <device xmlns="http://tail-f.com/ns/ncs" xmlns:ncs="http://tail-f.com/ns/ncs"> <name>TEST-IOS-XR-3.01</name> <address>127.0.0.1</address> <port>10026</port> </device>
Here a link that might help you
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