CiscoDevNet / ydk-gen

Generate model-driven APIs from YANG models
http://ciscodevnet.github.io/ydk-gen/
Apache License 2.0
135 stars 74 forks source link

Path API create_datanode rejects valid value #1006

Closed tdesh10 closed 4 years ago

tdesh10 commented 4 years ago

Expected Behavior

ydk.path.RootSchemaNode.create_datanode(path, value=None) should never reject valid paths and values.

Current Behavior

In some cases, ydk.path.RootSchemaNode.create_datanode(path, value=None) rejects valid values with exception YModelError. Even though the value is set and in accordance with the model, the exception indicates that an empty string ("") was provided.

Note that the error does not occur if the datanode is created directly from its parent datanode using the function ydk.path.DataNode.create_datanode(path, value=None)

Steps to Reproduce

Execute the script below in ydk-py docker container.

Your Script

from ydk.path import Repository, Capability
from ydk.types import EncodingFormat
import logging
# log = logging.getLogger('ydk')
# log.setLevel(logging.DEBUG)
# handler = logging.StreamHandler()
# log.addHandler(handler)

repo = Repository('/root/ydk-py/cisco-ios-xr/ydk/models/cisco_ios_xr/_yang')
root_schema = repo.create_root_schema([])

xpath = "Cisco-IOS-XR-cdp-cfg:cdp/timer"
value = "60"

# cdp = root_schema.create_datanode("Cisco-IOS-XR-cdp-cfg:cdp")
# timer = cdp.create_datanode("timer", value)

datanode = root_schema.create_datanode(xpath, value)

Logs

