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