Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

YDK attempting to send Commit command when 'writable-running' in capabilities #915

Closed
Victorb1030 opened this issue Apr 22, 2019 · 1 comment
Assignees
Milestone

Comments

@Victorb1030
Copy link

Victorb1030 commented Apr 22, 2019

Issue tracker is ONLY used for reporting bugs. Please use the YDK Community for any support issues.

Expected Behavior

Command is sent to OS 16.7.1 ASR920 using netconf-yang and change is saved into writable running config. No commit message is sent requiring candidate support

Current Behavior

Command is sent to OS 16.7.1 ASR920 using netconf-yang and then a 'commit' rpc is sent, returning an error 'candidate support required'

Steps to Reproduce

  • Create netconf session
  • getconfig for interface using CRUDService
  • make change to Native structure Cisco_XE
  • send update command with CRUDService to update change

Your Script

    #Setting basics for interface first
    native = Cisco_IOS_XE_native.Native()
    gigabitethernet = native.Interface.GigabitEthernet()
    
    gigabitethernet.description = 'TESTING 1'

  #Append interface config back to native object
    native.interface.gigabitethernet.append(gigabitethernet)
    #native object containing interface config is sent to __set_data
    ( response_list, return_data ) = self.__set_data( host_dict, native )
   #Handle response
     ...

 def __set_data( self, host_dict, set_filter ):
    pref = "[YDKUtilXE][__set_data] "
    self.log.info( pref + "called" )

    netconf = NetconfServiceProvider(
        address     = host_dict["ip_address"],
        port        = host_dict["netconf_port"],
        username    = host_dict["ssh_login"],
        password    = host_dict["ssh_password"],
        timeout     = host_dict["ssh_timeout"] * 1000, # convert from seconds to microseconds
        protocol    = host_dict["access_method"],
    )

    crud_service = CRUDService()

    self.log.info( pref + 'loading with filter: ' + dump.object( set_filter ) )

    response_list = None
    result = None
    try:
      result = crud_service.update( netconf, set_filter )

       #Handle result and error
        ...

Logs

Enable logging and post the logs below

