如何在YANG模型中验证仅能修改两个leaf中的一个值
禁止单次操作同时修改两个leaf的YANG约束实现
针对需求——禁止用户在单次操作中同时修改value1和value2两个leaf,可以通过YANG的must语句结合Tail-f(Cisco NSO)扩展的tailf:changed()函数实现,以下是具体方案:
方案1:在每个leaf上添加约束
leaf value1 { tailf:info "value1"; type integer; mandatory true; must "not (tailf:changed(.) and tailf:changed(../value2))" { error-message "不能同时修改value1和value2,请分两次操作分别修改"; } } leaf value2 { tailf:info "value2"; type integer; mandatory true; must "not (tailf:changed(.) and tailf:changed(../value1))" { error-message "不能同时修改value1和value2,请分两次操作分别修改"; } }
方案2:在父容器级别添加约束(更简洁)
如果两个leaf属于同一个容器,推荐在容器层面添加一次约束即可:
container my-config { must "not (tailf:changed(value1) and tailf:changed(value2))" { error-message "不能同时修改value1和value2,请分两次操作分别修改"; } leaf value1 { tailf:info "value1"; type integer; mandatory true; } leaf value2 { tailf:info "value2"; type integer; mandatory true; } }
原理说明
tailf:changed(path)是Tail-f/NSO提供的扩展函数,用于检查指定节点是否在当前编辑操作中被修改。must语句的逻辑是禁止两个leaf同时被修改:当value1和value2在同一次操作中都被修改时,tailf:changed(value1)和tailf:changed(value2)都会返回true,此时not (A and B)不成立,触发错误提示,终止当前操作。- 该约束不会影响初始配置(因为初始配置是创建而非修改操作),也允许分多次操作分别修改两个leaf。
注意事项
tailf:changed()是Tail-f/NSO特有的扩展,如果使用其他NETCONF服务器,需参考对应厂商的文档,使用类似的扩展函数(比如某些平台支持ietf-yang:changed()或自定义扩展)来实现相同逻辑。
内容的提问来源于stack exchange,提问作者Ayush Goyal
相关产品推荐
相关产品推荐

