3

我想知道我们是否可以在叶子、列表等元素之一中定义自定义字段或属性。例如:这可能吗?如果可能,我们如何定义这些字段。

model Animal{

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

1 回答 1

5

“新 YANG 关键字”中的“属性”

如果通过“属性”您指的是一个新的 YANG 关键字,它对您有特殊意义,那么是的。YANG 支持扩展。来自RFC6020

“扩展”语句允许在 YANG 语言中定义新语句。这个新的语句定义可以被其他模块导入和使用。

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

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

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

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

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

“argument”语句是可选的,它将一个字符串作为参数,该字符串是关键字参数的名称。如果不存在参数语句,则关键字在使用时不需要参数。 7.17.2

为什么新关键字需要一个命名参数?YANG 可以映射到 YIN,另一种表示为 XML 的语法,这就是这个名称变得重要的地方。

参数的名称用于 YIN 映射,根据参数的“yin-element”语句,它用作 XML 属性或元素名称。 7.17.2

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

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;

描述语句包含规范文本,因此如果您的扩展包含一个description子语句,说明“此语句的参数的值必须是整数”,那么实现将必须尊重此文本。

“XML 属性”(或 JSON 等价物)中的“属性”

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

但是,有一个已发布的 YANG 扩展规范允许定义此类属性。您可以在此处阅读更多相关信息(RFC7952)。该扩展被调用annotation并用于定义 YANG 元数据,即增强可能已经用 YANG 建模的数据的附加信息。这是一个例子:

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 实例:

  <ua:top xmlns:ua="org:example:using-annotation">
    <ua:some-leaf ua:my-annotation="Yay!">foo</ua:some-leaf>
  </ua:top>

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

阅读 RFC7952 也可能有助于了解该extension语句的实际工作原理以及如何正确定义 YANG 扩展

于 2015-11-27T11:21:50.700 回答