我无法理解 Yang action 与 Yang rpc 之间的确切区别以及anydata 与anyxml 之间的区别。为什么有人应该使用anydata 或anyxml 进行建模?我尝试查找有关此的更多信息,但找不到。任何有关这方面的信息都非常有帮助。
“rpc”和“action”之间的区别在于后者附加到特定的数据节点。该节点可以充当要执行的操作的元数据。
操作和 rpc 之间的区别在于操作与数据存储中的节点相关联,而 rpc 则不然。调用操作时,将指定数据存储区中的节点以及操作名称和输入参数。
假设您有一个项目数组,每个项目都支持单独的操作,例如“启动”、“停止”和“重新启动”。当有人执行此类操作时,他们会说:“嘿,请仅重新启动此特定项目实例”。您可以使用带有嵌入操作的“列表”在 YANG 1.1 中对此进行建模。这样,当执行操作时,服务器确切地知道您想要重新启动、停止或启动哪个实例,因为它的唯一标识符成为有效负载<rpc>
(或 RESTCONF 操作有效负载)的组成部分。
RFC7950 使用“服务器场”示例来演示这一点。场中的每个服务器都可以重置。
module example-server-farm {
yang-version 1.1;
namespace "urn:example:server-farm";
prefix "sfarm";
import ietf-yang-types {
prefix "yang";
}
list server {
key name;
leaf name {
type string;
}
action reset {
input {
leaf reset-at {
type yang:date-and-time;
mandatory true;
}
}
output {
leaf reset-finished-at {
type yang:date-and-time;
mandatory true;
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
匹配的 NETCONF 有效负载后跟 RESTCONF 有效负载(“嘿,请重置‘apache-1’服务器”):
<rpc message-id="101"
xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<action xmlns="urn:ietf:params:xml:ns:yang:1">
<server xmlns="urn:example:server-farm">
<name>apache-1</name>
<reset>
<reset-at>2014-07-29T13:42:00Z</reset-at>
</reset>
</server>
</action>
</rpc>
Run Code Online (Sandbox Code Playgroud)
POST /restconf/data/example-server-farm:server=apache-1/reset HTTP/1.1
Host: example.com
Content-Type: application/yang-data+xml
<input xmlns="urn:example:server-farm">
<reset-at>2014-07-29T13:42:00Z</reset-at>
</input>
Run Code Online (Sandbox Code Playgroud)
请注意有效负载编码的差异。对于 NETCONF,<rpc>
for 操作包含<action>
标准urn:ietf:params:xml:ns:yang:1
命名空间中的一个元素,后跟标识数据节点实例的元素分支,对于 RESTONF,则在URI 之前/restconf/data
包含一个元素。/restconf/operations
相比之下,rpc 是“全局变量”。它们始终出现在 YANG 模块的顶层,并且可能适用于整个设备,也可能不适用于整个设备。当然,您可以使用 rpc 语句实现任何操作,但这需要某种非标准方法来通过“输入”语句向操作的参数中提供引用的数据节点。有人也更有可能在不存在的实例上执行此操作。
所以,引入这个说法的真正原因是为了方便。许多服务器实现依赖自己的 YANG 扩展来支持相同的行为,因此创建一个真正的 YANG 关键字以标准方式定义它是有意义的。
新的关键字现在已成为对任意数据进行建模的首选方式。
应该注意的是,在 YANG 版本 1 中,“anyxml”是唯一可以对未知数据层次结构进行建模的语句。在许多情况下,这种未知的数据层次结构实际上是在 YANG 中建模的,但具体的 YANG 数据模型在设计时并不知道。在这些情况下,建议使用“anydata”(第 7.10 节)而不是“anyxml”。
当 RFC6020 发布时,YANG 建模数据只能用 XML 进行编码。引入一个表示任意格式良好的 XML 块的关键字是有意义的。但随着时间的推移,新的编码出现了,比如 RESTCONF 中使用的 JSON 编码。
“anyxml”现在意义不大了。为什么面向 JSON 的设备需要在其有效负载中嵌入 XML?那实在是太麻烦了。因此引入了“anydata”——它对与编码无关的数据进行建模。如果服务器使用 XML,它将被编码为 XML,如果使用 JSON,它将被编码为 JSON,如果使用 X,它将被编码为 X。对此数据的唯一限制是它可以使用 YANG 建模!
“anydata”语句用于表示可以使用 YANG 建模的未知节点集(anyxml 除外),但其数据模型在模块设计时未知。尽管不是必需的,但任何数据内容的数据模型都可以通过协议信令或本文档范围之外的其他方式变得已知。