08-05-2019 02:13 AM - edited 08-05-2019 02:16 AM
Hi
I'm trying to push some data using nornir framework, however when I receive error 404: method not allowed Error.
I'm using IOS-XE version 16.9.3 with csr1000v as my test environment.
Python version: 3.7.3
There many policy-map configured on the device and what I'm trying to achieve is to change only a single policy-map config without changing other policy-maps.
He're is my code and It's respective host.yaml and groups.yaml file
#!/usr/bin/python3 import requests from nornir import InitNornir from nornir.plugins.tasks.apis import http_method from nornir.plugins.functions.text import print_result def manage_devices(task, policy, headers): BaseURL = f'https://{task.host.hostname}:{task.host.port}/restconf/' task.run( task=http_method, name='Update policy-map and class-map config via HTTP PUT', method='put', url=BaseURL + policy, auth=('XXXX', 'ZZZZZ'), headers=headers, verify=False, json=task.host['body']['Cisco-IOS-XE-native:policy']['Cisco-IOS-XE-policy:policy-map'][0], ) def main(): requests.packages.urllib3.disable_warnings() policy_header = 'data/Cisco-IOS-XE-native:native/Cisco-IOS-XE-native:policy/Cisco-IOS-XE-policy:policy-map/' PutHeader = { 'Content-Type': 'application/yang-data+json', 'Accept': 'application/yang-data+json, application/yang-data.errors+json' } nornir = InitNornir() result = nornir.run( task=manage_devices, name='Configure devices via RESTCONF', policy=policy_header, headers=PutHeader, ) print_result(result) if __name__ == '__main__': main()
hosts file:
--- PE-R2: hostname: '172.17.105.6' port: '8802' groups: - 'csr1000v' data: body: Cisco-IOS-XE-native:policy: Cisco-IOS-XE-policy:class-map: - name: CLASS_TEST prematch: match-all match: access-group: name: - ACL_COUNT_TEST Cisco-IOS-XE-policy:policy-map: - name: POLICY_TEST class: - name: CLASS_TEST ...
groups file
--- csr1000v: username: 'XXXX' password: 'ZZZZ' platform: 'ios'
It seems I'm not able to figure out the correct format to push configs to router.
I'm getting this Error message when running script:
requests.exceptions.HTTPError: 405 Client Error: Method Not Allowed for url: https://172.17.105.6:8802/restconf/data/Cisco-IOS-XE-native:native/Cisco-IOS-XE-native:policy/Cisco-IOS-XE-policy:policy-map/
08-05-2019 12:20 PM
This is known YDK issue. Unfortunately the IOS XE does not allow to have non-secure Restconf connection and YDK does not support secure HTTP connection. We will fix that issue as resources permit.
08-06-2019 03:59 AM
I'm not sure how is it related to that issue but the point is if I send without specifying nested keys like following snippet, configuration are pushed to router successfully:
json=task.host['body']
But when I try to push an specific part of the data, I receive '405 Client Error: Method Not Allowed for URL:'
json=task.host['body']['Cisco-IOS-XE-native:policy']['Cisco-IOS-XE-policy:policy-map'][0],
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