YANG:如何指定复杂的typedef

时间:2017-10-16 16:53:58

标签: opendaylight ietf-netmod-yang

我正在学习杨。我想要一个由Uri和IpAddress列表组成的typedef。所以我尝试了以下内容:

  typedef mapping {
      type union {

                type inet:uri;

                 list addresses {
                     type inet:IpAddress;
                 }
         }
    }

我后来想在容器中使用这个定义的类型。但上面的定义给了我一个编译错误。 YANG typedef是否类似于c ++ typedef?我怎样才能在YANG中定义这样的结构?

1 个答案:

答案 0 :(得分:2)

根据您的描述,在我看来,您似乎想要创建一个具有两个字段的结构的可重用定义:单个uriaddresses列表。这项工作的最佳工具是YANG's grouping。 RFC表示"分组就像一个"结构"或者记录"在传统的编程语言中#34;以下分组应该是您正在寻找的:

grouping mapping {
   leaf uri {
     type inet:uri;
   }
   list address {
     type inet:IpAddress;
   }
 }

然后,您可以通过以下示例中的the uses statement引用此类grouping

container specific_mapping {
    uses mapping;
}

list my_mapping {
    key "uri";
    uses mapping;
}

以下实例文档与上述内容兼容:

<specific_mapping>
    <uri>some uri</uri>
    <address>address 1</address>
    <address>address 2</address>
</specific_mapping>

<my_mapping>
    <uri>some uri</uri>
    <address>address 1</address>
    <address>address 2</address>
</my_mapping>
<my_mapping>
    <uri>other uri</uri>
    <address>address 3</address>
    <address>address 4</address>
</my_mapping>

typedef声明在YANG 1.1的this section中有解释。 RFC 7950.它用于指定单个叶的类型,因此不能用于创建您想要的结构。使用typedef时,您可以为该类型定义所有可能值的集合。这称为值空间。您尝试使用的union built-in type旨在合并其中列出的类型的值空间。 list不是类型,因此无法在那里使用。