В настоящее время я работаю с YANG в рамках (устаревшего) проекта Python.
Я несколько застрял в задаче определения схемы, которая затем будет использоваться для проверки данных, организованных как словарь Python. Если это возможно, я хотел бы сохранить текущую структуру, так как большая часть кодовой базы использует эти данные.
«Неизменный» фрагмент данных:
"namespace": { # Mandatory
"management": { # Optional
"interfaces": { # Mandatory
"m0": { # Optional
"leaf1": "..."
}
}
},
"benchmark": { # Optional
"interfaces": { # Mandatory
"b0": { # Optional
"leaf1": "...",
"leaf2": "..."
},
"b1": { # Optional
"leaf1": "...",
"leaf2": "..."
}
}
}
}
Моя проблема в том, что все, что помечено как «необязательное» (в примере), будет смоделировано как контейнер, но кажется, что они не могут быть определены как необязательные (т.е. обязательные false;) в соответствии с RFC6020.
Поэтому я определил модель, использующую списки. Это означает, что некоторые узлы Python Dict (управление, тест, m0, b0, b1) теперь являются элементами списка и недоступны в текущем виде, например: data['namespace']['management']...
Модифицированный пример выглядит так:
"namespace": [
{
"desc": "management",
"interfaces": [
{
"leaf1": "..."
}
]
},
{
"desc": "benchmark",
"interfaces": [
{
"leaf1": "...",
"leaf2": "..."
},
{
"leaf1": "...",
"leaf2": "..."
}
]
}
]
Описание (фрагмент из моей текущей) модели YANG:
list namespace {
description "Namespace definitions.";
key desc;
leaf desc { type string; }
uses leaf-definitions;
list interfaces {
key leaf1;
uses leaf-definitions;
}
}
Проверка прошла успешно, и преобразование данных (само по себе) не проблема, но в результате получается большая куча неработающего кода.
Это приводит к моему вопросу (ам):
- Правильно ли я понимаю, что контейнеры в YANG всегда обязательны?
- Может быть, есть другой способ смоделировать этот сценарий? (не нарушая "лишнего")
Я очень благодарен за ваш вклад, так как я новичок в YANG!
uses leaf-definitions;
непосредственно в спискеnamespace
вашей текущей модели YANG? Я думал, чтоleaf-definitions
— это какая-то группировка, определяющая листья, необходимые для интерфейса, а не всё пространство имён. - person Piotr Babij   schedule 12.02.2017leaf-definitions
— это всего лишь заполнитель. Но мой план состоит в том, чтобы использовать (по крайней мере) две группы для этой цели (одну для общих листьев пространства имен и одну для листьев интерфейса). Меня больше всего беспокоит объем дополнительной работы, связанной с переходом от контейнера к списку, который потребуется, чтобы снова заставить старый код работать. - person Trollokia   schedule 12.02.2017