Hi Experts.
Im trying to use YDK-GEN to convert JSON "config" into NetConf XML format to send to my router and switches. My plan is to use a combination of "code" and some jinja2 templating depending on the complexity of the config (and how standardized it is between my devices). Anyways, I would like to describe some of my code as jinja in json format, but I would really like to be able to have some parts use the "operation=merge" and some "operation=replace" option.
here is the code I am using.
from ydk.filters import YFilter
from ydk.services import CodecService
from ydk.providers import CodecServiceProvider
import logging
if __name__ == "__main__":
logger = logging.getLogger("ydk")
logger.setLevel(logging.WARNING)
handler = logging.StreamHandler()
formatter = logging.Formatter(("%(asctime)s - %(name)s - "
"%(levelname)s - %(message)s"))
handler.setFormatter(formatter)
logger.addHandler(handler)
json_codec_provider = CodecServiceProvider(type='json')
xml_codec_provider = CodecServiceProvider(type='xml')
codec = CodecService()
with open("test_test.json", "r") as f:
json_data = f.read()
blah = codec.decode(json_codec_provider, json_data)
blah.ip.access_list.extended["TEST_TEST"].yfilter = YFilter.replace
print(codec.encode(json_codec_provider, blah, subtree=True))
print(codec.encode(xml_codec_provider, blah, subtree=True))
The output I am getting looks like this:
{
"Cisco-IOS-XE-native:native": {
"ip": {
"access-list": {
"Cisco-IOS-XE-acl:extended": [
{
"access-list-seq-rule": [
{
"ace-rule": {
"action": "permit",
"any": null,
"dst-any": null,
"protocol": "ospf"
},
"sequence": 5
}
],
"name": "TEST_TEST"
},
{
"access-list-seq-rule": [
{
"ace-rule": {
"action": "deny",
"any": null,
"dst-any": null,
"protocol": "udp"
},
"sequence": 10
}
],
"name": "TEST_TEST2"
}
]
}
}
}
}
<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" operation="replace">
<name>TEST_TEST</name>
<access-list-seq-rule>
<sequence>5</sequence>
<ace-rule>
<action>permit</action>
<protocol>ospf</protocol>
<any/>
<dst-any/>
</ace-rule>
</access-list-seq-rule>
</extended>
<extended xmlns="http://cisco.com/ns/yang/Cisco-IOS-XE-acl">
<name>TEST_TEST2</name>
<access-list-seq-rule>
<sequence>10</sequence>
<ace-rule>
<action>deny</action>
<protocol>udp</protocol>
<any/>
<dst-any/>
</ace-rule>
</access-list-seq-rule>
</extended>
</access-list>
</ip>
</native>
as you can see the JSON does not have any notation of the NetConf operation, but the XML output has on the TEST_TEST access-list but not on the TEST_TEST2 ACL..
I guess this is "sorta" by design, but I was hoping that someone had input on how to put the operation into the JSON data or if there was some other cleaver way of marking some of the json data as operation replace and some as merge?
I hope it makes sense..
Thanks a lot for your inpurt
Esben