Coder Social home page Coder Social logo

Comments (2)

ygorelik avatar ygorelik commented on May 28, 2024

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)

from ydk-gen.

ygorelik avatar ygorelik commented on May 28, 2024

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.

from ydk-gen.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.