00:30:13 - ydk - DEBUG - Trace: Received message (session ):
<?xml version="1.0" encoding="UTF-8"?>
<hello xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<capabilities>
<capability>urn:ietf:params:netconf:base:1.0</capability>
<capability>urn:ietf:params:netconf:base:1.1</capability>
<capability>urn:ietf:params:netconf:capability:writable-running:1.0</capability>
<capability>urn:ietf:params:netconf:capability:xpath:1.0</capability>
<capability>urn:ietf:params:netconf:capability:validate:1.0</capability>
<capability>urn:ietf:params:netconf:capability:validate:1.1</capability>
<capability>urn:ietf:params:netconf:capability:rollback-on-error:1.0</capability>
<capability>urn:ietf:params:netconf:capability:notification:1.0</capability>
<capability>urn:ietf:params:netconf:capability:interleave:1.0</capability>
<capability>urn:ietf:params:netconf:capability:with-defaults:1.0?basic-mode=explicit&amp;also-supported=report-all-tagged</capability>
<capability>urn:ietf:params:netconf:capability:yang-library:1.0?revision=2016-06-21&amp;module-set-id=49fc51c24e918d18edbf5558be6d76d1</capability>
<capability>http://tail-f.com/ns/netconf/actions/1.0</capability>
<capability>http://tail-f.com/ns/netconf/extensions</capability>
<capability>http://cisco.com/ns/cisco-xe-ietf-ip-deviation?module=cisco-xe-ietf-ip-deviation&amp;revision=2016-08-10</capability>
<capability>http://cisco.com/ns/cisco-xe-ietf-ipv4-unicast-routing-deviation?module=cisco-xe-ietf-ipv4-unicast-routing-deviation&amp;revision=2015-09-11</capability>
<capability>http://cisco.com/ns/cisco-xe-ietf-ipv6-unicast-routing-deviation?module=cisco-xe-ietf-ipv6-unicast-routing-deviation&amp;revision=2015-09-11</capability>
<capability>http://cisco.com/ns/cisco-xe-ietf-ospf-deviation?module=cisco-xe-ietf-ospf-deviation&amp;revision=2015-09-11</capability>
<capability>http://cisco.com/ns/cisco-xe-ietf-routing-deviation?module=cisco-xe-ietf-routing-deviation&amp;revision=2016-07-09</capability>
<capability>http://cisco.com/ns/cisco-xe-openconfig-acl-deviation?module=cisco-xe-openconfig-acl-deviation&amp;revision=2017-08-25</capability>
<capability>http://cisco.com/ns/mpls-static/devs?module=common-mpls-static-devs&amp;revision=2015-09-11</capability>
<capability>http://cisco.com/ns/nvo/devs?module=nvo-devs&amp;revision=2015-09-11</capability>
<capability>http://cisco.com/ns/yang/Cisco-IOS-XE-aaa?module=Cisco-IOS-XE-aaa&amp;revision=2017-09-05</capability>
<capability>http://cisco.com/ns/yang/Cisco-IOS-XE-acl?module=Cisco-IOS-XE-acl&amp;revision=2017-08-01</capability>
<capability>http://cisco.com/ns/yang/Cisco-IOS-XE-arp?module=Cisco-IOS-XE-arp&amp;revision=2017-01-16</capability>
<capability>http://cisco.com/ns/yang/Cisco-IOS-XE-bfd?module=Cisco-IOS-XE-bfd&amp;revision=2017-08-23</capability>
<capability>http://cisco.com/ns/yang/Cisco-IOS-XE-bfd-oper?module=Cisco-IOS-XE-bfd-oper&amp;revision=2017-02-07</capability>
<capability>http://cisco.com/ns/yang/Cisco-IOS-XE-bgp?module=Cisco-IOS-XE-bgp&amp;revision=2017-09-18</capability>
<capability>http://cisco.com/ns/yang/Cisco-IOS-XE-bridge-domain?module=Cisco-IOS-XE-bridge-domain&amp;revision=2017-02-07</capability>
<capability>http://cisco.com/ns/yang/Cisco-IOS-XE-call-home?module=Cisco-IOS-XE-call-home&amp;revision=2017-02-07</capability>
<capability>http://cisco.com/ns/yang/Cisco-IOS-XE-cdp?module=Cisco-IOS-XE-cdp&amp;revision=2017-08-16</capability>
<capability>http://cisco.com/ns/yang/Cisco-IOS-XE-cdp-oper?module=Cisco-IOS-XE-cdp-oper&amp;revision=2017-09-21</capability>
<capability>http://cisco.com/ns/yang/Cisco-IOS-XE-cef?module=Cisco-IOS-XE-cef&amp;revision=2017-05-19&amp;features=asr1k-dpi</capability>
<capability>http://cisco.com/ns/yang/Cisco-IOS-XE-common-types?module=Cisco-IOS-XE-common-types&amp;revision=2017-05-05</capability>
<capability>http://cisco.com/ns/yang/Cisco-IOS-XE-crypto?module=Cisco-IOS-XE-crypto&amp;revision=2017-08-16</capability>
<capability>http://cisco.com/ns/yang/Cisco-IOS-XE-diffserv-target-oper?module=Cisco-IOS-XE-diffserv-target-oper&amp;revision=2017-02-09&amp;features=target-inline-policy-config</capability>
<capability>http://
00:30:13 - ydk - INFO - ============= Requesting YANG 1.1 capabilities =============

...
00:30:18 - ydk - DEBUG - Encoding the subtree filter request using path API DataNode
00:30:18 - ydk - DEBUG - ydk::path::Codec: Encoding data node '/' to XML formated string
00:30:18 - ydk - DEBUG - ydk::path::Codec: Encoding data node '/Cisco-IOS-XE-native:native' to XML formated string
00:30:18 - ydk - DEBUG - Getting new modules for 'ietf-netconf:edit-config'
00:30:18 - ydk - DEBUG - Loading module 'ietf-netconf', revision ''
00:30:18 - ydk - DEBUG - The module 'ietf-netconf' schema has already been populated in YDK repository
00:30:18 - ydk - DEBUG - Populating schemas for path 'target/running'
00:30:18 - ydk - DEBUG - Looking to populate schemas for 'target/running'
00:30:18 - ydk - DEBUG - Getting new modules for 'target/running'
00:30:18 - ydk - DEBUG - Creating node 'target/running' with value ''
00:30:18 - ydk - DEBUG - Current path: /ietf-netconf:edit-config
00:30:18 - ydk - DEBUG - Top container path: ietf-netconf:edit-config
00:30:18 - ydk - DEBUG - Looking to populate schemas for 'target'
00:30:18 - ydk - DEBUG - Getting new modules for 'target'
00:30:18 - ydk - DEBUG - Getting child schema with path 'target' in /ietf-netconf:edit-config
00:30:18 - ydk - DEBUG - Getting data nodes with path 'target'
00:30:18 - ydk - DEBUG - Creating new data path 'target' in 'edit-config'
00:30:18 - ydk - DEBUG - Creating new data path 'running' with value '' in 'target'
00:30:18 - ydk - DEBUG - Populating schemas for path 'config'
00:30:18 - ydk - DEBUG - Looking to populate schemas for 'config'
00:30:18 - ydk - DEBUG - Getting new modules for 'config'
00:30:18 - ydk - DEBUG - Populating schemas for value '<native xmlns="http://cisco.com/ns/yang/Cisco-IOS-XE-native" xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0" nc:operation="merge">

