我想知道我们是否可以在叶子、列表等元素之一中定义自定义字段或属性。例如:这可能吗?如果可能,我们如何定义这些字段。
model Animal{
leaf amphibian{
type String;
custom "Frog"; // Custom field which has a value "Frog"
}
}
我想知道我们是否可以在叶子、列表等元素之一中定义自定义字段或属性。例如:这可能吗?如果可能,我们如何定义这些字段。
model Animal{
leaf amphibian{
type String;
custom "Frog"; // Custom field which has a value "Frog"
}
}
如果通过“属性”您指的是一个新的 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
子语句,说明“此语句的参数的值必须是整数”,那么实现将必须尊重此文本。
如果您的意思是使用 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 扩展。