我无法理解Yang action与Yang rpc之间的确切区别,以及anydata与anyxml之间的区别。为什么有人应该使用anydata或anyxml建模?我尝试查找有关此的更多信息,但找不到。关于此的任何信息都将非常有帮助。
答案 0 :(得分:1)
“ rpc”和“动作”之间的区别在于后者是附加到特定数据节点的。该节点可以用作要执行的操作的元数据。
一个动作和一个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;
}
}
}
}
}
匹配的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>
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>
请注意有效载荷编码的区别。对于NETCONF,用于动作的<rpc>
在标准<action>
名称空间中包含一个urn:ietf:params:xml:ns:yang:1
元素,后跟一个标识数据节点实例的元素分支,对于RESTONF,存在/restconf/data
而不是/restconf/operations
在URI之前。
相比之下,rpcs是“全局变量”。它们始终出现在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除外,但其数据 模型在模块设计时未知。有可能,尽管没有 必需的,以便使任何数据内容的数据模型都已知 通过协议信令或其他不在范围内的方式