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