首页 > 解决方案 > 在 RESTCONF 中获取所有列表实例是否合法?

问题描述

给定以下 YANG 定义,在模块中test

list machine {
    key "name";
        leaf "name" {
        type string;
    }
}

在数据树中:

"machine" : [
    { "name": "a" },
    { "name": "b" },
    { "name": "c" }
]

我想知道下面的请求是否符合RESTCONF?

GET /restconf/data/test/machine

此请求应返回所有列表实例。

我有这个问题是因为我对 RESTCONF 的话没有清楚的理解。在 RESTCONF 3.5.3中,

如果路径表达式中的数据节点是 YANG 列表节点,则列表的键值(如果有)必须根据以下规则进行编码:

o 表示 YANG 列表的数据资源的密钥叶值必须使用一个路径段 [RFC3986] 进行编码。

o 如果只有一个键叶值,则路径段由列表名称、后跟“=”字符、后跟单个键叶值来构造。

(if any)意思是以下两种意思中的哪一种?(key对于非配置,该语句不是必须的list。所以有keyed listsnon-keyed lists。)

  1. 用户可以自由地为键控列表指定键值。这(if any)是关于“如果指定了键值”。如果他们指定,则键值必须遵循有关键值的规则。如果他们没有指定,那么您不必遵循有关键值的规则。以我的 YANG 定义为例,这两个请求都是正确的:

     GET /restconf/data/test/machine    // get all list instances
     GET /restconf/data/test/machine=a  // get the list instance keyed "a"
    
  2. 用户必须为键控列表指定键值。这(if any)是关于“列表是否被键入”。在这种理解中,将有:

     GET /restconf/data/test/machine    // wrong request, can't get all list instanecs
     GET /restconf/data/test/machine=a  // ok, get the list instance keyed "a"
    

第二种理解来自叶列表的同一部分中的相似词:

如果路径表达式中的数据节点是 YANG 叶列表节点,则叶列表值必须根据以下规则进行编码:

o 叶列表的标识符必须使用一个路径段 [RFC3986] 进行编码。

o 路径段由叶列表名称、“=”字符和叶列表值构成(例如,/restconf/data/top-leaflist=fred)。

叶子列表的词没有(if any),所以你不能使用像/restconf/data/top-leaflist. 您必须使用=fred指定叶列表实例。那么如果leaf-list实例不能作为一个整体检索,为什么list实例可以作为一个整体检索(在理解1中)?叶列表实例和列表实例都是数据资源,它们在概念上是等价的。

谢谢,

标签: listietf-netmod-yang

解决方案


正确的解释是 1. “如果有”是指键值,而不是 YANG 键语句。RESTCONF GET 可以获取多个列表实例,但只能采用 JSON 编码(格式良好的 XML 不允许多个根元素)。这也是检索无键非配置(状态)列表实例的唯一方法。

如果仅允许通过 GET 获取单个列表条目,则其相应的 RFC 部分将使用 MUST 明确说明这一点 - 如果您查看第4.7 节 p3中 DELETE 的措辞,则存在此类文本,但有GET 没有等价物。

检索多个叶子列表实例也是可以的。这可能是检索某些此类实例的唯一方法,因为(在 YANG 1.1 中)非配置叶列表允许重复值。缺少的“如果有的话”很可能是编辑遗漏。

请注意,3.5.3 中的文本只解释了 URI 是如何形成的,它没有说明 RESTCONF 操作如何利用这些 URI。


推荐阅读