...
00:30:18 - ydk - DEBUG - Netconf SSH Client: sending rpc
00:30:18 - ydk - DEBUG - Trace: Writing message (session 1206856):
<?xml version="1.0"?>
<rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="2">
  <edit-config>
    <target>
      <running/>
    </target>
    <config>
      <native xmlns="http://cisco.com/ns/yang/Cisco-IOS-XE-native" xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0" nc:operation="merge">
        <interface>
          <GigabitEthernet>
            <name>0/0/0</name>
            <description>TESTING 1</description>
          </GigabitEthernet>
        </interface>
      </native>
    </config>
  </edit-config>
</rpc>

00:30:18 - ydk - DEBUG - Netconf SSH Client: receiving rpc
00:30:18 - ydk - DEBUG - Trace: Received message (session 1206856):
<?xml version="1.0" encoding="UTF-8"?>
<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="2"><ok/></rpc-reply>
00:30:18 - ydk - DEBUG - Netconf SSH Client: processing reply
00:30:18 - ydk - INFO - ============= Reply RPC received from device =============
<?xml version="1.0" encoding="UTF-8"?>
<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="2">
  <ok/>
</rpc-reply>

00:30:18 - ydk - INFO - Executing 'commit' RPC
00:30:18 - ydk - DEBUG - Getting new modules for 'ietf-netconf:commit'
00:30:18 - ydk - DEBUG - Loading module 'ietf-netconf', revision ''
00:30:18 - ydk - DEBUG - The module 'ietf-netconf' schema has already been populated in YDK repository
00:30:18 - ydk - DEBUG - Getting new modules for 'ydk:create'
00:30:18 - ydk - DEBUG - Loading module 'ydk', revision ''
00:30:18 - ydk - DEBUG - The module 'ydk' schema has already been populated in YDK repository
00:30:18 - ydk - DEBUG - Getting new modules for 'ydk:read'
00:30:18 - ydk - DEBUG - Loading module 'ydk', revision ''
00:30:18 - ydk - DEBUG - The module 'ydk' schema has already been populated in YDK repository
00:30:18 - ydk - DEBUG - Getting new modules for 'ydk:update'
00:30:18 - ydk - DEBUG - Loading module 'ydk', revision ''
00:30:18 - ydk - DEBUG - The module 'ydk' schema has already been populated in YDK repository
00:30:18 - ydk - DEBUG - ydk::path::Codec: Encoding data node '/ietf-netconf:commit' to XML formated string
00:30:18 - ydk - INFO - ============= Generated RPC to send to device =============
<rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"><commit xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"/>
</rpc>

00:30:18 - ydk - DEBUG - Trace: Missing message-id in rpc.
00:30:18 - ydk - DEBUG - Netconf SSH Client: sending rpc
00:30:18 - ydk - ERROR - Connection error occurred: RPC requires :candidate capability, but the session does not support it.
00:30:18 - ydk - ERROR - Could not send payload <rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"><commit xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"/>
</rpc>
00:30:18 - flask.app - DEBUG - [YDKUtilXE][__set_data] failed to write via ydk crud_service+netconf:  Could not send payload
00:30:18 - flask.app - DEBUG - ydk_util returned return_code [408] message [Failed to write via ydk crud_service+netconf to [172.24.0.5]:  Could not send payload]:
00:30:18 - flask.app - INFO - ydk_util returned data:
{}
00:30:18 - flask.app - ERROR - returning error: [408] [Failed to write via ydk crud_service+netconf to [172.24.0.5]:  Could not send payload] - []

System Information

Python 3.7
Debian Buster
AMD64
lib versions:
ncclient==0.6.2
py==1.8.0
pyang==1.6
ydk==0.8.2
ydk-models-cisco-ios-xe==16.7.1
ydk-models-cisco-ios-xr==6.4.1
ydk-models-ietf==0.1.5.post2
ydk-models-openconfig==0.1.6.post1