Creating libyang context in path: /root/ydk-py/cisco-ios-xr/ydk/models/cisco_ios_xr/_yang
[libyang] Extension plugin "/usr/local/lib/libyang/libyang_ext_test.so" successfully loaded.
[libyang] Extension plugin "/usr/local/lib/libyang/metadata.so" successfully loaded.
[libyang] Extension plugin "/usr/local/lib/libyang/nacm.so" successfully loaded.
[libyang] Reading module "ietf-yang-metadata".
[libyang] Module "ietf-yang-metadata@2016-08-05" successfully parsed as implemented.
[libyang] Reading module "yang".
[libyang] Resolving "yang" unresolved schema nodes and their constraints...
[libyang] All "yang" schema nodes and constraints resolved.
[libyang] Module "yang@2017-02-20" successfully parsed as implemented.
[libyang] Reading module "ietf-inet-types".
[libyang] Resolving derived type "union" failed, it will be attempted later.
[libyang] Resolving derived type "union" failed, it will be attempted later.
[libyang] Resolving derived type "union" failed, it will be attempted later.
[libyang] Resolving derived type "union" failed, it will be attempted later.
[libyang] Resolving "ietf-inet-types" unresolved schema nodes and their constraints...
[libyang] All "ietf-inet-types" schema nodes and constraints resolved.
[libyang] Module "ietf-inet-types@2013-07-15" successfully parsed as implemented.
[libyang] Reading module "ietf-yang-types".
[libyang] Module "ietf-yang-types@2013-07-15" successfully parsed as implemented.
[libyang] Reading module "ietf-datastores".
[libyang] Module "ietf-datastores@2017-08-17" successfully parsed as implemented.
[libyang] Reading module "ietf-yang-library".
[libyang] Module "ietf-yang-library@2017-08-17" successfully parsed as implemented.
Populating new module schema 'ietf-yang-metadata'
Populating new module schema 'yang'
Populating new module schema 'ietf-inet-types'
Populating new module schema 'ietf-yang-types'
Populating new module schema 'ietf-datastores'
Populating new module schema 'ietf-yang-library'
Getting new modules for path 'Cisco-IOS-XR-cdp-cfg:cdp/timer'
Loading module 'Cisco-IOS-XR-cdp-cfg', revision ''
[libyang] Searching for "Cisco-IOS-XR-cdp-cfg" in /root/ydk-py/cisco-ios-xr/ydk/models/cisco_ios_xr/_yang.
[libyang] Searching for "Cisco-IOS-XR-cdp-cfg" in /root/ydk-py/cisco-ios-xr/ydk/models/cisco_ios_xr/_yang/ietf@0.1.5-post2.
[libyang] Searching for "Cisco-IOS-XR-cdp-cfg" in /root/ydk-py/pathapi-taran.
[libyang] Loading schema from "/root/ydk-py/cisco-ios-xr/ydk/models/cisco_ios_xr/_yang/Cisco-IOS-XR-cdp-cfg.yang" file.
[libyang] Searching for "Cisco-IOS-XR-ifmgr-cfg" in /root/ydk-py/cisco-ios-xr/ydk/models/cisco_ios_xr/_yang.
[libyang] Searching for "Cisco-IOS-XR-ifmgr-cfg" in /root/ydk-py/cisco-ios-xr/ydk/models/cisco_ios_xr/_yang/ietf@0.1.5-post2.
[libyang] Searching for "Cisco-IOS-XR-ifmgr-cfg" in /root/ydk-py/pathapi-taran.
[libyang] Loading schema from "/root/ydk-py/cisco-ios-xr/ydk/models/cisco_ios_xr/_yang/Cisco-IOS-XR-ifmgr-cfg.yang" file.
[libyang] Searching for "Cisco-IOS-XR-types" in /root/ydk-py/cisco-ios-xr/ydk/models/cisco_ios_xr/_yang.
[libyang] Searching for "Cisco-IOS-XR-types" in /root/ydk-py/cisco-ios-xr/ydk/models/cisco_ios_xr/_yang/ietf@0.1.5-post2.
[libyang] Searching for "Cisco-IOS-XR-types" in /root/ydk-py/pathapi-taran.
[libyang] Loading schema from "/root/ydk-py/cisco-ios-xr/ydk/models/cisco_ios_xr/_yang/Cisco-IOS-XR-types.yang" file.
[libyang] Module "Cisco-IOS-XR-types@2018-06-29" successfully parsed as implemented.
[libyang] Resolving "Cisco-IOS-XR-ifmgr-cfg" unresolved schema nodes and their constraints...
[libyang] All "Cisco-IOS-XR-ifmgr-cfg" schema nodes and constraints resolved.
[libyang] Module "Cisco-IOS-XR-ifmgr-cfg@2017-09-07" successfully parsed as implemented.
[libyang] Module "Cisco-IOS-XR-cdp-cfg@2017-08-16" successfully parsed as implemented.
Added new libyang module 'Cisco-IOS-XR-cdp-cfg'
Populating new module schema 'Cisco-IOS-XR-cdp-cfg'
Populating augmented schema node 'cdp'
Populating new schema node 'cdp'
Looking to populate schemas for 'Cisco-IOS-XR-cdp-cfg:cdp/timer'
Getting new modules for path 'Cisco-IOS-XR-cdp-cfg:cdp/timer'
Loading module 'Cisco-IOS-XR-cdp-cfg', revision ''
The module 'Cisco-IOS-XR-cdp-cfg' schema has already been populated in YDK repository
Looking to populate schemas for '60'
Getting new modules for path '60'
Creating root data node with path '/Cisco-IOS-XR-cdp-cfg:cdp'
Populating schema for 'timer'
Looking to populate schemas for 'timer'
Getting new modules for path 'timer'
Creating node 'timer' with value ''
Current path: /Cisco-IOS-XR-cdp-cfg:cdp
Top container path: Cisco-IOS-XR-cdp-cfg:cdp
Populating schema for 'timer'
Looking to populate schemas for 'timer'
Getting new modules for path 'timer'
Getting child schema with path 'timer' in /Cisco-IOS-XR-cdp-cfg:cdp
Getting data nodes with path 'timer'
Creating new data path 'timer' with value '' in 'cdp'
Data is invalid according to the yang model. Libyang error: Invalid value "" in "timer" element. Path: '/Cisco-IOS-XR-cdp-cfg:cdp/timer'
Traceback (most recent call last):
  File "bugtest.py", line 18, in <module>
    datanode = root_schema.create_datanode(xpath, value)
RuntimeError: YModelError: Invalid value "" in "timer" element. Path: /Cisco-IOS-XR-cdp-cfg:cdp/timer

System Information


ydk (0.8.3)
docker run -it ydkdev/ydk-py
ygorelik commented 4 years ago

Resolved in YDK-0.8.5.