你能在杨模式中拥有自定义属性吗?

时间:2015-06-18 16:03:49

标签: parsing schema ietf-netmod-yang

我想知道我们是否可以在其中一个元素leaf,list等中定义自定义字段或属性。例如:这可能吗?如果可能的话,我们如何定义这些字段。

model Animal{

  leaf amphibian{
      type String;
      custom "Frog";     // Custom field which has a value "Frog"
   }
}

1 个答案:

答案 0 :(得分:2)

"属性"如同一个新的YANG关键字"

如果通过"属性"你指的是一个新的YANG关键词,对你有特殊意义,然后是。 YANG支持扩展。来自RFC6020

  

"扩展" statement允许定义新语句      在杨语中。这个新的语句定义可以      由其他模块导入和使用。

     

语句的参数是一个标识符,它是新的关键字      扩展名,后面必须跟一个子语句块      持有详细的扩展信息。 "扩展"的目的      statement是定义一个关键字,以便可以导入和使用它      通过其他模块。

     

扩展名可以像普通的YANG语句一样使用      语句名称后跟一个参数(如果由...定义)      扩展和可选的子语句块。声明的声明      name是通过组合模块的前缀来创建的      已定义扩展名,冒号(":")和扩展名的关键字,      没有交错的空白。

extension custom {
  argument object;
  description "A new YANG keyword that carries special semantics.";
}

prefix:custom "Frog"; // usage of an extension

上例中的argument关键字是extension关键字的可选子语句,用于指示新关键字采用(强制)参数(字符串,例如{{1 }})。

  

"参数"声明,可选,作为参数a      string是关键字参数的名称。如果不      参数声明存在,关键字期望没有参数      它被使用了。   7.17.2

为什么需要new关键字的命名参数? YANG可以映射到YIN,表示为XML的替代语法,这个名称变得很重要。

  

参数的名称用在YIN映射中,用作它      XML属性或元素名称,取决于参数" yin-      元素"声明。   7.17.2

您不能限制此参数的值空间 - YANG编译器将始终将其识别为字符串。但是没有什么可以阻止你要求实现期望某些值 - 毕竟你正在定义新关键字的含义。

"Frog"

描述语句包含规范性文本,因此如果您的扩展包含extension custom { argument value; description "The value of "custom" statement's argument MUST be an integer in the range from 1 to 5."; } prefix:custom 3; 子语句,并声明该语句的参数值必须是一个整数",那么实现将具有尊重这一文本。

"属性"在" XML属性" (或等效的JSON)

如果你的意思是"属性"在用YANG建模的实例文档(XML,JSON,...)中,答案是否定的 - 在大多数情况下。 Pure YANG不支持建模属性。

但是,有一个已发布的YANG扩展规范,允许定义这些属性。您可以阅读有关here(RFC7952)的更多信息。该扩展名称为description,用于定义YANG元数据,这些附加信息可增加可能已使用YANG建模的数据。这是一个例子:

annotation

根据上述模型,这将是一个有效的XML实例:

module using-annotation {
  namespace "org:example:using-annotation";
  prefix "ua";

  import ietf-yang-metadata {
    prefix "md";
  }

  md:annotation my-annotation {
    type string;
    description "This is my annotation.";
  }

  container top {
    leaf some-leaf {
      type string;
    }
  }  
}

它允许XML属性几乎在任何地方都有效。

阅读RFC7952也可能有助于了解 <ua:top xmlns:ua="org:example:using-annotation"> <ua:some-leaf ua:my-annotation="Yay!">foo</ua:some-leaf> </ua:top> 语句的实际工作方式以及如何正确定义YANG扩展