Closed tdesh10 closed 2 years ago
Fixed this error handling in Libyang.
Please recompile and reinstall YDK C++ and Python core components to address the issue.
Here is the test script:
from ydk.path import Repository, Capability, Codec
from ydk.types import EncodingFormat
import logging
import sys
incorrect_xml = """
<interfaces xmlns="http://cisco.com/ns/yang/Cisco-IOS-XR-um-interface-cfg">
<interfacez>
<interface-name>Loopback0</interface-name>
<description>interface description</description>
<ipv4z>
<addresses xmlns="http://cisco.com/ns/yang/Cisco-IOS-XR-um-if-ip-address-cfg">
<address>
<address>172.16.255.101</address>
<netmask>255.255.255.255</netmask>
</address>
</addresses>
</ipv4z>
</interfacez>
</interfaces>"""
def enable_logging(level):
log = logging.getLogger('ydk')
log.setLevel(level)
handler = logging.StreamHandler()
formatter = logging.Formatter(
"%(asctime)s - %(name)s - %(levelname)s - %(message)s")
handler.setFormatter(formatter)
log.addHandler(handler)
def perform_operation(root, payload):
codec = Codec()
try:
data_node = codec.decode(root, payload, EncodingFormat.XML)
print("Correctly decoded payload to DataNode object")
except RuntimeError as err:
print("Exception occurred %s" % err)
if __name__ == '__main__':
enable_logging(logging.INFO)
repo = Repository("pavarotti")
lookup_table = {'http://cisco.com/ns/yang/Cisco-IOS-XR-um-interface-cfg': Capability('Cisco-IOS-XR-um-interface-cfg', ''),
'http://cisco.com/ns/yang/Cisco-IOS-XR-um-if-ip-address-cfg': Capability('Cisco-IOS-XR-um-if-ip-address-cfg', ''),
}
capabilities = [Capability('Cisco-IOS-XR-um-interface-cfg', ''),
Capability('Cisco-IOS-XR-um-if-ip-address-cfg', ''),
]
root_schema = repo.create_root_schema(lookup_table, capabilities)
perform_operation(root_schema, incorrect_xml)
And run results:
2020-10-29 17:26:11,271 - ydk - ERROR - Data is invalid according to the yang model. Libyang error: Unknown element "interfacez". Path: '/Cisco-IOS-XR-um-interface-cfg:interfaces'
2020-10-29 17:26:11,272 - ydk - ERROR - Parsing failed with message Unknown element "interfacez".
Exception occurred YCoreError: YCodecError:Unknown element "interfacez".. Path: /Cisco-IOS-XR-um-interface-cfg:interfaces
Process finished with exit code 0
Please Note. Due to issue #998, all operations on DataNode objects must be separated from RootSchemaNode object. That is why the decode operation is isolated in a function _performoperation().
Expected Behavior
If an XML payload contains an error in a leaf, list, or a container,
ydk.path.code.decode()
should throw an exception.Current Behavior
If an XML payload contains an error in a leaf, list, or a container,
ydk.path.code.decode()
does not throw an exception.Steps to Reproduce
Run my script below using this directory as Repository: pavarotti.zip
pyang output of
Cisco-IOS-XR-um-interface-cfg.yang
andCisco-IOS-XR-um-if-ip-address-cfg.yang
:Your Script
Logs
Enable logging and post the logs below
System Information
Python 3.5.2 in the ydk docker container, using ydk (0.8.5).