我无法理解Yang action与Yang rpc之间的确切区别,以及anydata与anyxml之间的区别。为什么有人应该使用anydata或anyxml建模?我试着找到更多关于这方面的信息,但我找不到。任何有关这方面的信息都是非常有用的。
发布于 2019-06-26 08:15:18
"rpc“与”动作“
"rpc“和”操作“之间的区别是,后者被附加到特定的数据节点。此节点可用作要执行的操作的元数据。
操作和rpc之间的区别是,操作绑定到数据存储中的节点,而rpc不是。调用操作时,将指定数据存储中的节点以及操作的名称和输入参数。RFC7950,第7.15节
假设您有一个项数组,每个项都支持单独的操作,例如“开始”、“停止”和“重新启动”。当有人执行这样的操作时,他们会说:“嘿,请只重新启动这个特定的项目实例”。您可以在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> For actions在标准urn:ietf:params:xml:ns:yang:1命名空间中包含一个<action>元素,后面是标识数据节点实例的元素分支,对于RESTONF,在URI之前有/restconf/data而不是/restconf/operations。
相比之下,rpcs是“全球性的”。它们总是出现在杨模块的顶层,可能适用于整个设备,也可能不适用于整个设备。当然,您可以使用rpc语句实现任何操作,但是这需要一些非标准的方法来在参数中提供引用的数据节点给操作,并使用"input“语句。还可能有人在不存在的实例上执行此操作。
所以,提出这一声明的真正原因是方便。很多服务器实现依赖于自己的YANG扩展来支持相同的行为,因此创建一个真正的YANG关键字来以标准的方式定义它是有意义的。
"anyxml“与"anydata”
更新的关键字现在已经成为对任意数据块建模的首选方法。
应该注意的是,在YANG version 1中,"anyxml“是唯一可以建模未知数据层次结构的语句。在许多情况下,这种未知的数据层次结构实际上是在YANG中建模的,但是在设计时不知道具体的YANG数据模型。在这些情况下,建议使用"anydata“(第7.10节)而不是"anyxml”。RFC7950,第7.11节
当RFC6020发布时,杨建模的数据只能用XML编码。引入一个代表任意、格式良好的XML的关键字是有意义的。但是随着时间的推移,出现了新的编码,例如RESTCONF中使用的JSON编码。
"anyxml“现在意义要小得多。为什么面向JSON的设备需要在其有效负载中嵌入XML?那太麻烦了。因此,"anydata“被引入--它模拟了一小块与编码无关的数据。如果服务器正在使用XML,它将被编码为XML;如果使用JSON,它将用JSON进行编码;如果使用X,则将在X中进行编码。对此数据的唯一限制是可以使用YANG建模!
"anydata“语句用于表示可以使用YANG建模的未知节点集,但anyxml除外,但在模块设计时不知道数据模型。可以(尽管不是必需的)通过协议信令或本文档范围之外的其他方法来了解任何数据内容的数据模型。RFC7950,第7.10节
https://stackoverflow.com/questions/56741430
复制相似问题