You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 02:23:32