你能在 yang 模式中有一个自定义属性吗?

Can you have a custom attribute in yang schema?

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

model Animal{

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

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

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

The "extension" statement allows the definition of new statements within the YANG language. This new statement definition can be imported and used by other modules.

The statement's argument is an identifier that is the new keyword for the extension and must be followed by a block of substatements that holds detailed extension information. The purpose of the "extension" statement is to define a keyword, so that it can be imported and used by other modules.

The extension can be used like a normal YANG statement, with the statement name followed by an argument if one is defined by the extension, and an optional block of substatements. The statement's name is created by combining the prefix of the module in which the extension was defined, a colon (":"), and the extension's keyword, with no interleaving whitespace.

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

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

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

The "argument" statement, which is optional, takes as an argument a string that is the name of the argument to the keyword. If no argument statement is present, the keyword expects no argument when it is used. 7.17.2

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

The argument's name is used in the YIN mapping, where it is used as an XML attribute or element name, depending on the argument's "yin- element" statement. 7.17.2

您不能限制此参数本身的值 space - 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 扩展规范允许定义此类属性。您可以阅读有关 here (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 扩展.