Законно ли ПОЛУЧИТЬ все экземпляры списка в RESTCONF? - PullRequest
1 голос
/ 14 мая 2019

С учетом следующих определений 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 lists и non-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), поэтому вы не можете использовать URL-адрес, например /restconf/data/top-leaflist. Вы должны использовать =fred, чтобы указать экземпляр списка. Итак, если экземпляры листового списка не могут быть извлечены целиком, почему экземпляры списка могут быть извлечены целиком (в понимании 1)? Экземпляр листового списка и экземпляр списка являются ресурсом данных, они по своей концепции эквивалентны.

Спасибо

1 Ответ

0 голосов
/ 15 мая 2019

Правильное толкование равно 1. «Если есть» относится к ключевым значениям, а не к ключевым утверждениям YANG.Это нормально для RESTCONF GET, чтобы выбрать более одного экземпляра списка, но только в кодировке JSON (правильно сформированный XML не допускает множественных корневых элементов).Это также единственный способ извлечения экземпляров списка без конфигурации (состояния) без ключа.

Если бы через GET было разрешено получать только одну запись списка, соответствующая секция RFC явно указала бы это с помощьюa MUST - если вы посмотрите на формулировку для DELETE в разделе 4.7, p3 , такой текст существует, но нет эквивалента для GET.

Также можно получить несколькоэкземпляры листа.Это может быть единственным способом получения некоторых таких экземпляров, поскольку (в YANG 1.1) допускаются повторяющиеся значения для неконфигурационных листовых списков.Отсутствующее «если есть», скорее всего, является редакционным упущением.

Обратите внимание, что текст в 3.5.3 только объясняет, как формируются URI, но ничего не говорит о том, как операции RESTCONF используют эти URI.

...