<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: Converting data model to valid yang output in Tools</title>
    <link>https://community.cisco.com/t5/tools/converting-data-model-to-valid-yang-output/m-p/4499136#M1404</link>
    <description>&lt;P&gt;Hello Yan,&lt;/P&gt;&lt;P&gt;(I'm really new to this stuff first and foremost!)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Well that's basically my question, how do I leave this key out for just once?&lt;BR /&gt;I want to keep my IAC model consistent.&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;P&gt;Is there some tool that can go from my data model and leave out these keys if they are empty?&lt;BR /&gt;Or should this all be programmatic logic?&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;P&gt;Basically the question is how do I go from my data model to the correct yang/json output?&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;So far I came up with something like this:&lt;/P&gt;&lt;PRE&gt;class Yang_ios_acl:
    def __init__(self, aclnr):
        self.yangmodel = {
            "Cisco-IOS-XE-acl:standard": {
                "name": aclnr,
                "access-list-seq-rule": []
                }
            }
        self.yangacllist = {}
        self.action = ""


    def __str__(self):
        return json.dumps(self.yangmodel, indent=4)


    def add_list(self):
        self.yangmodel['Cisco-IOS-XE-acl:standard']['access-list-seq-rule'].append(self.yangacllist)
        self.yangacllist = {}


    def add_action(self, action):
        self.action = action
        self.yangacllist.update(
            {
                action:{"std-ace":{}}
            }
        )


    def add_ip(self, ip):
        try:
            self.yangacllist[self.action]["std-ace"].update(
                {
                    "ipv4-prefix": ip
                }
            )
        except KeyError:
            print("You first need to add an action before adding IP!")
            exit()


    def add_mask(self, mask):
        try:
            self.yangacllist[self.action]["std-ace"].update(
                {
                    "mask": mask
                }
            )
        except KeyError:
            print("You first need to add an action before adding IP!")
            exit()

    def add_remark(self, remark):
        self.yangacllist.update(
            {
                "remark":remark
            }
        )


    def add_seq(self, seq):
        self.yangacllist.update(
            {
                "sequence":seq
            }
        )&lt;/PRE&gt;&lt;P&gt;I'm using a class to fill this, but I'm just wondering if my approach is correct?&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Kr,&lt;BR /&gt;Dennis van Leeuwen&lt;/P&gt;</description>
    <pubDate>Sun, 07 Nov 2021 12:52:07 GMT</pubDate>
    <dc:creator>denvle</dc:creator>
    <dc:date>2021-11-07T12:52:07Z</dc:date>
    <item>
      <title>Converting data model to valid yang output</title>
      <link>https://community.cisco.com/t5/tools/converting-data-model-to-valid-yang-output/m-p/4499019#M1402</link>
      <description>&lt;P&gt;Hello everyone,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I'm quite new to this and I'm wondering how you guys convert your own data model to a valid yang data model that you can send to the device?&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;My problem is that in your own data model "IAC" you have this file to configure an ACL:&lt;/P&gt;&lt;PRE&gt;acls:[
  {"ip": "10.1.0.190", "mask": ""},
  {"ip": "172.30.176.0", "mask": "0.0.15.255"}
]&lt;/PRE&gt;&lt;P&gt;Now you want to convert this to a valid YANG/json format.&lt;BR /&gt;&lt;BR /&gt;The thing is the yang/json format doesn't accept empty keys&lt;/P&gt;&lt;P&gt;How do you convert this without writing a lot of code?&lt;/P&gt;&lt;P&gt;You can see that in my example I have an empty string for the mask.&lt;BR /&gt;But in the valid yang/json you can't send the key&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;{
    "Cisco-IOS-XE-acl:standard": {
        "name": 61,
        "access-list-seq-rule": [
            {
                "sequence": "10",
                "permit": {
                    "std-ace": {
                        "ipv4-prefix": "10.1.0.190"
                    }
                }
            },
            {
                "sequence": "20",
                "permit": {
                    "std-ace": {
                        "ipv4-prefix": "172.30.176.0",
                        "mask": "0.0.15.255"
                    }
                }
            },&lt;/PRE&gt;&lt;P&gt;Thanks in advance for setting me in the right direction!&lt;/P&gt;</description>
      <pubDate>Sat, 06 Nov 2021 20:27:16 GMT</pubDate>
      <guid>https://community.cisco.com/t5/tools/converting-data-model-to-valid-yang-output/m-p/4499019#M1402</guid>
      <dc:creator>denvle</dc:creator>
      <dc:date>2021-11-06T20:27:16Z</dc:date>
    </item>
    <item>
      <title>Re: Converting data model to valid yang output</title>
      <link>https://community.cisco.com/t5/tools/converting-data-model-to-valid-yang-output/m-p/4499043#M1403</link>
      <description>&lt;P&gt;Based on the YANG model&lt;/P&gt;&lt;PRE&gt;&lt;SPAN&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;grouping ipv4-std-ace-grouping {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&lt;SPAN class=""&gt;&amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;container std-ace {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&lt;SPAN class=""&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;choice source-choice {&lt;/SPAN&gt;&lt;BR /&gt;&lt;STRONG&gt;&lt;SPAN class=""&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;case ipv4-prefix-case {&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;&lt;SPAN class=""&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;leaf ipv4-prefix {&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;&lt;SPAN class=""&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;type ios-types:ipv4-host;&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;&lt;SPAN class=""&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;}&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;&lt;SPAN class=""&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;leaf mask {&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;&lt;SPAN class=""&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;type inet:ipv4-address;&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;&lt;SPAN class=""&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;}&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;&lt;SPAN class=""&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;}&lt;/STRONG&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&lt;SPAN class=""&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;case any-case {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&lt;SPAN class=""&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;leaf any {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&lt;SPAN class=""&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;description&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&lt;SPAN class=""&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;"Any source prefix";&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&lt;SPAN class=""&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;type empty;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&lt;SPAN class=""&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&lt;SPAN class=""&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&lt;SPAN class=""&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;case host-case {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&lt;SPAN class=""&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;leaf host {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&lt;SPAN class=""&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;description&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&lt;SPAN class=""&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;"A single source host";&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&lt;SPAN class=""&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;type ios-types:ipv4-host;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&lt;SPAN class=""&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&lt;SPAN class=""&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&lt;SPAN class=""&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&lt;SPAN class=""&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;uses ace-log-grouping;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&lt;SPAN class=""&gt;&amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;}&lt;/SPAN&gt;&lt;/PRE&gt;&lt;P&gt;The 'mask' is not a mandatory leaf, so it is not necessary to include it to the configuration. But if you include it, you should follow its type format 'inet:ipv4-address':&lt;/P&gt;&lt;PRE&gt;&lt;SPAN&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;typedef ipv4-address {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&lt;SPAN class=""&gt;&amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;type string {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&lt;SPAN class=""&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;pattern&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&lt;SPAN class=""&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;'(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}'&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&lt;SPAN class=""&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;+&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;'([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])'&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&lt;SPAN class=""&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;+ '(%[\p{N}\p{L}]+)?';&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&lt;SPAN class=""&gt;&amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;}&lt;BR /&gt;  }&lt;/SPAN&gt;&lt;/PRE&gt;&lt;P&gt;Based on that definition the mask cannot be an empty string!&lt;/P&gt;</description>
      <pubDate>Sun, 07 Nov 2021 01:03:54 GMT</pubDate>
      <guid>https://community.cisco.com/t5/tools/converting-data-model-to-valid-yang-output/m-p/4499043#M1403</guid>
      <dc:creator>yangorelik</dc:creator>
      <dc:date>2021-11-07T01:03:54Z</dc:date>
    </item>
    <item>
      <title>Re: Converting data model to valid yang output</title>
      <link>https://community.cisco.com/t5/tools/converting-data-model-to-valid-yang-output/m-p/4499136#M1404</link>
      <description>&lt;P&gt;Hello Yan,&lt;/P&gt;&lt;P&gt;(I'm really new to this stuff first and foremost!)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Well that's basically my question, how do I leave this key out for just once?&lt;BR /&gt;I want to keep my IAC model consistent.&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;P&gt;Is there some tool that can go from my data model and leave out these keys if they are empty?&lt;BR /&gt;Or should this all be programmatic logic?&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;P&gt;Basically the question is how do I go from my data model to the correct yang/json output?&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;So far I came up with something like this:&lt;/P&gt;&lt;PRE&gt;class Yang_ios_acl:
    def __init__(self, aclnr):
        self.yangmodel = {
            "Cisco-IOS-XE-acl:standard": {
                "name": aclnr,
                "access-list-seq-rule": []
                }
            }
        self.yangacllist = {}
        self.action = ""


    def __str__(self):
        return json.dumps(self.yangmodel, indent=4)


    def add_list(self):
        self.yangmodel['Cisco-IOS-XE-acl:standard']['access-list-seq-rule'].append(self.yangacllist)
        self.yangacllist = {}


    def add_action(self, action):
        self.action = action
        self.yangacllist.update(
            {
                action:{"std-ace":{}}
            }
        )


    def add_ip(self, ip):
        try:
            self.yangacllist[self.action]["std-ace"].update(
                {
                    "ipv4-prefix": ip
                }
            )
        except KeyError:
            print("You first need to add an action before adding IP!")
            exit()


    def add_mask(self, mask):
        try:
            self.yangacllist[self.action]["std-ace"].update(
                {
                    "mask": mask
                }
            )
        except KeyError:
            print("You first need to add an action before adding IP!")
            exit()

    def add_remark(self, remark):
        self.yangacllist.update(
            {
                "remark":remark
            }
        )


    def add_seq(self, seq):
        self.yangacllist.update(
            {
                "sequence":seq
            }
        )&lt;/PRE&gt;&lt;P&gt;I'm using a class to fill this, but I'm just wondering if my approach is correct?&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Kr,&lt;BR /&gt;Dennis van Leeuwen&lt;/P&gt;</description>
      <pubDate>Sun, 07 Nov 2021 12:52:07 GMT</pubDate>
      <guid>https://community.cisco.com/t5/tools/converting-data-model-to-valid-yang-output/m-p/4499136#M1404</guid>
      <dc:creator>denvle</dc:creator>
      <dc:date>2021-11-07T12:52:07Z</dc:date>
    </item>
    <item>
      <title>Re: Converting data model to valid yang output</title>
      <link>https://community.cisco.com/t5/tools/converting-data-model-to-valid-yang-output/m-p/4499202#M1405</link>
      <description>&lt;P&gt;Hi Dennis&lt;/P&gt;&lt;P&gt;In my opinion you need to add verifications for IP address and mask values, before you are updating the yangacllist. This is critical, because the values must comply with the patterns defined in the YANG model. Obviously, the empty string does not comply with the pattern, so it will never gets into configuration.&lt;/P&gt;</description>
      <pubDate>Sun, 07 Nov 2021 17:51:34 GMT</pubDate>
      <guid>https://community.cisco.com/t5/tools/converting-data-model-to-valid-yang-output/m-p/4499202#M1405</guid>
      <dc:creator>yangorelik</dc:creator>
      <dc:date>2021-11-07T17:51:34Z</dc:date>
    </item>
    <item>
      <title>Re: Converting data model to valid yang output</title>
      <link>https://community.cisco.com/t5/tools/converting-data-model-to-valid-yang-output/m-p/4500026#M1406</link>
      <description>&lt;P&gt;Thanks for the help Yan!&lt;/P&gt;&lt;P&gt;I'm happy, except for the validation in the modules in my classes my basic idea is correct.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Kind regards,&lt;BR /&gt;Dennis van Leeuwen&lt;/P&gt;</description>
      <pubDate>Tue, 09 Nov 2021 10:36:52 GMT</pubDate>
      <guid>https://community.cisco.com/t5/tools/converting-data-model-to-valid-yang-output/m-p/4500026#M1406</guid>
      <dc:creator>denvle</dc:creator>
      <dc:date>2021-11-09T10:36:52Z</dc:date>
    </item>
  </channel>
</rss>

