Closed hyberdk closed 1 year ago
Please consider this piece of code before the actual decode as a workaround:
acl = xe_native.Native.Ip.AccessList.Extended()
acl.name = "TEST_TEST"
native = xe_native.Native()
native.ip.access_list.extended.append(acl)
json = codec.encode(codec_provider, native)
Built test case in C++ and reproduced the issue:
#include <iostream>
#include <spdlog/spdlog.h>
#include <ydk/codec_service.hpp>
#include <ydk/codec_provider.hpp>
#include <ydk_cisco_iosxe_demo/Cisco_IOS_XE_native.hpp>
using namespace ydk;
using namespace std;
string json_payload = R"(
{
"Cisco-IOS-XE-native:native":
{
"ip":
{
"access-list":
{
"Cisco-IOS-XE-acl:extended":
[
{
"name": "TEST_TEST",
"access-list-seq-rule":
[
{
"sequence": "10",
"ace-rule": {
"action": "permit",
"protocol": "tcp"
}
}
]
}
]
}
}
}
}
)";
int main(int argc, char* argv[])
{
auto logger = spdlog::stdout_color_mt("ydk");
logger->set_level(spdlog::level::debug);
CodecService codec{};
CodecServiceProvider xml_provider(EncodingFormat::XML);
CodecServiceProvider json_provider(EncodingFormat::JSON);
auto top = make_shared<cisco_iosxe_demo::Cisco_IOS_XE_native::Native>();
auto model = codec.decode(json_provider, json_payload, top);
auto xml = codec.encode(xml_provider, *model, true);
cout << json << endl;
return 0;
}
Found and fixed the bug. After the fix applied getting expected result:
[2023-09-07 08:23:32.134] [ydk] [info] Performing encode operation, resulting in <native xmlns="http://cisco.com/ns/yang/Cisco-IOS-XE-native">
<ip>
<access-list>
<extended xmlns="http://cisco.com/ns/yang/Cisco-IOS-XE-acl">
<name>TEST_TEST</name>
<access-list-seq-rule>
<sequence>10</sequence>
<ace-rule>
<action>permit</action>
<protocol>tcp</protocol>
</ace-rule>
</access-list-seq-rule>
</extended>
</access-list>
</ip>
</native>
Got the same result in Python API with original script (slightly modified):
from ydk.services import CodecService
from ydk.providers import CodecServiceProvider
import logging
import os
if __name__ == "__main__":
logger = logging.getLogger("ydk")
logger.setLevel(logging.INFO)
handler = logging.StreamHandler()
formatter = logging.Formatter("%(asctime)s - %(name)s - "
"%(levelname)s - %(message)s")
handler.setFormatter(formatter)
logger.addHandler(handler)
if os.path.exists('ydk.log'):
with open('ydk.log', 'w'):
pass
codec_provider = CodecServiceProvider(type='json')
codec = CodecService()
json = '''
{
"Cisco-IOS-XE-native:native":
{
"ip":
{
"access-list":
{
"Cisco-IOS-XE-acl:extended":
[
{
"name": "TEST_TEST",
"access-list-seq-rule":
[
{
"sequence": "10",
"ace-rule": {
"action": "permit",
"protocol": "tcp"
}
}
]
}
]
}
}
}
}
'''
decoded = codec.decode(codec_provider, json)
print(codec.encode(codec_provider, decoded))
Result:
/Users/ygorelik/venv3.10/bin/python3 /Users/ygorelik/ydk-gen/scripts/issues/1089/xe-native-access-list.py
{
"Cisco-IOS-XE-native:native": {
"ip": {
"access-list": {
"Cisco-IOS-XE-acl:extended": [
{
"name": "TEST_TEST",
"access-list-seq-rule": [
{
"sequence": "10",
"ace-rule": {
"action": "permit",
"protocol": "tcp"
}
}
]
}
]
}
}
}
}
Process finished with exit code 0
Hence closing the issue.
Issue tracker is ONLY used for reporting bugs. Please use the YDK Community for any support issues.
Expected Behavior
I should be able to decode a json blob with an access-list
Current Behavior
I can only decode the test_test access list json blob, if I have "encoded" an access-list before with the same name,
Steps to Reproduce
json = codec.encode(codec_provider, native)
and run it again, now it fails..Your Script
Logs
Enable logging and post the logs below (note that the link does not work!) See #1088
logs are attached as files.. ydk.log ydk-ok.log
System Information