cancel
Showing results for 
Search instead for 
Did you mean: 
cancel
230
Views
0
Helpful
7
Replies
Highlighted
Cisco Employee

How do I get default value for a leaf?

Hello,

as per subject, I'd like to know what's the default value of a leaf as per YANG definition. In example:

leaf my-leaf {
  type my-cfg:my-leaf-type;
  default "this-is-the-default-value";
  description "whatever";
}

I'd like to recover "this-is-the-default-value" string using the python APIs. I expected something like:

My-Model.my_cfg.my_leaf.get_default_value()

Thanks for the help.

Val

1 ACCEPTED SOLUTION

Accepted Solutions
Highlighted

The leaf default values are available in the underlying Libyang library, but not exposed to YDK classes and API. New development is needed to add this feature. At this point I don't see any workaround and suggest you to open enhancement request in ydk-gen GitHub.

Yan Gorelik
YDK Solutions

View solution in original post

7 REPLIES 7
Highlighted

You can refer to YDK python API document.

Jacky Zhang
Global Telecom
Highlighted

module.container.list.leaf

Jacky Zhang
Global Telecom
Highlighted

Hello thanks for the reply, but I can't find anything useful.

In the autogenerated code I can see something like:

 

.. attribute:: broadcast_ssid

broadcast SSID on a WLAN
**type**\: bool

**default value**\: true

 

But I need something to recover the default value programmatically.

Highlighted

The leaf default values are available in the underlying Libyang library, but not exposed to YDK classes and API. New development is needed to add this feature. At this point I don't see any workaround and suggest you to open enhancement request in ydk-gen GitHub.

Yan Gorelik
YDK Solutions

View solution in original post

Highlighted

Hi Yan,

I'll create the request on GitHub. In the meantime I'm using the following workaround:

def get_yang_default_value(yang_def, name):
    doc = re.sub(r'^[\s\S]*?\.\. attribute::', '.. attribute::', yang_def.__doc__)
    if doc is not None:
        for part in doc.split(".. attribute:: "):
            lines = part.splitlines()
            if len(lines) > 0 and lines[0].replace(" (key)", "") == name:
                for line in lines:
                    if "**default value**\: " in line:
                        matches = re.match(r'[\s\S]*?\*\*default value\*\*\\: (.*)', line)
                        if matches is not None and len(matches.groups()) == 1:
                            return matches.group(1)
                return None
        raise ValueError(name)
    raise ValueError(yang_def)
this you can call like:
default_value = get_yang_default_value(Cisco_IOS_XE_wireless_wlan_cfg.WlanCfgData.WlanCfgEntries.WlanCfgEntry, "wep_key_format")

Extra logic is needed to also cast to the right type. 

Highlighted

This approach maybe good for your specific task, but it is not acceptable from the YDK as generic. The reason - the node name can appear multiple times in different branches of the model tree. Simple examples are nodes with name "state", "config", "data" etc. There is no need to "invent wheels". We just have to employ currently available and stable libyang API and expose it to YDK API.

Yan Gorelik
YDK Solutions
Highlighted

Sure, I totally agree with you. I shared the code in case someone gets blocked because of this and needs a quick workaround until we get YDK supporting default values. I was thinking to look into YDK/pyang to propose a proper PR for this purpose, but I'm getting busy on other things so no promise.

This widget could not be displayed.