YANG模型中如何基于其他leaf节点值计算设置leaf节点的默认值?
YANG模型中如何基于其他leaf节点值计算设置leaf节点的默认值?
嗨,这个问题我之前也碰到过,其实核心是YANG的default语句有个容易踩的坑——它只能接受固定的字面量值,不能引用其他节点或者写表达式计算,这就是你之前代码报错的原因:"base-port + 100"不是合法的uint16类型字面量,不符合YANG对默认值的类型要求。
那怎么实现你想要的“remote-port默认值为base-port+100”的需求呢?这里有两个可行的思路:
方案一:用YANG约束配合设备业务逻辑(推荐,符合标准YANG规范)
YANG本身不支持动态计算默认值,但我们可以通过约束保证配置的合法性,同时让设备的配置管理模块在用户未指定remote-port时自动计算填充。
修改后的YANG代码如下:
module internet-module { yang-version 1.1; namespace "elements:space"; prefix im; container elements { list net-parameters { key base-port; leaf base-port { type uint16; mandatory true; description "Base Port number"; } leaf remote-port { type uint16; description "Remote port number (defaults to base-port + 100 if not specified)"; // 添加约束:如果用户手动指定remote-port,必须等于base-port+100 must ". = ../base-port + 100" { error-message "Remote port must be equal to base-port plus 100"; } } } } }
关键修改点说明:
- 去掉了remote-port的
mandatory true:这样用户可以不提供这个值,留给设备自动填充 - 添加
must约束:确保如果用户手动设置了remote-port,必须符合base-port+100的规则,避免非法配置 - 调整description:明确告知使用者这个节点的默认行为
接下来需要你在设备的配置处理逻辑中做补充:当用户提交的配置里没有remote-port时,自动读取base-port的值,加上100后填充到remote-port字段中。
方案二:使用厂商自定义YANG扩展(仅适用于特定设备)
有些网络设备厂商会提供自定义的YANG扩展,支持动态计算属性值(比如引用其他节点做运算),但这属于非标准特性,不同厂商的实现语法不一样,通用性较差,所以一般不推荐这种方案。
总结一下:标准YANG本身不支持动态引用其他节点作为默认值,必须结合设备侧的业务逻辑来实现自动计算,同时用YANG约束来保证配置的合法性。
备注:内容来源于stack exchange,提问作者Евгений Дружинин




