13. YIN
Модуль YANG может быть преобразован в другой основанный на XML формат, называемый YIN. Преобразованный модуль называется модулем YIN. В этом разделе описаны правила прямого и обратного преобразования между двумя форматами.
Форматы YANG и YIN содержат эквивалентную информацию, но используют разные обозначения. Нотация YIN позволяет разработчикам представлять модули данных YANG в формате XML, что дает возможность использования богатого набора инструментов XML для фильтрации и проверки данных, автоматизированной генерации кода и других задач. Могут применяться инструменты типа XSLT или валидаторов XML.
Преобразование между YANG и YIN не меняет информационного содержимого модели. Комментарии и пробельные символы не сохраняются.
13.1. Формальное определение YIN
Между ключевыми словами YANG и элементами YIN существует взаимно-однозначное соответствие. Локальное имя элемента YIN идентично соответствующему ключевому слову YANG. Это означает, в частности, что корневым элементом документа YIN всегда будет <module> или <submodule>.
Элементы YIN, соответствующие ключевым словам YANG, отоносятся к пространству имен, идентификатор URI которого имеет значение urn:ietf:params:xml:ns:yang:yin:1.
Элементы YIN, соответствующие ключевым словам расширений, относятся к пространству имен модуля YANG, в котором ключевое слово было объявлено с помощью оператора extension.
Имена всех элементов YIN должны быть надлежащим образом определены в их пространствах имен (выше) с использованием стандартных механизмов [XML-NAMES], т. е. атрибутов xmlns и xmlns:xxx.
Аргумент оператора YANG представляется в YIN атрибутом XML или субэлементом элемента keyword. Отображения для ключевых слов YANG приведены в таблице 1. Для расширений отображение аргумента задается оператором extension (параграф 7.19) и приведенными ниже правилами.
-
Если аргумент представлен атрибутом, этот атрибут не имеет пространства имен.
-
Если аргумент представлен элементом, он определяется тем же пространством имен, что и его родительский элемент keyword.
-
Если аргумент представлен элементом, он должен быть первым потомком элемента keyword.
Субоператоры операторов YANG представляются как (дополнительные) потомки элемента keyword, а их относительный порядок должен совпадать с порядком субоператоров в YANG.
Комментарии YANG могут преобразовываться в комментарии XML.
Таблица 1. Отображение аргументов операторов YANG.
-
Ключевое слово
Имя аргумента
yin-element
action
name
false
anydata
name
false
anyxml
name
false
argument
name
false
augment
target-node
false
base
name
false
belongs-to
module
false
bit
name
false
case
name
false
choice
name
false
config
value
false
contact
text
true
container
name
false
default
value
false
description
text
true
deviate
value
false
deviation
target-node
false
enum
name
false
error-app-tag
value
false
error-message
value
true
extension
name
false
feature
name
false
fraction-digits
value
false
grouping
name
false
identity
name
false
if-feature
name
false
import
module
false
include
module
false
input
<no argument>
n/a
key
value
false
leaf
name
false
leaf-list
name
false
length
value
false
list
name
false
mandatory
value
false
max-elements
value
false
min-elements
value
false
modifier
value
false
module
name
false
must
condition
false
namespace
uri
false
notification
name
false
ordered-by
value
false
organization
text
true
output
<no argument>
n/a
path
value
false
pattern
value
false
position
value
false
prefix
value
false
presence
value
false
range
value
false
reference
text
true
refine
target-node
false
require-instance
value
false
revision
date
false
revision-date
date
false
rpc
name
false
status
value
false
submodule
name
false
type
name
false
typedef
name
false
unique
tag
false
units
name
false
uses
name
false
value
value
false
when
condition
false
yang-version
value
false
yin-element
value
false
13.1.1. Пример использования
Приведенный ниже модуль YANG
module example-foo { yang-version 1.1; namespace "urn:example:foo"; prefix "foo"; import example-extensions { prefix "myext"; } list interface { key "name"; leaf name { type string; } leaf mtu { type uint32; description "The MTU of the interface."; myext:c-define "MY_MTU"; } } }
где расширение c-define определено в параграфе 7.19.3, преобразуется в YIN вида
<module name="example-foo" xmlns="urn:ietf:params:xml:ns:yang:yin:1" xmlns:foo="urn:example:foo" xmlns:myext="urn:example:extensions"> <namespace uri="urn:example:foo"/> <prefix value="foo"/> <import module="example-extensions"> <prefix value="myext"/> </import> <list name="interface"> <key value="name"/> <leaf name="name"> <type name="string"/> </leaf> <leaf name="mtu"> <type name="uint32"/> <description> <text>The MTU of the interface.</text> </description> <myext:c-define name="MY_MTU"/> </leaf> </list> </module>
14. Грамматика ABNF для YANG
В YANG почти все операторы являются неупорядоченными. Грамматика ABNF [RFC5234] [RFC7405] определяет канонический порядок. Для улучшения читаемости модулей рекомендуется размещать предложения (clause) в этом порядке.
В грамматике ABNF неупорядоченные операторы отмечены комментариями.
Предполагается, что сканер заменит комментарий YANG одиночным символом пробела.
<CODE BEGINS> file "yang.abnf" module-stmt = optsep module-keyword sep identifier-arg-str optsep "{" stmtsep module-header-stmts linkage-stmts meta-stmts revision-stmts body-stmts "}" optsep submodule-stmt = optsep submodule-keyword sep identifier-arg-str optsep "{" stmtsep submodule-header-stmts linkage-stmts meta-stmts revision-stmts body-stmts "}" optsep module-header-stmts = ;; эти операторы могут присутствовать в любом порядке yang-version-stmt namespace-stmt prefix-stmt submodule-header-stmts = ;; эти операторы могут присутствовать в любом порядке yang-version-stmt belongs-to-stmt meta-stmts = ;; эти операторы могут присутствовать в любом порядке [organization-stmt] [contact-stmt] [description-stmt] [reference-stmt] linkage-stmts = ;; эти операторы могут присутствовать в любом порядке *import-stmt *include-stmt revision-stmts = *revision-stmt body-stmts = *(extension-stmt / feature-stmt / identity-stmt / typedef-stmt / grouping-stmt / data-def-stmt / augment-stmt / rpc-stmt / notification-stmt / deviation-stmt) data-def-stmt = container-stmt / leaf-stmt / leaf-list-stmt / list-stmt / choice-stmt / anydata-stmt / anyxml-stmt / uses-stmt yang-version-stmt = yang-version-keyword sep yang-version-arg-str stmtend yang-version-arg-str = < a string that matches the rule > < yang-version-arg > yang-version-arg = "1.1" import-stmt = import-keyword sep identifier-arg-str optsep "{" stmtsep ;; эти операторы могут присутствовать в любом порядке prefix-stmt [revision-date-stmt] [description-stmt] [reference-stmt] "}" stmtsep include-stmt = include-keyword sep identifier-arg-str optsep (";" / "{" stmtsep ;; эти операторы могут присутствовать в любом порядке [revision-date-stmt] [description-stmt] [reference-stmt] "}") stmtsep namespace-stmt = namespace-keyword sep uri-str stmtend uri-str = < a string that matches the rule > < URI in RFC 3986 > prefix-stmt = prefix-keyword sep prefix-arg-str stmtend belongs-to-stmt = belongs-to-keyword sep identifier-arg-str optsep "{" stmtsep prefix-stmt "}" stmtsep organization-stmt = organization-keyword sep string stmtend contact-stmt = contact-keyword sep string stmtend description-stmt = description-keyword sep string stmtend reference-stmt = reference-keyword sep string stmtend units-stmt = units-keyword sep string stmtend revision-stmt = revision-keyword sep revision-date optsep (";" / "{" stmtsep ;; эти операторы могут присутствовать в любом порядке [description-stmt] [reference-stmt] "}") stmtsep revision-date = date-arg-str revision-date-stmt = revision-date-keyword sep revision-date stmtend extension-stmt = extension-keyword sep identifier-arg-str optsep (";" / "{" stmtsep ;; эти операторы могут присутствовать в любом порядке [argument-stmt] [status-stmt] [description-stmt] [reference-stmt] "}") stmtsep argument-stmt = argument-keyword sep identifier-arg-str optsep (";" / "{" stmtsep [yin-element-stmt] "}") stmtsep yin-element-stmt = yin-element-keyword sep yin-element-arg-str stmtend yin-element-arg-str = < a string that matches the rule > < yin-element-arg > yin-element-arg = true-keyword / false-keyword identity-stmt = identity-keyword sep identifier-arg-str optsep (";" / "{" stmtsep ;; эти операторы могут присутствовать в любом порядке *if-feature-stmt *base-stmt [status-stmt] [description-stmt] [reference-stmt] "}") stmtsep base-stmt = base-keyword sep identifier-ref-arg-str stmtend feature-stmt = feature-keyword sep identifier-arg-str optsep (";" / "{" stmtsep ;; эти операторы могут присутствовать в любом порядке *if-feature-stmt [status-stmt] [description-stmt] [reference-stmt] "}") stmtsep if-feature-stmt = if-feature-keyword sep if-feature-expr-str stmtend if-feature-expr-str = < a string that matches the rule > < if-feature-expr > if-feature-expr = if-feature-term [sep or-keyword sep if-feature-expr] if-feature-term = if-feature-factor [sep and-keyword sep if-feature-term] if-feature-factor = not-keyword sep if-feature-factor / "(" optsep if-feature-expr optsep ")" / identifier-ref-arg typedef-stmt = typedef-keyword sep identifier-arg-str optsep "{" stmtsep ;; эти операторы могут присутствовать в любом порядке type-stmt [units-stmt] [default-stmt] [status-stmt] [description-stmt] [reference-stmt] "}" stmtsep type-stmt = type-keyword sep identifier-ref-arg-str optsep (";" / "{" stmtsep [type-body-stmts] "}") stmtsep type-body-stmts = numerical-restrictions / decimal64-specification / string-restrictions / enum-specification / leafref-specification / identityref-specification / instance-identifier-specification / bits-specification / union-specification / binary-specification numerical-restrictions = [range-stmt] range-stmt = range-keyword sep range-arg-str optsep (";" / "{" stmtsep ;; эти операторы могут присутствовать в любом порядке [error-message-stmt] [error-app-tag-stmt] [description-stmt] [reference-stmt] "}") stmtsep decimal64-specification = ;; эти операторы могут присутствовать в любом порядке fraction-digits-stmt [range-stmt] fraction-digits-stmt = fraction-digits-keyword sep fraction-digits-arg-str stmtend fraction-digits-arg-str = < a string that matches the rule > < fraction-digits-arg > fraction-digits-arg = ("1" ["0" / "1" / "2" / "3" / "4" / "5" / "6" / "7" / "8"]) / "2" / "3" / "4" / "5" / "6" / "7" / "8" / "9" string-restrictions = ;; эти операторы могут присутствовать в любом порядке [length-stmt] *pattern-stmt length-stmt = length-keyword sep length-arg-str optsep (";" / "{" stmtsep ;; эти операторы могут присутствовать в любом порядке [error-message-stmt] [error-app-tag-stmt] [description-stmt] [reference-stmt] "}") stmtsep pattern-stmt = pattern-keyword sep string optsep (";" / "{" stmtsep ;; эти операторы могут присутствовать в любом порядке [modifier-stmt] [error-message-stmt] [error-app-tag-stmt] [description-stmt] [reference-stmt] "}") stmtsep modifier-stmt = modifier-keyword sep modifier-arg-str stmtend modifier-arg-str = < a string that matches the rule > < modifier-arg > modifier-arg = invert-match-keyword default-stmt = default-keyword sep string stmtend enum-specification = 1*enum-stmt enum-stmt = enum-keyword sep string optsep (";" / "{" stmtsep ;; эти операторы могут присутствовать в любом порядке *if-feature-stmt [value-stmt] [status-stmt] [description-stmt] [reference-stmt] "}") stmtsep leafref-specification = ;; эти операторы могут присутствовать в любом порядке path-stmt [require-instance-stmt] path-stmt = path-keyword sep path-arg-str stmtend require-instance-stmt = require-instance-keyword sep require-instance-arg-str stmtend require-instance-arg-str = < a string that matches the rule > < require-instance-arg > require-instance-arg = true-keyword / false-keyword instance-identifier-specification = [require-instance-stmt] identityref-specification = 1*base-stmt union-specification = 1*type-stmt binary-specification = [length-stmt] bits-specification = 1*bit-stmt bit-stmt = bit-keyword sep identifier-arg-str optsep (";" / "{" stmtsep ;; эти операторы могут присутствовать в любом порядке *if-feature-stmt [position-stmt] [status-stmt] [description-stmt] [reference-stmt] "}") stmtsep position-stmt = position-keyword sep position-value-arg-str stmtend position-value-arg-str = < a string that matches the rule > < position-value-arg > position-value-arg = non-negative-integer-value status-stmt = status-keyword sep status-arg-str stmtend status-arg-str = < a string that matches the rule > < status-arg > status-arg = current-keyword / obsolete-keyword / deprecated-keyword config-stmt = config-keyword sep config-arg-str stmtend config-arg-str = < a string that matches the rule > < config-arg > config-arg = true-keyword / false-keyword mandatory-stmt = mandatory-keyword sep mandatory-arg-str stmtend mandatory-arg-str = < a string that matches the rule > < mandatory-arg > mandatory-arg = true-keyword / false-keyword presence-stmt = presence-keyword sep string stmtend ordered-by-stmt = ordered-by-keyword sep ordered-by-arg-str stmtend ordered-by-arg-str = < a string that matches the rule > < ordered-by-arg > ordered-by-arg = user-keyword / system-keyword must-stmt = must-keyword sep string optsep (";" / "{" stmtsep ;; эти операторы могут присутствовать в любом порядке [error-message-stmt] [error-app-tag-stmt] [description-stmt] [reference-stmt] "}") stmtsep error-message-stmt = error-message-keyword sep string stmtend error-app-tag-stmt = error-app-tag-keyword sep string stmtend min-elements-stmt = min-elements-keyword sep min-value-arg-str stmtend min-value-arg-str = < a string that matches the rule > < min-value-arg > min-value-arg = non-negative-integer-value max-elements-stmt = max-elements-keyword sep max-value-arg-str stmtend max-value-arg-str = < a string that matches the rule > < max-value-arg > max-value-arg = unbounded-keyword / positive-integer-value value-stmt = value-keyword sep integer-value-str stmtend integer-value-str = < a string that matches the rule > < integer-value > grouping-stmt = grouping-keyword sep identifier-arg-str optsep (";" / "{" stmtsep ;; эти операторы могут присутствовать в любом порядке [status-stmt] [description-stmt] [reference-stmt] *(typedef-stmt / grouping-stmt) *data-def-stmt *action-stmt *notification-stmt "}") stmtsep container-stmt = container-keyword sep identifier-arg-str optsep (";" / "{" stmtsep ;; эти операторы могут присутствовать в любом порядке [when-stmt] *if-feature-stmt *must-stmt [presence-stmt] [config-stmt] [status-stmt] [description-stmt] [reference-stmt] *(typedef-stmt / grouping-stmt) *data-def-stmt *action-stmt *notification-stmt "}") stmtsep leaf-stmt = leaf-keyword sep identifier-arg-str optsep "{" stmtsep ;; эти операторы могут присутствовать в любом порядке [when-stmt] *if-feature-stmt type-stmt [units-stmt] *must-stmt [default-stmt] [config-stmt] [mandatory-stmt] [status-stmt] [description-stmt] [reference-stmt] "}" stmtsep leaf-list-stmt = leaf-list-keyword sep identifier-arg-str optsep "{" stmtsep ;; эти операторы могут присутствовать в любом порядке [when-stmt] *if-feature-stmt type-stmt stmtsep [units-stmt] *must-stmt *default-stmt [config-stmt] [min-elements-stmt] [max-elements-stmt] [ordered-by-stmt] [status-stmt] [description-stmt] [reference-stmt] "}" stmtsep list-stmt = list-keyword sep identifier-arg-str optsep "{" stmtsep ;; эти операторы могут присутствовать в любом порядке [when-stmt] *if-feature-stmt *must-stmt [key-stmt] *unique-stmt [config-stmt] [min-elements-stmt] [max-elements-stmt] [ordered-by-stmt] [status-stmt] [description-stmt] [reference-stmt] *(typedef-stmt / grouping-stmt) 1*data-def-stmt *action-stmt *notification-stmt "}" stmtsep key-stmt = key-keyword sep key-arg-str stmtend key-arg-str = < a string that matches the rule > < key-arg > key-arg = node-identifier *(sep node-identifier) unique-stmt = unique-keyword sep unique-arg-str stmtend unique-arg-str = < a string that matches the rule > < unique-arg > unique-arg = descendant-schema-nodeid *(sep descendant-schema-nodeid) choice-stmt = choice-keyword sep identifier-arg-str optsep (";" / "{" stmtsep ;; эти операторы могут присутствовать в любом порядке [when-stmt] *if-feature-stmt [default-stmt] [config-stmt] [mandatory-stmt] [status-stmt] [description-stmt] [reference-stmt] *(short-case-stmt / case-stmt) "}") stmtsep short-case-stmt = choice-stmt / container-stmt / leaf-stmt / leaf-list-stmt / list-stmt / anydata-stmt / anyxml-stmt case-stmt = case-keyword sep identifier-arg-str optsep (";" / "{" stmtsep ;; эти операторы могут присутствовать в любом порядке [when-stmt] *if-feature-stmt [status-stmt] [description-stmt] [reference-stmt] *data-def-stmt "}") stmtsep anydata-stmt = anydata-keyword sep identifier-arg-str optsep (";" / "{" stmtsep ;; эти операторы могут присутствовать в любом порядке [when-stmt] *if-feature-stmt *must-stmt [config-stmt] [mandatory-stmt] [status-stmt] [description-stmt] [reference-stmt] "}") stmtsep anyxml-stmt = anyxml-keyword sep identifier-arg-str optsep (";" / "{" stmtsep ;; эти операторы могут присутствовать в любом порядке [when-stmt] *if-feature-stmt *must-stmt [config-stmt] [mandatory-stmt] [status-stmt] [description-stmt] [reference-stmt] "}") stmtsep uses-stmt = uses-keyword sep identifier-ref-arg-str optsep (";" / "{" stmtsep ;; эти операторы могут присутствовать в любом порядке [when-stmt] *if-feature-stmt [status-stmt] [description-stmt] [reference-stmt] *refine-stmt *uses-augment-stmt "}") stmtsep refine-stmt = refine-keyword sep refine-arg-str optsep "{" stmtsep ;; эти операторы могут присутствовать в любом порядке *if-feature-stmt *must-stmt [presence-stmt] *default-stmt [config-stmt] [mandatory-stmt] [min-elements-stmt] [max-elements-stmt] [description-stmt] [reference-stmt] "}" stmtsep refine-arg-str = < a string that matches the rule > < refine-arg > refine-arg = descendant-schema-nodeid uses-augment-stmt = augment-keyword sep uses-augment-arg-str optsep "{" stmtsep ;; эти операторы могут присутствовать в любом порядке [when-stmt] *if-feature-stmt [status-stmt] [description-stmt] [reference-stmt] 1*(data-def-stmt / case-stmt / action-stmt / notification-stmt) "}" stmtsep uses-augment-arg-str = < a string that matches the rule > < uses-augment-arg > uses-augment-arg = descendant-schema-nodeid augment-stmt = augment-keyword sep augment-arg-str optsep "{" stmtsep ;; эти операторы могут присутствовать в любом порядке [when-stmt] *if-feature-stmt [status-stmt] [description-stmt] [reference-stmt] 1*(data-def-stmt / case-stmt / action-stmt / notification-stmt) "}" stmtsep augment-arg-str = < a string that matches the rule > < augment-arg > augment-arg = absolute-schema-nodeid when-stmt = when-keyword sep string optsep (";" / "{" stmtsep ;; эти операторы могут присутствовать в любом порядке [description-stmt] [reference-stmt] "}") stmtsep rpc-stmt = rpc-keyword sep identifier-arg-str optsep (";" / "{" stmtsep ;; эти операторы могут присутствовать в любом порядке *if-feature-stmt [status-stmt] [description-stmt] [reference-stmt] *(typedef-stmt / grouping-stmt) [input-stmt] [output-stmt] "}") stmtsep action-stmt = action-keyword sep identifier-arg-str optsep (";" / "{" stmtsep ;; эти операторы могут присутствовать в любом порядке *if-feature-stmt [status-stmt] [description-stmt] [reference-stmt] *(typedef-stmt / grouping-stmt) [input-stmt] [output-stmt] "}") stmtsep input-stmt = input-keyword optsep "{" stmtsep ;; эти операторы могут присутствовать в любом порядке *must-stmt *(typedef-stmt / grouping-stmt) 1*data-def-stmt "}" stmtsep output-stmt = output-keyword optsep "{" stmtsep ;; эти операторы могут присутствовать в любом порядке *must-stmt *(typedef-stmt / grouping-stmt) 1*data-def-stmt "}" stmtsep notification-stmt = notification-keyword sep identifier-arg-str optsep (";" / "{" stmtsep ;; эти операторы могут присутствовать в любом порядке *if-feature-stmt *must-stmt [status-stmt] [description-stmt] [reference-stmt] *(typedef-stmt / grouping-stmt) *data-def-stmt "}") stmtsep deviation-stmt = deviation-keyword sep deviation-arg-str optsep "{" stmtsep ;; эти операторы могут присутствовать в любом порядке [description-stmt] [reference-stmt] (deviate-not-supported-stmt / 1*(deviate-add-stmt / deviate-replace-stmt / deviate-delete-stmt)) "}" stmtsep deviation-arg-str = < a string that matches the rule > < deviation-arg > deviation-arg = absolute-schema-nodeid deviate-not-supported-stmt = deviate-keyword sep not-supported-keyword-str stmtend deviate-add-stmt = deviate-keyword sep add-keyword-str optsep (";" / "{" stmtsep ;; эти операторы могут присутствовать в любом порядке [units-stmt] *must-stmt *unique-stmt *default-stmt [config-stmt] [mandatory-stmt] [min-elements-stmt] [max-elements-stmt] "}") stmtsep deviate-delete-stmt = deviate-keyword sep delete-keyword-str optsep (";" / "{" stmtsep ;; эти операторы могут присутствовать в любом порядке [units-stmt] *must-stmt *unique-stmt *default-stmt "}") stmtsep deviate-replace-stmt = deviate-keyword sep replace-keyword-str optsep (";" / "{" stmtsep ;; эти операторы могут присутствовать в любом порядке [type-stmt] [units-stmt] [default-stmt] [config-stmt] [mandatory-stmt] [min-elements-stmt] [max-elements-stmt] "}") stmtsep not-supported-keyword-str = < a string that matches the rule > < not-supported-keyword > add-keyword-str = < a string that matches the rule > < add-keyword > delete-keyword-str = < a string that matches the rule > < delete-keyword > replace-keyword-str = < a string that matches the rule > < replace-keyword > ;; представляет использование расширения unknown-statement = prefix ":" identifier [sep string] optsep (";" / "{" optsep *((yang-stmt / unknown-statement) optsep) "}") stmtsep yang-stmt = action-stmt / anydata-stmt / anyxml-stmt / argument-stmt / augment-stmt / base-stmt / belongs-to-stmt / bit-stmt / case-stmt / choice-stmt / config-stmt / contact-stmt / container-stmt / default-stmt / description-stmt / deviate-add-stmt / deviate-delete-stmt / deviate-not-supported-stmt / deviate-replace-stmt / deviation-stmt / enum-stmt / error-app-tag-stmt / error-message-stmt / extension-stmt / feature-stmt / fraction-digits-stmt / grouping-stmt / identity-stmt / if-feature-stmt / import-stmt / include-stmt / input-stmt / key-stmt / leaf-list-stmt / leaf-stmt / length-stmt / list-stmt / mandatory-stmt / max-elements-stmt / min-elements-stmt / modifier-stmt / module-stmt / must-stmt / namespace-stmt / notification-stmt / ordered-by-stmt / organization-stmt / output-stmt / path-stmt / pattern-stmt / position-stmt / prefix-stmt / presence-stmt / range-stmt / reference-stmt / refine-stmt / require-instance-stmt / revision-date-stmt / revision-stmt / rpc-stmt / status-stmt / submodule-stmt / typedef-stmt / type-stmt / unique-stmt / units-stmt / uses-augment-stmt / uses-stmt / value-stmt / when-stmt / yang-version-stmt / yin-element-stmt ;; Число элементов range-arg-str = < a string that matches the rule > < range-arg > range-arg = range-part *(optsep "|" optsep range-part) range-part = range-boundary [optsep ".." optsep range-boundary] range-boundary = min-keyword / max-keyword / integer-value / decimal-value ;; Размеры length-arg-str = < a string that matches the rule > < length-arg > length-arg = length-part *(optsep "|" optsep length-part) length-part = length-boundary [optsep ".." optsep length-boundary] length-boundary = min-keyword / max-keyword / non-negative-integer-value ;; Даты date-arg-str = < a string that matches the rule > < date-arg > date-arg = 4DIGIT "-" 2DIGIT "-" 2DIGIT ;; Идентификаторы узлов схемы schema-nodeid = absolute-schema-nodeid / descendant-schema-nodeid absolute-schema-nodeid = 1*("/" node-identifier) descendant-schema-nodeid = node-identifier [absolute-schema-nodeid] node-identifier = [prefix ":"] identifier ;; Идентификаторы экземпляров instance-identifier = 1*("/" (node-identifier [1*key-predicate / leaf-list-predicate / pos])) key-predicate = "[" *WSP key-predicate-expr *WSP "]" key-predicate-expr = node-identifier *WSP "=" *WSP quoted-string leaf-list-predicate = "[" *WSP leaf-list-predicate-expr *WSP "]" leaf-list-predicate-expr = "." *WSP "=" *WSP quoted-string pos = "[" *WSP positive-integer-value *WSP "]" quoted-string = (DQUOTE string DQUOTE) / (SQUOTE string SQUOTE) ;; путь leafref path-arg-str = < a string that matches the rule > < path-arg > path-arg = absolute-path / relative-path absolute-path = 1*("/" (node-identifier *path-predicate)) relative-path = 1*("../") descendant-path descendant-path = node-identifier [*path-predicate absolute-path] path-predicate = "[" *WSP path-equality-expr *WSP "]" path-equality-expr = node-identifier *WSP "=" *WSP path-key-expr path-key-expr = current-function-invocation *WSP "/" *WSP rel-path-keyexpr rel-path-keyexpr = 1*(".." *WSP "/" *WSP) *(node-identifier *WSP "/" *WSP) node-identifier ;; Ключевые слова, применяемые для регистро-чувствительных строк (RFC 7405) ;; Операторы action-keyword = %s"action" anydata-keyword = %s"anydata" anyxml-keyword = %s"anyxml" argument-keyword = %s"argument" augment-keyword = %s"augment" base-keyword = %s"base" belongs-to-keyword = %s"belongs-to" bit-keyword = %s"bit" case-keyword = %s"case" choice-keyword = %s"choice" config-keyword = %s"config" contact-keyword = %s"contact" container-keyword = %s"container" default-keyword = %s"default" description-keyword = %s"description" deviate-keyword = %s"deviate" deviation-keyword = %s"deviation" enum-keyword = %s"enum" error-app-tag-keyword = %s"error-app-tag" error-message-keyword = %s"error-message" extension-keyword = %s"extension" feature-keyword = %s"feature" fraction-digits-keyword = %s"fraction-digits" grouping-keyword = %s"grouping" identity-keyword = %s"identity" if-feature-keyword = %s"if-feature" import-keyword = %s"import" include-keyword = %s"include" input-keyword = %s"input" key-keyword = %s"key" leaf-keyword = %s"leaf" leaf-list-keyword = %s"leaf-list" length-keyword = %s"length" list-keyword = %s"list" mandatory-keyword = %s"mandatory" max-elements-keyword = %s"max-elements" min-elements-keyword = %s"min-elements" modifier-keyword = %s"modifier" module-keyword = %s"module" must-keyword = %s"must" namespace-keyword = %s"namespace" notification-keyword = %s"notification" ordered-by-keyword = %s"ordered-by" organization-keyword = %s"organization" output-keyword = %s"output" path-keyword = %s"path" pattern-keyword = %s"pattern" position-keyword = %s"position" prefix-keyword = %s"prefix" presence-keyword = %s"presence" range-keyword = %s"range" reference-keyword = %s"reference" refine-keyword = %s"refine" require-instance-keyword = %s"require-instance" revision-keyword = %s"revision" revision-date-keyword = %s"revision-date" rpc-keyword = %s"rpc" status-keyword = %s"status" submodule-keyword = %s"submodule" type-keyword = %s"type" typedef-keyword = %s"typedef" unique-keyword = %s"unique" units-keyword = %s"units" uses-keyword = %s"uses" value-keyword = %s"value" when-keyword = %s"when" yang-version-keyword = %s"yang-version" yin-element-keyword = %s"yin-element" ;; Прочие ключевые слова add-keyword = %s"add" current-keyword = %s"current" delete-keyword = %s"delete" deprecated-keyword = %s"deprecated" false-keyword = %s"false" invert-match-keyword = %s"invert-match" max-keyword = %s"max" min-keyword = %s"min" not-supported-keyword = %s"not-supported" obsolete-keyword = %s"obsolete" replace-keyword = %s"replace" system-keyword = %s"system" true-keyword = %s"true" unbounded-keyword = %s"unbounded" user-keyword = %s"user" and-keyword = %s"and" or-keyword = %s"or" not-keyword = %s"not" current-function-invocation = current-keyword *WSP "(" *WSP ")" ;; Базовые правила prefix-arg-str = < a string that matches the rule > < prefix-arg > prefix-arg = prefix prefix = identifier identifier-arg-str = < a string that matches the rule > < identifier-arg > identifier-arg = identifier identifier = (ALPHA / "_") *(ALPHA / DIGIT / "_" / "-" / ".") identifier-ref-arg-str = < a string that matches the rule > < identifier-ref-arg > identifier-ref-arg = identifier-ref identifier-ref = [prefix ":"] identifier string = < an unquoted string, as returned by > < the scanner, that matches the rule > < yang-string > yang-string = *yang-char ;; любой символ Unicode или ISO/IEC 10646, включая табуляцию, ;; возврат каретки и перевод строки, но исключая другие управляющие ;; символы C0, суррогатные блоки и «несимволы» yang-char = %x09 / %x0A / %x0D / %x20-D7FF / ; исключить суррогатные блоки %xD800-DFFF %xE000-FDCF / ; исключить несимвольные коды %xFDD0-FDEF %xFDF0-FFFD / ; исключить несимвольные коды %xFFFE-FFFF %x10000-1FFFD / ; исключить несимвольные коды %x1FFFE-1FFFF %x20000-2FFFD / ; исключить несимвольные коды %x2FFFE-2FFFF %x30000-3FFFD / ; исключить несимвольные коды %x3FFFE-3FFFF %x40000-4FFFD / ; исключить несимвольные коды %x4FFFE-4FFFF %x50000-5FFFD / ; исключить несимвольные коды %x5FFFE-5FFFF %x60000-6FFFD / ; исключить несимвольные коды %x6FFFE-6FFFF %x70000-7FFFD / ; исключить несимвольные коды %x7FFFE-7FFFF %x80000-8FFFD / ; исключить несимвольные коды %x8FFFE-8FFFF %x90000-9FFFD / ; исключить несимвольные коды %x9FFFE-9FFFF %xA0000-AFFFD / ; исключить несимвольные коды %xAFFFE-AFFFF %xB0000-BFFFD / ; исключить несимвольные коды %xBFFFE-BFFFF %xC0000-CFFFD / ; исключить несимвольные коды %xCFFFE-CFFFF %xD0000-DFFFD / ; исключить несимвольные коды %xDFFFE-DFFFF %xE0000-EFFFD / ; исключить несимвольные коды %xEFFFE-EFFFF %xF0000-FFFFD / ; исключить несимвольные коды %xFFFFE-FFFFF %x100000-10FFFD ; исключить несимвольные коды %x10FFFE-10FFFF integer-value = ("-" non-negative-integer-value) / non-negative-integer-value non-negative-integer-value = "0" / positive-integer-value positive-integer-value = (non-zero-digit *DIGIT) zero-integer-value = 1*DIGIT stmtend = optsep (";" / "{" stmtsep "}") stmtsep sep = 1*(WSP / line-break) ; безусловный разделитель optsep = *(WSP / line-break) stmtsep = *(WSP / line-break / unknown-statement) line-break = CRLF / LF non-zero-digit = %x31-39 decimal-value = integer-value ("." zero-integer-value) SQUOTE = %x27 ; одинарная кавычка ;; Основные правила из RFC 5234 ALPHA = %x41-5A / %x61-7A ; A-Z / a-z CR = %x0D ; возврат каретки CRLF = CR LF ; Стандарт новой строки в Internet DIGIT = %x30-39 ; 0-9 DQUOTE = %x22 ; двойная кавычка HTAB = %x09 ; горизонтальная табуляция LF = %x0A ; перевод строки SP = %x20 ; пробел WSP = SP / HTAB ; пустое пространство (пробел) <CODE ENDS>
15. Отклики NETCONF об ошибках, связанных с YANG
Множество откликов NETCONF об ошибках определено для ошибок, связанных с обработкой модели данных. Если имеющий отношение к делу оператор YANG имеет субоператор error-app-tag, этот оператор заменяет принятое по умолчанию значение, описанное ниже.
15.1. Сообщение для данных, нарушающих unique
Если операция NETCONF будет давать конфигурацию, в которой ограничение unique перестает выполняться, должна возвращаться описанная ниже ошибка.
error-tag: отказ операции error-app-tag: данные не уникальны error-info: <non-unique>: содержит экземпляр идентификатора, указывающий на лист, нарушающий ограничение unique. Этот элемент указывает 1 раз для каждого не уникального leaf. Элемент <non-unique> относится к пространству имен YANG urn:ietf:params:xml:ns:yang:1.
15.2. Сообщение для данных, нарушающих max-elements
Если операция NETCONF будет создавать конфигурацию, где узел list или leaf-list включает слишком много элементов, должна возвращаться описанная ниже ошибка.
error-tag: отказ операции
error-app-tag: слишком много элементов
Эта ошибка возвращается однократно и error-path указывает узел списка, даже при возникновении более одного избыточного потомка.
15.3. Сообщение для данных, нарушающих min-elements
Если операция NETCONF будет создавать конфигурацию, где узел list или leaf-list включает слишком мало элементов, должна возвращаться описанная ниже ошибка.
error-tag: отказ операции
error-app-tag: слишком мало элементов
Эта ошибка возвращается однократно и error-path указывает узел списка, даже при возникновении более одного недостающего потомка.
15.4. Сообщение для данных, нарушающих must
Если операция NETCONF будет создавать конфигурацию, где нарушены ограничения, заданные оператором must, должна возвращаться описанная ниже ошибка, если нет конкретного субоператора error-app-tag для оператора must.
error-tag: отказ операции
error-app-tag: нарушение must
15.5. Сообщение для данных, нарущающих require-instance
Если операция NETCONF будет создавать конфигурацию, где лист типа instance-identifier или leafref с оператором require-instance, имеющим значение true, указывает на несуществующий экземпляр, должна возвращаться описанная ниже ошибка.
error-tag: данные отсутствуют error-app-tag: требуется экземпляр error-path: путь к instance-identifier или leafref.
15.6. Сообщение для данных, нарушающих обязательный choice
Если операция NETCONF будет создавать конфигурацию, где не существует узлов в обязательном выборе (choice), должна возвращаться описанная ниже ошибка.
error-tag: данные отсутствуют error-app-tag: отсутствует choice error-path: путь к элементу с отсутствующим choice. error-info: <missing-choice>: имя отсутствующего обязательного оператора choice. Элемент <missing-choice> относится к пространству имен YANG urn:ietf:params:xml:ns:yang:1.
15.7. Сообщение для данных, нарушающих insert
Если в <edit-config> используется insert и атрибут key или value для узла list или leaf-list и key или value указывает несуществующий экземпляр, должна возвращаться описанная ниже ошибка.
error-tag: bad-attribute
error-app-tag: missing-instance
16. Взаимодействие с IANA
Этот документ регистрирует один идентификатор URN для возможности из реестра Network Configuration Protocol (NETCONF) Capability URNs.
-
Индекс
Идентификатор возможности
:yang-library
urn:ietf:params:netconf:capability:yang-library:1.0
17. Вопросы безопасности
Этот документ определяет язык для записи и чтения описаний управляющей информации. Язык сам по себе не оказывает влияния на безопасность Internet.
Применимы соображения по части безопасности, рассмотренные для протокола NETCONF (раздел 9 в [RFC6241]).
Данные, моделируемые в YANG, могут содержать деликатную информацию. RPC и уведомления, определенные в YANG могут служить для переноса деликатной информации.
Имеются вопросы безопасности, связанные с использованием данных, моделируемых в YANG. Такие вопросы следует рассматривать в документах, описывающих модели данных и документах для интерфейсом, применяемых для работы с данными (например, в документах NETCONF).
Данные, моделируемые в YANG, зависят от:
-
безопасности передающей инфраструктуры, используемой для обмена деликатной информацией;
-
безопасности приложений, которые хранят и выпускают такую деликатную информацию;
-
адекватности механизмов аутентификации и контроля доступа для ограничения доступа к данным.
Анализаторы YANG должны быть отказоустойчивы к документам с некорректным форматированием. Чтение некорректно сформированных документов из неизвестных или недоверенных источников может приводить к получению атакующим привилегий пользователя, применяющего анализатор YANG. В предельном случае это может подвергать риску всю машину.
18. Литература
18.1. Нормативные документы
[ISO.10646] International Organization for Standardization, «Information Technology — Universal Multiple-Octet Coded Character Set (UCS)», ISO Standard 10646:2014, 2014.
[RFC2119] Bradner, S., «Key words for use in RFCs to Indicate Requirement Levels», BCP 14, RFC 2119, DOI 10.17487/RFC2119, March 1997, <http://www.rfc-editor.org/info/rfc2119>.
[RFC3629] Yergeau, F., «UTF-8, a transformation format of ISO 10646», STD 63, RFC 3629, DOI 10.17487/RFC3629, November 2003, <http://www.rfc-editor.org/info/rfc3629>.
[RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, «Uniform Resource Identifier (URI): Generic Syntax», STD 66, RFC 3986, DOI 10.17487/RFC3986, January 2005, <http://www.rfc-editor.org/info/rfc3986>.
[RFC4648] Josefsson, S., «The Base16, Base32, and Base64 Data Encodings», RFC 4648, DOI 10.17487/RFC4648, October 2006, <http://www.rfc-editor.org/info/rfc4648>.
[RFC5234] Crocker, D., Ed., and P. Overell, «Augmented BNF for Syntax Specifications: ABNF», STD 68, RFC 5234, DOI 10.17487/RFC5234, January 2008, <http://www.rfc-editor.org/info/rfc5234>.
[RFC5277] Chisholm, S. and H. Trevino, «NETCONF Event Notifications», RFC 5277, DOI 10.17487/RFC5277, July 2008, <http://www.rfc-editor.org/info/rfc5277>.
[RFC6241] Enns, R., Ed., Bjorklund, M., Ed., Schoenwaelder, J., Ed., and A. Bierman, Ed., «Network Configuration Protocol (NETCONF)», RFC 6241, DOI 10.17487/RFC6241, June 2011, <http://www.rfc-editor.org/info/rfc6241>.
[RFC7405] Kyzivat, P., «Case-Sensitive String Support in ABNF», RFC 7405, DOI 10.17487/RFC7405, December 2014, <http://www.rfc-editor.org/info/rfc7405>.
[RFC7895] Bierman, A., Bjorklund, M., and K. Watsen, «YANG Module Library», RFC 7895, DOI 10.17487/RFC7895, June 2016, <http://www.rfc-editor.org/info/rfc7895>.
[XML] Bray, T., Paoli, J., Sperberg-McQueen, C., Maler, E., and F. Yergeau, «Extensible Markup Language (XML) 1.0 (Fifth Edition)», W3C Recommendation REC-xml-20081126, November 2008, <https://www.w3.org/TR/2008/REC-xml-20081126/>.
[XML-NAMES] Bray, T., Hollander, D., Layman, A., Tobin, R., and H. Thompson, «Namespaces in XML 1.0 (Third Edition)», World Wide Web Consortium Recommendation REC-xml-names-20091208, December 2009, <http://www.w3.org/TR/2009/REC-xml-names-20091208>.
[XPATH] Clark, J. and S. DeRose, «XML Path Language (XPath) Version 1.0», World Wide Web Consortium Recommendation REC-xpath-19991116, November 1999, <http://www.w3.org/TR/1999/REC-xpath-19991116>.
[XSD-TYPES] Biron, P. and A. Malhotra, «XML Schema Part 2: Datatypes Second Edition», World Wide Web Consortium Recommendation REC-xmlschema-2-20041028, October 2004, <http://www.w3.org/TR/2004/REC-xmlschema-2-20041028>.
18.2. Дополнительная литература
[CoMI] van der Stok, P. and A. Bierman, «CoAP Management Interface», Work in Progress, draft-vanderstok-core-comi-09, March 2016.
[IEEE754-2008] IEEE, «IEEE Standard for Floating-Point Arithmetic», IEEE 754-2008, DOI 10.1109/IEEESTD.2008.4610935, 2008, <http://standards.ieee.org/findstds/standard/754-2008.html>.
[RESTCONF] Bierman, A., Bjorklund, M., and K. Watsen, «RESTCONF Protocol», Work in Progress1, draft-ietf-netconf-restconf-16, August 2016.
[RFC2578] McCloghrie, K., Ed., Perkins, D., Ed., and J. Schoenwaelder, Ed., «Structure of Management Information Version 2 (SMIv2)», STD 58, RFC 2578, DOI 10.17487/RFC2578, April 1999, <http://www.rfc-editor.org/info/rfc2578>.
[RFC2579] McCloghrie, K., Ed., Perkins, D., Ed., and J. Schoenwaelder, Ed., «Textual Conventions for SMIv2», STD 58, RFC 2579, DOI 10.17487/RFC2579, April 1999, <http://www.rfc-editor.org/info/rfc2579>.
[RFC3780] Strauss, F. and J. Schoenwaelder, «SMIng — Next Generation Structure of Management Information», RFC 3780, DOI 10.17487/RFC3780, May 2004, <http://www.rfc-editor.org/info/rfc3780>.
[RFC4844] Daigle, L., Ed., and Internet Architecture Board, «The RFC Series and RFC Editor», RFC 4844, DOI 10.17487/RFC4844, July 2007, <http://www.rfc-editor.org/info/rfc4844>.
[RFC6020] Bjorklund, M., Ed., «YANG — A Data Modeling Language for the Network Configuration Protocol (NETCONF)», RFC 6020, DOI 10.17487/RFC6020, October 2010, <http://www.rfc-editor.org/info/rfc6020>.
[RFC6643] Schoenwaelder, J., «Translation of Structure of Management Information Version 2 (SMIv2) MIB Modules to YANG Modules», RFC 6643, DOI 10.17487/RFC6643, July 2012, <http://www.rfc-editor.org/info/rfc6643>.
[RFC6991] Schoenwaelder, J., Ed., «Common YANG Data Types», RFC 6991, DOI 10.17487/RFC6991, July 2013, <http://www.rfc-editor.org/info/rfc6991>.
[RFC7951] Lhotka, L., «JSON Encoding of Data Modeled with YANG», RFC 7951, DOI 10.17487/RFC7951, August 2016, <http://www.rfc-editor.org/info/rfc7951>.
[XPATH2.0] Berglund, A., Boag, S., Chamberlin, D., Fernandez, M., Kay, M., Robie, J., and J. Simeon, «XML Path Language (XPath) 2.0 (Second Edition)», World Wide Web Consortium Recommendation REC-xpath20-20101214, December 2010, <http://www.w3.org/TR/2010/REC-xpath20-20101214>.
[XSLT] Clark, J., «XSL Transformations (XSLT) Version 1.0», World Wide Web Consortium Recommendation REC-xslt-19991116, November 1999, <http://www.w3.org/TR/1999/REC-xslt-19991116>.
[YANG-Guidelines] Bierman, A., «Guidelines for Authors and Reviewers of YANG Data Model Documents», Work in Progress, draft-ietf-netmod-rfc6087bis-07, July 2016.
Благодарности
Редактор благодарит перечисленных ниже людей, которые предоставили полезные комментарии к предварительным вариантам этого документа: Mehmet Ersue, Washam Fan, Joel Halpern, Per Hedeland, Leif Johansson, Ladislav Lhotka, Lionel Morand, Gerhard Muenz, Peyman Owladi, Tom Petch, Randy Presuhn, David Reid, Jernej Tuljak, Kent Watsen, Bert Wijnen, Robert Wilton и Dale Worley.
Участники работы
Ниже перечислены люди, внесшие существенный вклад в разработку исподного документа YANG:
-
Andy Bierman (YumaWorks)
-
Balazs Lengyel (Ericsson)
-
David Partain (Ericsson)
-
Juergen Schoenwaelder (Jacobs University Bremen)
-
Phil Shafer (Juniper Networks)
Адрес автора
Martin Bjorklund (редактор)
Tail-f Systems
Email: mbj@tail-f.com
Перевод на русский язык
Николай Малых