@ygorelik ygorelik self-assigned this Apr 25, 2019
@ygorelik
Copy link
Collaborator

Bug has been fixed in 0.8.3 branch.
Test script using IOS-XE 16.5.1 sandbox:

import logging

from ydk.providers import NetconfServiceProvider
from ydk.services import CRUDService

from test_utils import enable_logging

from ydk.models.cisco_ios_xe import Cisco_IOS_XE_native

def update_interface(provider):

    crud_service = CRUDService()

    native = Cisco_IOS_XE_native.Native()
    loopback = native.Interface.Loopback()
    loopback.name = 0
    loopback.description = 'Loopback0'
    native.interface.loopback.append(loopback)
     
    result = crud_service.update( provider, native )

def get_interface(provider):

    native = Cisco_IOS_XE_native.Native()
    loopback = native.Interface.Loopback()
    loopback.name = 0
    native.interface.loopback.append(loopback)

    crud_service = CRUDService()
    ints = crud_service.read_config(provider, native)
    
if __name__ == "__main__":

    enable_logging(logging.INFO)

    provider = NetconfServiceProvider(
                               address='10.30.110.88',
                               port=830,
                               username='admin',
                               password='admin')

    update_interface(provider)
    get_interface(provider)

Console log:

yan@ubuntu-yan:~/ydk-workspace/ydk-gen$ python ./scripts/tests/test_915.py 
2019-04-25 10:49:15,708 - ydk - INFO - Path where models are to be downloaded: /home/yan/.ydk/10.30.110.88
2019-04-25 10:49:15,726 - ydk - INFO - Connected to 10.30.110.88 on port 830 using ssh with timeout of -1
2019-04-25 10:49:16,568 - ydk - INFO - Executing CRUD update operation on [Cisco-IOS-XE-native:native]
2019-04-25 10:49:16,569 - ydk - INFO - Executing 'edit-config' RPC on [Cisco-IOS-XE-native:native]
2019-04-25 10:49:16,876 - ydk - INFO - ============= Sending RPC to device =============
<rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"><edit-config xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
  <target>
    <running/>
  </target>
  <config><native xmlns="http://cisco.com/ns/yang/Cisco-IOS-XE-native" xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0" nc:operation="merge">
  <interface>
    <Loopback>
      <name>0</name>
      <description>Loopback0</description>
    </Loopback>
  </interface>
</native>
</config>
</edit-config>
</rpc>
2019-04-25 10:49:16,992 - ydk - INFO - ============= Received RPC from device =============
<?xml version="1.0" encoding="UTF-8"?>
<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="1">
  <ok/>
</rpc-reply>

2019-04-25 10:49:16,992 - ydk - INFO - Operation succeeded
2019-04-25 10:49:17,989 - ydk - INFO - Executing CRUD read_config operation on [Cisco-IOS-XE-native:native]
2019-04-25 10:49:17,989 - ydk - INFO - Executing 'get' RPC on [Cisco-IOS-XE-native:native] from running
2019-04-25 10:49:18,160 - ydk - INFO - ============= Sending RPC to device =============
<rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"><get-config xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
  <source>
    <running/>
  </source>
  <filter><native xmlns="http://cisco.com/ns/yang/Cisco-IOS-XE-native">
  <interface>
    <Loopback>
      <name>0</name>
    </Loopback>
  </interface>
</native></filter>
</get-config>
</rpc>
2019-04-25 10:49:18,189 - ydk - INFO - ============= Received RPC from device =============
<?xml version="1.0" encoding="UTF-8"?>
<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="2">
  <data>
    <native xmlns="http://cisco.com/ns/yang/Cisco-IOS-XE-native">
      <interface>
        <Loopback>
          <name>0</name>
          <description>Loopback0</description>
          <ip>
            <address>
              <primary>
                <address>172.16.255.101</address>
                <mask>255.255.255.255</mask>
              </primary>
            </address>
          </ip>
        </Loopback>
      </interface>
    </native>
  </data>
</rpc-reply>

2019-04-25 10:49:18,984 - ydk - INFO - Disconnected from device
yan@ubuntu-yan:~/ydk-workspace/ydk-gen$ 

ygorelik pushed a commit to ygorelik/ydk-gen that referenced this issue Apr 25, 2019
ygorelik pushed a commit to ygorelik/ydk-gen that referenced this issue Apr 25, 2019
@ygorelik ygorelik added this to the 0.8.3 milestone Apr 25, 2019
ghost pushed a commit that referenced this issue May 16, 2019
ghost pushed a commit that referenced this issue May 16, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants