Yang Action vs rpc和anydata vs anyxml

时间:2019-06-24 17:33:50

标签: ietf-netmod-yang

我无法理解Yang action与Yang rpc之间的确切区别,以及anydata与anyxml之间的区别。为什么有人应该使用anydata或anyxml建模?我尝试查找有关此的更多信息,但找不到。关于此的任何信息都将非常有帮助。

1 个答案:

答案 0 :(得分:1)

“ rpc”与“动作”

“ rpc”和“动作”之间的区别在于后者是附加到特定数据节点的。该节点可以用作要执行的操作的元数据。

  

一个动作和一个rpc之间的区别是一个动作被绑定      到数据存储中的节点,而rpc不是。当一个动作是      调用时,将指定数据存储区中的节点以及名称      动作和输入参数。

     

RFC7950, Section 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>在标准<action>名称空间中包含一个urn:ietf:params:xml:ns:yang:1元素,后跟一个标识数据节点实例的元素分支,对于RESTONF,存在/restconf/data而不是/restconf/operations在URI之前。

相比之下,rpcs是“全局变量”。它们始终出现在YANG模块的顶层,并且可能会或可能不会应用于整个设备。您当然可以使用rpc语句来执行任何操作,但是这将需要某种非标准的方式来在带有“输入”语句的操作参数中提供被引用的数据节点。有人也更有可能在不存在的实例上执行此操作。

因此,引入此语句的真正原因是方便。许多服务器实现依靠自己的YANG扩展来支持相同的行为,因此有必要创建一个真正的YANG关键字以标准方式对其进行定义。

“ anyxml”与“ anydata”

更新的关键字现已成为对任意数据的大对象建模的首选方法。

  

应注意,在YANG版本1中,“ anyxml”是唯一的      可以建模未知数据层次结构的语句。在许多      在这种情况下,这种未知的数据层次实际上是用YANG建模的,      但是在设计时尚不知道具体的YANG数据模型。在      在这些情况下,建议使用“ anydata”(第7.10节)      而不是“ anyxml”。

     

RFC7950, Section 7.11

当RFC6020发布时,YANG建模数据只能以XML编码。引入一个关键字代表一个任意格式正确的XML的斑点是很有意义的。但是随着时间的流逝,出现了新的编码,例如RESTCONF中使用的JSON编码。

“ anyxml”现在变得不那么有意义了。为什么面向JSON的设备需要在其有效载荷中嵌入XML?那太麻烦了。因此,引入了“ anydata”-它对与编码无关的数据进行建模。如果服务器使用XML,则将其编码为XML;如果使用JSON,则将其编码为JSON;如果使用X,则将其编码为X。此数据的唯一限制是可以使用YANG建模!

  

“ anydata”语句用于表示未知的节点集      可以使用YANG建模,但anyxml除外,但其数据      模型在模块设计时未知。有可能,尽管没有      必需的,以便使任何数据内容的数据模型都已知      通过协议信令或其他不在范围内的方式      

     

RFC7950, Section 7.10