yang 模式中可以有自定义属性吗?

Shr*_*ala 3 schema parsing ietf-netmod-yang

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

model Animal{

  leaf amphibian{
      type String;
      custom "Frog";     // Custom field which has a value "Frog"
   }
}
Run Code Online (Sandbox Code Playgroud)

pre*_*edi 6

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

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

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

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

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

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

prefix:custom "Frog"; // usage of an extension
Run Code Online (Sandbox Code Playgroud)

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

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

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

参数的名称用在 YIN 映射中,在其中用作 XML 属性或元素名称,具体取决于参数的“yin-element”语句。 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;
Run Code Online (Sandbox Code Playgroud)

描述语句包含规范文本,因此如果您的扩展包含子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;
    }
  }  
}
Run Code Online (Sandbox Code Playgroud)

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

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

prefix:custom "Frog"; // usage of an extension
Run Code Online (Sandbox Code Playgroud)

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

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