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

如何在YANG中建模无键嵌套列表配置数据

解决YANG中无键列表嵌套的问题

我完全懂你的困扰——YANG的规则就是这么“死板”,配置列表必须指定键,但你的原配置里的ACL规则就是无键的有序列表,直接建模的话总会多出不必要的字段。结合你的ACL场景,给你几个实用的解决方案:

1. 用隐式位置索引作为键(最适配复杂规则场景)

既然YANG必须要键,那我们可以加一个自动生成的位置索引作为规则列表的键,同时通过工具层的转换让用户完全感知不到它的存在。

比如你的YANG模型可以这么写:

module acl-config {
  namespace "urn:example:acl";
  prefix acl;
  import inet { prefix inet; }

  container acls {
    // 顶层ACL列表,用名称作为键(匹配你的用户命名ACL)
    list acl {
      key "name";
      leaf name { 
        type string; 
        description "User-defined ACL name (e.g., acl1, acl2)";
      }

      // 规则列表,用位置索引作为隐式键
      list rule {
        key "position";
        ordered-by user; // 强制保持用户配置的规则顺序,不自动排序

        leaf position {
          type uint32;
          description "Auto-generated index for rule ordering (hidden from user)";
        }

        // 你的规则字段,比如源地址、动作
        leaf source { 
          type inet:ip-prefix; 
          description "Source IP prefix for the rule";
        }
        leaf action { 
          type enumeration {
            enum permit;
            enum deny;
          }
          description "Action to take for matching traffic";
        }
      }
    }
  }
}

怎么落地?

  • 导入原配置时,让工具自动给每个规则分配递增的position值(比如第一个规则是1,第二个是2),用户不需要手动输入。
  • 导出配置时,过滤掉position字段,让用户看到的还是无键的规则列表。
  • ordered-by user保证规则的顺序和用户配置的完全一致,不会被YANG工具重新排序。

2. 用leaf-list(适合简单规则场景)

如果你的ACL规则只是单一值(比如一串规则字符串、单个IP),完全可以用leaf-list替代list——它天生就是有序的无键列表,不需要指定键,完美匹配你的需求。

示例模型:

module acl-config {
  namespace "urn:example:acl";
  prefix acl;

  container acls {
    list acl {
      key "name";
      leaf name { type string; }

      // 用leaf-list代替无键list,适合简单规则
      leaf-list rule {
        type string;
        ordered-by user;
        description "Simple ACL rule strings";
      }
    }
  }
}

这种方案不需要任何额外的键字段,直接就能映射你的无键规则列表,缺点是只能支持单一值的规则,没法处理复杂结构的规则(比如同时有源地址和动作的情况)。

为什么会出现额外字段?

你提到的“有效数据文件有YANG要求但原配置没有的额外字段”,本质就是YANG强制列表必须有键,而你的原配置没有对应字段,所以模型生成的数据会自动补上这个键字段。用上面的两种方案,要么用不需要键的leaf-list,要么把键字段做成自动生成且隐藏的,就能解决这个问题。


内容的提问来源于stack exchange,提问作者alshaboti

火山引擎 最新活动