You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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,提问作者Евгений Дружинин

火山引擎 最新活动