RFC 7950 (часть 4)

Please enter banners and links.

image_print

Часть 3


8. Ограничения

8.1. Ограничения для данных

Некоторые операторы YANG задают ограничения для данных. Эти ограничения реализуются разными способами в зависимости от от типа данных, определяемого оператором.

  • Если ограничение задано для данных конфигурации, оно должно выполняться в дереве данных конфигурации.

  • Если ограничение задано для данных состояния, оно должно выполняться в дереве данных состояния.

  • Если ограничение задано для содержимого уведомления, оно должно выполняться в дереве данных уведомления.

  • Если ограничение задано для входных параметров RPC или операции (action), оно должно выполняться при вызове RPC или операции.

  • Если ограничение задано для выходных параметров RPC или операции (action), оно должно выполняться в откликах RPC или операции.

Приведенные ниже условия должны соблюдаться (true) для всех деревьев данных:

  • все значения данных листа (leaf) должны соответствовать ограничениям типа для листа, включая ограничения определенные для этого типа свойствами range, length и pattern;

  • все листья ключей (key leaf) должны присутствовать для всех элементов списка;

  • узлы должны присутствовать не более чем в одном варианте (case) во всех операторах choice;

  • не должно присутствовать узлов с меткой if-feature, если выражение if-feature определяется сервером как false.

  • не должно присутствовать узлов с оператором when, если условие when преобразуется в дереве данных в значение false.

Приведенные ниже условия должны соблюдаться (true) для действительного дерева данных:

  • все ограничения must должны давать значение true;

  • все ограничения на целостность ссылок, заданные оператором path, должны соблюдаться;

  • все ограничения unique для списков должны соблюдаться;

  • ограничения оператора mandatory выполняются для листьев (leaf) и выбора (choice), если узел или любой из его предков не имеет условия when или выражения if-feature, дающего значение false;

  • ограничения операторов min-elements и max-elements выполняются для списков (list) и узлов leaf-list, если узел или любой из его предков не имеет условия when или выражения if-feature, дающего значение false.

Рабочее хранилище конфигурации всегда должно быть действительным (пригодным).

8.2. Изменение данных конфигурации

  • Если запрос создает узлы данных конфигурации в рамках оператора выбора (choice), все существующие узлы из других вариантов выбора удаляются сервером.

  • Если запрос изменяет данные конфигурации так, что в любом узле выражение when дает результат false, сервер удаляет из дерева данных узлы с выражениями when.

8.3. Модель применения ограничений NETCONF

Для данных конфигурации имеется три «окна», где ограничения должны применяться:

  • в процессе анализа содержимого (payload) RPC;

  • в процессе выполнения операции <edit-config>;

  • в процессе проверки пригодности (validation).

Каждый из этих вариантов рассматривается в последующих параграфах.

8.3.1. Анализ данных

Полученное содержимое RPC должно иметь корректный формат XML, а также следовать иерархии и правилам, определяемым моделями, которые сервер реализует.

  • Если значение данных листа (leaf) не соответствует ограничениям типа листа, включая определенные свойствами range, length и pattern, сервер должен ответить сообщением <rpc-error> с тегом <error-tag> invalid-value, а также error-app-tag (параграф 7.5.4.2) и error-message (параграф 7.5.4.1), связанными с ограничениями, если они имеются.

  • Если все ключи элемента списка отсутствуют, сервер должен передать <error-tag> с missing-element в сообщении <rpc-error>.

  • Если присутствуют данные для нескольких вариантов (case) оператора выбора choice, сервер должен передать <error-tag> с bad-element в сообщении <rpc-error>.

  • Если данные для узла имеют метку if-feature, а выражение if-feature дает значение false на сервере, сервер должен передать <error-tag> с unknown-element в сообщении <rpc-error>.

  • Если присутствуют данные для узла с оператором when, который дает значение false, сервер должен передать <error-tag> с unknown-element в сообщении <rpc-error>.

  • Если при обработке вставки узла значения атрибутов before и after не подходят для типа ключевых листьев, сервер должен передать <error-tag> с bad-attribute в сообщении <rpc-error>.

  • Если атрибуты before и after появляются в каком-либо списке, для которого свойство ordered-by имеет значение user, сервер должен передать <error-tag> с unknown- attribute в сообщении <rpc-error>.

8.3.2. Обработка NETCONF <edit-config>

После анализа входных данных сервер NETCONF выполняет операцию <edit-config>, применяя данные к хранилищу конфигурации. В течение этой обработки должны детектироваться следующие ошибки:

  • запросы на удаление не существующих данных;

  • запросы на создание уже имеющихся данных;

  • запросы вставки с параметрами before или after, указывающими отсутствующие элементы;

  • запросы на изменение для узлов с оператором when, дающим значение false; в этом случае сервер должен передать <error-tag> с unknown-element в сообщении <rpc-error>.

8.3.3. Проверка пригодности

По завершении обработки хранилища данных окончательное содержимое должно соответствовать всем ограничениям пригодности. Эта проверка выполняется в разное время в зависимости от хранилища данных. Если хранилище является рабочим (running) или стартовым (startup), ограничения должны применяться в конце операции <edit-config> или <copy-config>. Если хранилище является «будущим» (candidate), применение ограничений откладывается до вызова операции <commit> или <validate>.

9. Встроенные типы

Язык YANG имеет набор встроенных типов, похожий на используемые в языках программирования, но с некоторыми отличиями, обусловленными специальными требованиями управления информационными моделями.

Могут определяться дополнительные производные типы на основе встроенных и других производных типов. Производные типы могут использовать субтипы для формального ограничения возможных значений.

Различные встроенные типы и производные от них позволяют организовать разные субтипы для ограничения размера и соответствия строкам регулярных выражений (параграфы 9.4.4 и 9.4.5), а также ограничения диапазонов числовых значений (параграф 9.2.4).

Лексическое представление значений некоторых типов применяется в кодировании XML и при задании принятых по умолчанию значений и числовых диапазонов в модулях YANG.

9.1. Каноническое представление

Для большинства типов существует одно каноническое представление значений данного типа. Некоторые типы разрешают множество лексических представлений одного и того же значения, например, положительное число 17 можно записать как +17 или 17. Реализации должны поддерживать все лексические представления, заданные в этом документе.

Когда сервер передает данные в представлении XML, он должен использовать каноническую форму, определенную в этом разделе. Другие представления могут использовать иные варианты. Отметим однако, что значения в дереве данных концептуально храняться в каноническом представлении, как указано здесь. В частности, оценка выражений XPath выполняется с использованием канонической формы, если тип данных имеет такую форму. Если у типа данных нет канонической формы, формат значения должен соответствовать лексическому представлению типа данных, но точный формат зависит от реализации.

Некоторые типы имеют лексическое представление, которое зависит от кодирования, например от контекста XML. Такие типы не имеют канонической формы.

9.2. Целочисленные встроенные типы

Язык YANG использует встроенные целочисленные типы int8, int16, int32, int64, uint8, uint16, uint32 и uint64. Они представляют числа разной размерности со знаком или без него:

int8 представляет целые числа от -128 до 127, включительно;

int16 представляет целые числа от -32768 до 32767, включительно;

int32 представляет целые числа от -2147483648 до 2147483647, включительно;

int64 представляет целые числа от -9223372036854775808 до 9223372036854775807, включительно;

uint8 представляет целые числа от 0 до 255, включительно;

uint16 представляет целые числа от 0 до 65535, включительно;

uint32 представляет целые числа от 0 до 4294967295, включительно;

uint64 представляет целые числа от 0 до 18446744073709551615, включительно.

9.2.1. Лексическое представление

Целое число лексически представляется необязательным знаком (+ или -), за которым следуют десятичные цифры. Если знак не указан, предполагается +.

Для удобства при задании используемого по умолчанию целочисленного значения в модуле YANG может применяться другое лексическое представление с использованием шестнадцатеричной или восьмеричной записи. Шестнадцатеричное представление начинается с необязательного знака (+ или -), за которым следует пара символов 0x, а далее последовательность шестнадцатеричных цифр, в которой могут использоваться символы верхнего или нижнего регистра (a – f, A – F). Восьмеричное представления начинается с необязательного знака (+ или -), за которым следует символ 0 и последовательность восьмеричных цифр (0 – 7).

Отметим, что принятое по умолчанию значение в модуле YANG, которое начинается с нуля (0), интерпретируется как восьмеричное число. В представлении XML все числа считаются десятичными и нули в начале значение допускаются.

Примеры:

     // пригодные значения
     +4711                       // допустимое положительное значение
     4711                        // допустимое положительное значение
     -123                        // допустимое отицательное значение
     0xf00f                      // допустимое положительное шестнадцатеричное значение
     -0xf                        // допустимое отицательное шестнадцатеричное значение
     052                         // допустимое положительное восьмеричное значение

     // непригодные значения
     - 1                         // недопустимый пробел

9.2.2. Каноническая форма

Каноническая форма положительного целого числа не включает знака +. Нули в начале последовательности цифр не допускаются. Нулевое значение представляется одним символом 0.

9.2.3. Ограничения

Все целые числа могут ограничиваться с помощью оператора range (параграф 9.2.4).

9.2.4. Оператор range

Оператор range, является необязательным субоператором для оператора type и принимает в качестве аргумента строку, выражающую диапазон. Субоператор служит для ограничения диапазонов значений целых и десятичных встроенных типов и производных от них.

Диапазон задается явным значением или включительной нижней границей, за которой следуют два символа точки (..) и включительное значение верхней границы. Возможно задание множества значений или диапазонов, разделенных символом |. При задании множеств диапазонов они должны быть не пересекающимися и должны указываться в порядке роста значений. Если ограничение range применяется к типу, который уже имеет такие ограничения, новое ограничение должно соответствовать имеющемуся или быть более сильным (т. е. повышающим нижнюю или/и снижающим верхнюю границу, удаляющим явно заданные значения или расщепляющим диапазон на поддиапазоны с зазорами между ними). Каждое явное значение и граница диапазона в выражении range должно соответствовать ограничиваемому типу или быть одним из специальных значений min или max (минимальное и максимальное допустимые значения для типа, соответственно).

Синтаксис выражения range формально определяется правилом range-arg в разделе 14.

9.2.4.1. Субоператоры для range

Субоператор

Параграф

Число элементов

description

7.21.3

0..1

error-app-tag

7.5.4.2

0..1

error-message

7.5.4.1

0..1

reference

7.21.4

0..1

9.2.5. Пример использования
     typedef my-base-int32-type {
       type int32 {
         range "1..4 | 10..20";
       }
     }

     typedef my-type1 {
       type my-base-int32-type {
         // допустимое ограничение диапазона
         range "11..max"; // 11..20
       }
     }

     typedef my-type2 {
       type my-base-int32-type {
         // недопустимое ограничение диапазона
         range "11..100";
       }
     }

9.3. Встроенный тип decimal64

Встроенный тип decimal64 представляет подмножество действительных чисел, которые могут быть выражены последовательностями десятичных цифр. Пространство значений decimal64 представляет собой подмножество значений, которые могут быть получены путем умножения 64-битового целого числа со знаком на отрицательную степень числа 10 (т. е. значения вида i * 10-n, где i — значение типа integer64, n — целое число от 1 до 18, включительно).

9.3.1. Лексическое представление

Значение decimal64 лексически представляется необязательным знаком (+ или -), за которым следует набор десятичных цифр, а за ним может следовать символ точки (.) в качестве разделителя целой и дробной части и цепочка десятичных цифр дробной части. Если знак не указан, по умолчанию предполагается +.

9.3.2. Каноническая форма

Каноническая форма положительного значения decimal64 не включает знак +. Десятичная точка обязательна. Нули в начале и в конце (дробной части) числа использовать запрещено с учетом того, что перед десятичной точкой и после нее должна присутствовать хотя бы одна цифра. Нулевое значение представляется в виде 0.0.

9.3.3. Ограничения

Тип decimal64 может быть ограничен с помощью оператора range (параграф 9.2.4).

9.3.4. Оператор fraction-digits

Оператор fraction-digits, который служит субоператором для type, должен присутствовать для типа decimal64. Он принимает в качестве аргумента целое число от 1 до 18, включительно. Это значение управляет разностью между смежными значениями decimal64 путем ограничения пространства значений, которое выражается как i * 10-n, n – число цифр дробной части.

В таблице представлены минимальные и максимальные значения для каждого размера дробной части.

Цифр после запятой

Минимум

Максимум

1

-922337203685477580.8

922337203685477580.7

2

-92233720368547758.08

92233720368547758.07

3

-9223372036854775.808

9223372036854775.807

4

-922337203685477.5808

922337203685477.5807

5

-92233720368547.75808

92233720368547.75807

6

-9223372036854.775808

9223372036854.775807

7

-922337203685.4775808

922337203685.4775807

8

-92233720368.54775808

92233720368.54775807

9

-9223372036.854775808

9223372036.854775807

10

-922337203.6854775808

922337203.6854775807

11

-92233720.36854775808

92233720.36854775807

12

-9223372.036854775808

9223372.036854775807

13

-922337.2036854775808

922337.2036854775807

14

-92233.72036854775808

92233.72036854775807

15

-9223.372036854775808

9223.372036854775807

16

-922.3372036854775808

922.3372036854775807

17

-92.23372036854775808

92.23372036854775807

18

-9.223372036854775808

9.223372036854775807

9.3.5. Пример использования

     typedef my-decimal {
       type decimal64 {
         fraction-digits 2;
         range "1 .. 3.14 | 10 | 20..max";
       }
     }

9.4. Встроенный тип string

Встроенный тип string представляет в языке YANG текстовые строки, предназначенные для человека. Допустимо использование символов кодировок Unicode и ISO/IEC 10646 [ISO.10646], включая табуляцию, возврат каретки и перевод строки, но исключая управляющие символы C0, суррогатные блоки и несимволы (noncharacter). Синтаксис string формально определяется правилом yang-string в разделе 14.

9.4.1. Лексическое представление

Значение string лексически представляется символьными данными в формате XML.

9.4.2. Каноническая форма

Каноническая форма совпадает с лексическим представлением. Нормализация Unicode для string не применяется.

9.4.3. Ограничения

Строка (string) может быть ограничена операторами length (параграф 9.4.4) и pattern (параграф 9.4.5).

9.4.4. Оператор length

Оператор length, который является необязательным субоператором для type, принимает в качестве аргумента строку с выражением размера. Оператор служит для ограничения встроенных типов string и binary, а также производных от них.

Оператор length ограничивает число символов Unicode в строке.

Диапазон размеров задается явным значением1 или включительной нижней границей, за которой следуют два символа точки (..) и включительное значение верхней границы. Возможно задание множества значений или диапазонов, разделенных символом |. При задании множеств диапазонов они должны быть не пересекающимися и должны указываться в порядке роста значений. Использование отрицательных значений недопустимо. Если ограничение диапазона применяется к типу, который уже имеет такие ограничения, новое ограничение должно соответствовать имеющемуся или быть более сильным (т. е. повышающим нижнюю или/и снижающим верхнюю границу, удаляющим явно заданные значения или расщепляющим диапазон на поддиапазоны с зазорами между ними). Значение размера представляет собой неотрицательное целое число или одно из специальных значений min или max (минимальное и максимальное допустимые значения для типа, соответственно). От реализаций не требуется поддержка размеров больше 18446744073709551615.

Синтаксис выражения length формально описывается правилом length-arg в разделе 14.

9.4.4.1. Субоператоры для length

Субоператор

Параграф

Число элементов

description

7.21.3

0..1

error-app-tag

7.5.4.2

0..1

error-message

7.5.4.1

0..1

reference

7.21.4

0..1

9.4.5. Оператор pattern

Оператор pattern, который является необязательным субоператором для type, принимает в качестве аргумента строку регулярного выражения, в соответствии с определением [XSD-TYPES]. Он служит для ограничения встроенного типа string и производных от него типов, значениями, которые соответствуют шаблону pattern.

Если тип (type) имеет множество операторов pattern, выражения объединяются логической операцией AND (И), т. е. строка должна соответствовать всем выражениям.

Если шаблонные ограничения применяются к типу, который уже имеет ограничения по шаблонам, значения должны соответствовать всем шаблонам базового типа в дополнение к новым шаблонам.

9.4.5.1. Субоператоры для pattern

Субоператор

Параграф

Число элементов

description

7.21.3

0..1

error-app-tag

7.5.4.2

0..1

error-message

7.5.4.1

0..1

modifier

9.4.6

0..1

reference

7.21.4

0..1

9.4.6. Оператор modifier

Оператор modifier, который является необязательным субоператором для pattern, принимает в качестве аргумента строку invert-match.

Если в шаблоне присутствует модификатор invert-match, тип ограничивается значениями, не соответствующими шаблону.

9.4.7. Пример использования

Для приведенного ниже определения типа

     typedef my-base-str-type {
       type string {
         length "1..255";
       }
     }

приемлемо уточнение

     type my-base-str-type {
       // допустимое уточнение размера
       length "11 | 42..max"; // 11 | 42..255
     }

а приведенное ниже уточнение недопустимо

     type my-base-str-type {
       // недопустимое уточнение размера
       length "1..999";
     }

Для определенного ниже типа

     type string {
       length "0..4";
       pattern "[0-9a-fA-F]*";
     }

приведенные ниже строки будут соответствовать ограничению

     AB          // допустимо
     9A00        // допустимо

а две следующих строки не будут

     00ABAB      // недопустимо, слишком длинное
     xx00        // недопустимо, непригодные символы

Для типа

     type string {
       length "1..max";
       pattern '[a-zA-Z_][a-zA-Z0-9\-_.]*';
       pattern '[xX][mM][lL].*' {
         modifier invert-match;
       }
     }

приведенная ниже строка будет соответствовать ограничению

     enabled     // допустимо

а следующие строки не соответствуют

     10-mbit     // недопустимо, начинается с числа
     xml-element // недопустимо, начинается с недопустимой последовательности xml

9.5. Встроенный тип boolean

Встроенный тип boolean представляет логические значения.

9.5.1. Лексическое представление

Лексическое представление типа boolean имеет два значения true и false, которые должны указываться символами нижнего регистра.

9.5.2. Каноническая форма

Каноническая форма совпадает с лексическим представлением.

9.5.3. Ограничения

Тип boolean не может быть ограничен.

9.6. Встроенный тип enumeration

Встроенный тип enumeration представляет значения из набора заданных имен.

9.6.1. Лексическое представление

Лексическим представлением значения enumeration является строка назначенного имени.

9.6.2. Каноническая форма

Канонической формой является строка назначенного имени.

9.6.3. Ограничения

Тип enumeration может быть ограничен с помощью одного или нескольких операторов enum (параграф 9.6.4), которые указывают подмножество значений базового типа.

9.6.4. Оператор enum

Оператор enum, который является субоператором для type, должен присутствовать для типа enumeration. Он может использоваться несколько раз для задания каждого назначенного имени типа enumeration. Оператор принимает в качестве аргумента строку назначенного имени. Недопустимо указание пустых строк (нулевой размер), а также недопустимо добавление пробельных символов (любые символы Unicode со свойством White_Space) в начале или в конце назначенного имени. Следует избегать использования в именах управляющих кодов Unicode.

Оператор может включать необязательный блок субоператоров с дополнительной информацией.

Назначенные имена в enumeration должны быть уникальными.

При ограничении типа enumeration набор имен нового типа должен быть подмножеством базового набора назначенных имен. Недопустимо изменять эти назначенные имена.

9.6.4.1. Субоператоры для enum

Субоператор

Параграф

Число элементов

description

7.21.3

0..1

if-feature

7.20.2

0..n

reference

7.21.4

0..1

status

7.21.2

0..1

value

9.6.4.2

0..1

9.6.4.2. Оператор value

Необязательный оператор value используется для связывания целочисленного значения с назначенным именем для enum. Это должно быть целое число из диапазона от -2147483648 до 2147483647 и значение должно быть уникальным в рамках типа enumeration.

Если значение не задано, оно будет назначаться автоматически. В таких случаях при первом определении будет назначаться значение (0), а противном случае будет назначаться значение, превышающее на единицу максимальное из использованных значений enum (т. е максимальное значение, заданное явно или неявно до текущего субоператора enum в родительском операторе type).

Отметим, что присутствие if-feature в операторе enum не влияет на автоматически присваиваемые значения.

Если текущее максимальное значение составляет 2147483647, значение enum должно быть задано для субоператоров enum, следующих за текущим максимальным значением.

Когда существующий тип enumeration ограничен, оператор value должен иметь такое же значение как в базовом типе или отсутствовать и в этом случае значение также совпадет с базовым типом.

9.6.5. Пример использования

     leaf myenum {
       type enumeration {
         enum zero;
         enum one;
         enum seven {
           value 7;
         }
       }
     }

Лексическое представление листа myenum со значением seven будет иметь вид

     <myenum>seven</myenum>

Для приведенного определения типа (typedef)

     typedef my-base-enumeration-type {
       type enumeration {
         enum white {
           value 1;
         }
         enum yellow {
           value 2;
         }
         enum red {
           value 3;
         }
       }
     }

следующее уточнение будет допустимо

     type my-base-enumeration-type {
       // допустимое уточнение enum
       enum yellow;
       enum red {
         value 3;
       }
     }

а приведенное ниже уточнение недопустимо.

     type my-base-enumeration-type {
       // недопустимое уточнение enum
       enum yellow {
         value 4; // недопустимое значение
       }
       enum black; // недопустимое добавление нового имени
     }

В следующем примере показано, как enum можно пометить тегом if-feature, делающим значение допустимым лишь для серверов, анонсирующих соответствующую функцию.

     type enumeration {
       enum tcp;
       enum ssh {
         if-feature ssh;
       }
       enum tls {
         if-feature tls;
       }
     }

9.7. Встроенный тип bits

Встроенный тип bits представляет набор битов. Т. е. значение bits служит набором флагов, указанных целочисленными значениями позиции с отсчетом от 0. Каждому биту назначено имя.

Когда существующий тип bits ограничивается, набор назначенных имен нового типа должен быть подмножеством набора имен базового типа. Битовые позиции с такими назначенными именами менять недопустимо.

9.7.1. Ограничения

Тип bits может быть ограничен с помощью оператора bit (параграф 9.7.4).

9.7.2. Лексическое представление

Лексическое представление типа bits является списком разделенных пробелами назначенных имен флагов bits. Пустая строка говорит об отсутствии установленных флагов.

9.7.3. Каноническая форма

В канонической форме значения битов разделяются одним символом пробела и упорядочиваются по их позициям (см. параграф 9.7.4.2).

9.7.4. Оператор bit

Оператор bit, который служит субоператором для type, должен присутствовать для типа bits. Он используется многократно для каждого именованного бита типа bits. Оператор принимает в качестве аргумента строку с назначенным именем бита, за которой следует блок субоператоров с дополнительной информацией. Для назначенных имен используется такой же синтаксис, как для идентификаторов (см. параграф 6.2).

Назначенные имена в типе bits должны быть уникальными.

9.7.4.1. Субоператоры для bit

Субоператор

Параграф

Число элементов

description

7.21.3

0..1

if-feature

7.20.2

0..n

position

9.7.4.2

0..1

reference

7.21.4

0..1

status

7.21.2

0..1

9.7.4.2. Оператор position

Необязательный оператор position принимает в качестве аргумента неотрицательное целое число, которое задает позицию бита в предполагаемом битовом поле. Значение position должно лежать в диапазоне от 0 до 4294967295 и должно быть уникальным в данном типе bits.

Если позиция бита не задана, она назначается автоматически. Если субоператор bit задан в первый раз, присваивается значение 0, в противном случае присваивается значение на 1 больше текущего максимального значения битовой позиции (т. е. битовой позиции, явно или неявно заданной до текущего субоператора bit в родительском операторе type).

Отметим, что присутствие if-feature в операторе enum не влияет на автоматически присваиваемые значения.

Если текущее максимальное значение составляет 4294967295, битовая позиция должна быть задана для субоператоров bit, следующих за текущим максимальным значением.

Когда существующий тип bits ограничен, оператор position должен иметь такое же значение как в базовом типе или отсутствовать и в этом случае значение также совпадет с базовым типом.

9.7.5. Пример использования

Для приведенных ниже typedef и leaf

     typedef mybits-type {
       type bits {
         bit disable-nagle {
           position 0;
         }
         bit auto-sense-speed {
           position 1;
         }
         bit ten-mb-only {
           position 2;
         }
       }
     }

     leaf mybits {
       type mybits-type;
       default "auto-sense-speed";
     }

Лексическое представление листа с битовыми полями disable-nagle и ten-mb-only будет иметь вид

     <mybits>disable-nagle ten-mb-only</mybits>

Ниже показано допустимое уточнение этого типа

     type mybits-type {
       // допустимое уточнение bit
       bit disable-nagle {
         position 0;
       }
       bit auto-sense-speed {
         position 1;
       }
     }

А следующее уточнение недопустимо

     type mybits-type {
       // недопустимое уточнение bit
       bit disable-nagle {
         position 2; // недопустимая позиция
       }
       bit hundred-mb-only; // недопустимое добавление нового имени
     }

9.8. Встроенный тип binary

Встроенный тип binary представляет любые двоичные данные, т. е. последовательность октетов.

9.8.1. Ограничения

Тип binary может быть ограничен с помощью оператора length (параграф 9.4.4). Размер значения типа binary указывает число октетов.

9.8.2. Лексическое представление

Значения binary представляются с использованием схемы кодирования base64 (см. раздел 4 в [RFC4648]).

9.8.3. Каноническая форма

Каноническая форма значения binary следует правилам кодирования base64 [RFC4648].

9.9. Встроенный тип leafref

Встроенный тип leafref ограничен пространством значений некого узла leaf или leaf-list в дереве схемы и может быть дополнительно ограничен соответствующими экземплярами узлов в дереве данных. Субоператор path (параграф 9.9.2) служит для указания узла leaf или leaf-list в дереве схемы. Пространством значений ссылающегося узла является пространство значений узла, на который указывает ссылка.

Если свойство require-instance (параграф 9.9.3) имеет значение true, должен существовать узел в дереве данных, или узел, использующий принятое по умолчанию значение (см. параграфы 7.6.1 и 7.7.2), для указанного узла leaf или leaf-list в дереве схемы с таким же значением, как leafref в действительном дереве данных.

Если ссылающийся узел представляет данные конфигурации и свойство require-instance (параграф 9.9.3) имеет значение true, указанный ссылкой узел также должен представлять конфигурацию.

Недопустимы замкнутые цепочки ссылок leafrefs.

Если лист, на который указывает leafref, зависит от одной или нескольких функций (см. параграф 7.20.2), узел leaf с типом leafref также должен зависеть от того же набора функций.

9.9.1. Ограничения

Тип leafref может быть ограничен с помощью оператора require-instance (параграф 9.9.3).

9.9.2. Оператор path

Оператор path, являющийся субоператором для type, должен присутствовать для типа leafref. Оператор принимает в качестве аргумента строку, которая должна указывать на узел leaf или leaf-list.

Синтаксис аргумента path является подмножеством сокращенного синтаксиса XPath. Предикаты служат лишь для ограничения значений узлов ключей для элементов списка. Каждый предикат содержит в точности одну проверку равенства на ключ и может присутствовать множество смежных предикатов, если список имеет множество ключей. Синтаксис формально определен правилом path-arg в разделе 14.

Предикаты используются лишь в тех случаях, когда требуется более одной ссылки на ключ для однозначной идентификации экземпляра листа. Это происходит, если список имеет имеет множество ключей или нужна ссылка на лист, отличающаяся от ключа в списке. В таких случаях обычно задается множество leafref, а предикаты служат для их связывания воедино.

Выражение path дает набор узлов (возможно пустой). Если свойство require-instance имеет значение true, набор узлов должен быть непустым.

Выражение XPath в операторе path концептуально оценивается в перечисленных ниже вариантах контекста в дополнение к приведенному в параграфе 6.4.1 определению:

  • если оператор path определен внутри typedef, узлом контекста будет узел leaf или leaf-list в дереве данных, который ссылается на typedef;

  • в противном случае узлом контекста является узел в дереве данных для которого определен оператор path.

9.9.3. Оператор require-instance

Оператор require-instance, который является субоператором для type, может присутствовать для типов instance-identifier и leafref. Он принимает в качестве аргумента значение true или false. Если оператор отсутствует, по умолчанию принимается значение true.

Если require-instance имеет значение true, это означает, что экземпляр, на который указывается ссылка, должен существовать, чтобы данные были действительны. Ограничения применяются в соответствии с правилами раздела 8.

Если require-instance имеет значение false, это значит, что экземпляр, на который указывает ссылка, может существовать в действительных данных.

9.9.4. Лексическое представление

Значение leafref лексически представляется так же, как представляет свое значение узел leaf, на который указывает ссылка.

9.9.5. Каноническая форма

Каноническая форма leafref совпадает с канонической формой листа (leaf) на который указывает ссылка.

9.9.6. Пример использования

Для приведенного ниже списка

     list interface {
       key "name";
       leaf name {
         type string;
       }
       leaf admin-status {
         type admin-status;
       }
       list address {
         key "ip";
         leaf ip {
           type yang:ip-address;
         }
       }
     }

leafref указывает на существующий интерфейс

     leaf mgmt-interface {
       type leafref {
         path "../interface/name";
       }
     }

Ниже представлен соответствующий фрагмент XML.

     <interface>
       <name>eth0</name>
     </interface>
     <interface>
       <name>lo</name>
     </interface>

     <mgmt-interface>eth0</mgmt-interface>

Приведенный ниже оператор leafrefs указывает на существующий адрес интерфейса.

     container default-address {
       leaf ifname {
         type leafref {
           path "../../interface/name";
         }
       }
       leaf address {
         type leafref {
           path "../../interface[name = current()/../ifname]"
              + "/address/ip";
         }
       }
     }

Соответствующий фрагмент XML имеет вид

     <interface>
       <name>eth0</name>
       <admin-status>up</admin-status>
       <address>
         <ip>192.0.2.1</ip>
       </address>
       <address>
         <ip>192.0.2.2</ip>
       </address>
     </interface>
     <interface>
       <name>lo</name>
       <admin-status>up</admin-status>
       <address>
         <ip>127.0.0.1</ip>
       </address>
     </interface>

     <default-address>
       <ifname>eth0</ifname>
       <address>192.0.2.2</address>
     </default-address>

Приведенный ниже список использует leafref для одного из своих ключей. Это похоже на внешний ключ в реляционной базе данных.

     list packet-filter {
       key "if-name filter-id";
       leaf if-name {
         type leafref {
           path "/interface/name";
         }
       }
       leaf filter-id {
         type uint32;
       }
       ...
     }

Соответствующий фрагмент XML имеет вид

     <interface>
       <name>eth0</name>
       <admin-status>up</admin-status>
       <address>
         <ip>192.0.2.1</ip>
       </address>
       <address>
         <ip>192.0.2.2</ip>
       </address>
     </interface>

     <packet-filter>
       <if-name>eth0</if-name>
       <filter-id>1</filter-id>
       ...
     </packet-filter>
     <packet-filter>
       <if-name>eth0</if-name>
       <filter-id>2</filter-id>
       ...
     </packet-filter>

Приведенное ниже уведомление определяет два leafrefs для ссылки на существующий лист admin-status

     notification link-failure {
       leaf if-name {
         type leafref {
           path "/interface/name";
         }
       }
       leaf admin-status {
         type leafref {
           path "/interface[name = current()/../if-name]"
              + "/admin-status";
         }
       }
     }

Ниже приведен пример соответствующего уведомления XML.

     <notification
       xmlns="urn:ietf:params:xml:ns:netconf:notification:1.0">
       <eventTime>2008-04-01T00:01:00Z</eventTime>
       <link-failure xmlns="urn:example:system">
         <if-name>eth0</if-name>
         <admin-status>up</admin-status>
       </link-failure>
     </notification>

9.10. Встроенный тип identityref

Встроенный тип identityref служит для ссылок на существующие отождествления (см. параграф 7.18).

9.10.1. Ограничения

Тип identityref не может быть ограничен.

9.10.2. Оператор base для identityref

Оператор base, который является субоператором для type, должен присутствовать хотя бы однократно для типа identityref. Аргументом служит имя отождествления, определенное оператором identity. Если в имени отождествления имеется префикс, это говорит о том, что отождествление определено в модуле, который импортирован с этим префиксом. В остальных случаях отождествление с совпадающим именем должно быть определено в текущем модуле или включенном в него субмодуле.

Допустимыми значениями для identityref являются любые отождествления, произведенные из базового отождествления identityref. На конкретном сервере пригодные значения могут быть дополнительно ограничены набором отождествлений, определенных в модулях, которые реализованы на сервере.

9.10.3. Лексическое представление

Тип identityref лексически представляется как полное имя указанной ссылки в соответствии с [XML-NAMES]. Если префикс отсутствует, пространством имен identityref будет принятое по умолчанию пространство имен для элемента, содержащего значение identityref.

Когда identityref присваивается принятое по умолчанию значение с использованием оператора default, имя отождествления в принятом по умолчанию значении может включать префикс. Если префикс присутствует в имени отождествления, он указывает на отождествление, определенное в модуле, который был импортирован с этим префиксом, или префикс текущего модуля, если префикс указывает текущий модуль или один из его субмодулей. В остальных случаях отождествление с совпадающим именем должно быть определено в текущем модуле или одном из его субмодулей.

Строковое значение узла типа identityref в выражении must или when XPath является полным именем отождествления с присутствием префикса. Если указанное ссылкой отождествление определено в импортированном модуле, префикс в строковом значении является префиксом, определенным в соответствующем операторе import. В остальный случаях префикс в строковом значении является префиксом текущего модуля.

9.10.4. Каноническая форма

Поскольку лексическая форма зависит от контекста XML, в котором это значение имеет место, этот тип не имеет канонической формы.

9.10.5. Пример использования

С определениями отождествлений из параграфа 7.18.3 и приведенным ниже модулем

     module example-my-crypto {
       yang-version 1.1;
       namespace "urn:example:my-crypto";
       prefix mc;

       import "example-crypto-base" {
         prefix "crypto";
       }

       identity aes {
         base "crypto:crypto-alg";
       }

       leaf crypto {
         type identityref {
           base "crypto:crypto-alg";
         }
       }

       container aes-parameters {
         when "../crypto = 'mc:aes'";
         ...
       }
     }

Пример кодирования листа crypto для отождествления des3, определенного в модуле des будет иметь вид

     <crypto xmlns:des="urn:example:des">des:des3</crypto>

Все префиксы, использованные в представлении, являются локальными для каждого экземпляра представления. Это значит, что один и тот же identityref может по разному кодироваться разными реализациями. Ниже представлен другой пример кодирования того же листа.

     <crypto xmlns:x="urn:example:des">x:des3</crypto>

Если значение листа crypto вместо модуля aes определено в модуле example-my-crypto, кодирование может иметь вид

     <crypto xmlns:mc="urn:example:my-crypto">mc:aes</crypto>

или с использованием принятого по умолчанию пространства имен

     <crypto>aes</crypto>

9.11. Встроенный тип empty

Встроенный тип empty представляет лист, не имеющий какого-либо значения, он лишь дает информацию о наличии или отсутствии.

Тип empty не может иметь принятого по умолчанию значения.

9.11.1. Ограничения

Тип empty не может быть ограничен.

9.11.2. Лексическое представление

Не применимо.

9.11.3. Каноническая форма

Не применима.

9.11.4. Пример использования

Для показанного ниже листа

     leaf enable-qos {
       type empty;
     }

примером пригодного представления существования листа может быть

     <enable-qos/>

9.12. Встроенный тип union

Встроенный тип union представляет значение, которое соответствует типу одного из членов объединения.

Когда указан тип union, должен присутствовать оператор type (параграф 7.4). Он используется многократно для задания типа каждого члена объединения. Оператор принимает один аргумент, являющийся строкой с именам типа.

В объединение могут входить встроенные и производные типы.

При генерации представления XML значение кодируется в соответствии с типом члена объединения, к которому относится значение. При интерпретации XML значение проверяется на пригодность в соответствии с каждым типом объединения в порядке, заданном операторами type, пока не будет найдено совпадение. Совпадающий тип будет типом значения для узла, проходящего проверку, и представление интерпретируется в соответствии с правилами для этого типа.

Любое значение, принятое по умолчанию, или свойство units, определенное в типах членов, не наследуется типом union.

9.12.1. Ограничения

Тип union не может иметь ограничений. Однако каждый из входящих в объединение типов может иметь ограничения, определенные в разделе 9.

9.12.2. Лексическое представление

Лексическим представлением типа union является значение, которое соответствует представлению одного (любого) из входящих в объединение типов.

9.12.3. Каноническая форма

Каноническая форма значения union совпадает с канонической формой значения типа, входящего в объединение.

9.12.4. Пример использования

Ниже приведен пример объединения (union) типов int32 и enumeration.

     type union {
       type int32;
       type enumeration {
         enum "unbounded";
       }
     }

Следует соблюдать осторожность в тех случаях, когда член объединения имеет тип leafref, в котором свойство require-instance (параграф 9.9.3) имеет значение true. Если лист такого типа указывает существующий экземпляр, значение leaf должно заново проверяться на пригодность при удалении указанного экземпляра. Например, в приведенном ниже определении

     list filter {
       key name;
       leaf name {
         type string;
       }
       ...
     }

     leaf outbound-filter {
       type union {
         type leafref {
           path "/filter/name";
         }
         type enumeration {
           enum default-filter;
         }
       }
     }

предполагается, что в в списке filter существует элемент с именем http и лист outbound-filter имеет это значение

     <filter>
       <name>http</name>
     </filter>
     <outbound-filter>http</outbound-filter>

Если фильтр http будет удален, значение листа outbound-filter не будет соответствовать leafref и проверяется следующий тип в объединении. Текущее значение (http) не относится к типу enumeration, поэтому результирующая конфигурация будет недействительной.

Если вторым типом объединения будет string вместо enumeration, текущее значение будет соответствовать ему и результирующая конфигурация станет пригодной.

9.13. Встроенный тип instance-identifier

Встроенный тип instance-identifier служит для однозначной идентификации конкретного экземпляра узла в дереве данных.

Синтаксис для instance-identifier является подмножеством сокращенного синтаксиса XPath и формально определен правилом instance-identifier в разделе 14. Тип применяется для однозначной идентификации узлов в дереве данных. Предикаты применяются только для задания значений ключевых узлов элементов списка, значений элементов leaf-list или позиционных индексов в списках без ключей. Для идентификации элементов списка с ключами каждый предикат состоит из одной проверки равенства на ключ и каждый ключ должен иметь соответствующие предикат. Если ключ имеет тип empty, он представляется пустой строкой (“”).

Если лист типа instance-identifier представляет данные конфигурации и свойство require-instance (параграф 9.9.3) имеет значение true, узел, на который он ссылается, также должен представлять конфигурацию. Такой лист ограничивает пригодные данные. Узлы всех таких листьев должны указывать существующие узлы или узлы leaf или leaf-list, использующие принятые по умолчанию значения (см. параграфы 7.6.1 и 7.7.2), для того, чтобы данные были пригодны. Это ограничение применяется в соответствии с правилами раздела 8.

Выражение instance-identifier XPath концептуально проверяется в контексте корневого узла доступного дерева в дополнение к определению параграфа 6.4.1.

9.13.1. Ограничения

Тип instance-identifier может быть ограничен с помощью оператора require-instance (параграф 9.9.3).

9.13.2. Лексическое представление

Значение instance-identifier лексически представляется в форме строки. Все имена узлов в значении instance-identifier должны быть полными с явными префиксами пространства имен и эти префиксы должны быть заявлены в области действия пространства имен XML в элементе XML для instance-identifier.

Все префиксы, используемые в представлении, являются локальными для каждого экземпляра кодирования. Это означает, что instance-identifier может по разному кодироваться разными реализациями.

9.13.3. Каноническая форма

Поскольку лексическая форма зависит от контекста XML, в котором значение имеет место, для этого типа нет канонической формы.

9.13.4. Пример использования

Ниже приведены примеры использования идентификаторов экземпляра.

     /* instance-identifier для container */
     /ex:system/ex:services/ex:ssh

     /* instance-identifier для leaf */
     /ex:system/ex:services/ex:ssh/ex:port

     /* instance-identifier для элемента списка */
     /ex:system/ex:user[ex:name='fred']

     /* instance-identifier для leaf в элементе списка */
     /ex:system/ex:user[ex:name='fred']/ex:type

     /* instance-identifier для элемента списка с двумя ключами */
     /ex:system/ex:server[ex:ip='192.0.2.1'][ex:port='80']

     /* instance-identifier для элемента списка, где второй ключ 
        (enabled) имеет тип empty */
     /ex:system/ex:service[ex:name='foo'][ex:enabled='']

     /* instance-identifier для элемента leaf-list */
     /ex:system/ex:services/ex:ssh/ex:cipher[.='blowfish-cbc']

     /* instance-identifier для элемента списка без ключей */
     /ex:stats/ex:port[3]

10. Функции XPath

Этот документ определяет две базовых функции XPath и пять функций XPath для конкретных типов YANG. Подписи функций заданы с исползованием синтаксиса, применяемого в [XPATH].

10.1. Функция для набора узлов

10.1.1. current()

     node-set current()

Функция current() не принимает входных параметров и возвращает набор узлов с узлом начального контекста в качестве единственного члена.

10.1.1.1. Пример использования

Для списка

     list interface {
       key "name";
       ...
       leaf enabled {
         type boolean;
       }
       ...
     }

показанный ниже лист (leaf) определяет выражение must, которое обеспечивает активность (enable) указанного интерфейса

     leaf outgoing-interface {
       type leafref {
         path "/interface/name";
       }
       must '/interface[name=current()]/enabled = "true"';
     }

10.2. Функция для строк

10.2.1. re-match()

     boolean re-match(string subject, string pattern)

Функция re-match() возвращает значение true, если строка subject соответствует регулярному выражению pattern. В остальных случаях возвращается значение false.

Функция re-match() проверяет соответствие строки заданному регулярному выражению. Используемое регулярное выражение является регулярным выражением XML Schema [XSD-TYPES]. Отметим, что это неявно включает закрепление регулярного выражения в начале и в конце.

10.2.1.1. Пример использования

Выражение

     re-match("1.22.333", "\d{1,3}\.\d{1,3}\.\d{1,3}")

возвращает значение true.

Для подсчета всех логических интерфейсов с именами eth0.<number> можно задать

     count(/interface[re-match(name, "eth0\.\d+")])

10.3. Функция для типов leafref и instance-identifier

10.3.1. deref()

     node-set deref(node-set nodes)

Функция deref() следует по ссылке, указанной первым узлом из числа заданных параметром nodes, и возвращает узлы, на который он ссылается.

Если первый узел имеет тип instance-identifier, функция возвращает набор узлов, содержащий единственный узел, на который ссылается идентификатор экземпляра, при наличии такого узла. Если такого узла нет, возвращается пустой набор.

Если первый узел имеет тип leafref, функция возвращает набор, содержащий узлы, на которые ссылается leafref. В частности, набор включает узлы, выбранные субоператором path (параграф 9.9.2) для leafref, которые имеет такое же значение, как первый узел аргумента.

Если первый узел имеет другой тип, функция возвращает пустой набо.

10.3.1.1. Пример использования
     list interface {
       key "name type";
       leaf name { ... }
       leaf type { ... }
       leaf enabled {
         type boolean;
       }
       ...
     }

     container mgmt-interface {
       leaf name {
         type leafref {
           path "/interface/name";
         }
       }
       leaf type {
         type leafref {
           path "/interface[name=current()/../name]/type";
         }
         must 'deref(.)/../enabled = "true"' {
           error-message
             "The management interface cannot be disabled.";
         }
       }
     }

10.4. Функции для типа identityref

10.4.1. derived-from()

     boolean derived-from(node-set nodes, string identity)

Функция derived-from() возвращает значение true, если любой из узлов, заданных аргументом nodes, является узлом типа identityref и его значением является отождествление, произведенное из (см. параграф 7.18.2) заданного аргументом identity. В остальных случаях функция возвращает false.

Параметр identity является строкой, соответствующей правилу identifier-ref в разделе 14. Если отождествление имеет префикс, это говорит об отождествлении, определенном в модуле, который импортирован с этим префиксом, или в локальном модуле, если это его префикс. Если префикс отсутствует, параметр identity указывает отождествление, определенное в текущем модуле или его субмодулях.

10.4.1.1. Пример использования
     module example-interface {
       yang-version 1.1;

       ...
       identity interface-type;

       identity ethernet {
         base interface-type;
       }

       identity fast-ethernet {
         base ethernet;
       }

       identity gigabit-ethernet {
         base ethernet;
       }

       list interface {
         key name;
         ...
         leaf type {
           type identityref {
             base interface-type;
           }
         }
         ...
       }

       augment "/interface" {
         when 'derived-from(type, "exif:ethernet")';
         // базовые определения Ethernet
       }
       ...
     }

10.4.2. derived-from-or-self()

     boolean derived-from-or-self(node-set nodes, string identity)

Функция derived-from-or-self() возвращает значение true, если любой из узлов, заданных аргументом nodesЮ является узлом типа identityref и его значением является отождествление, которое совпадает с отождествлением, заданным аргументом identity, или порождено от такого отождествления (см. параграф 7.18.2). Иначе возвращается false.

Параметром identity является строка, соответствующая правилу identifier-ref в разделе 14. Если отождествление имеет префикс, он указывает, что отождествление определено в модуле, импортированном с данным префиксом, или в локальном модуле, если префикс совпадает с префиксом локального модуля. Если префикса нет, аргумент identity указывает отождествление, определенное в текущем модуле или включенном в него субмодуле.

10.4.2.1. Пример использования

Модуль, определенный в параграфе 10.4.1.1 может также иметь

       augment "/interface" {
         when 'derived-from-or-self(type, "exif:fast-ethernet");
         // определения FastEthernet
       }

10.5. Функции для типа enumeration

10.5.1. enum-value()

     number enum-value(node-set nodes)

Функция enum-value() проверяет, является ли первый узел из числа указанных аргументом nodes узлом типа enumeration и возвращает его целочисленное значение enum. Если параметр nodes пуст или первый узел из nodes не относится к типу enumeration, функция возвращает NaN (не число).

10.5.1.1. Пример использования

Для модели данных

     list alarm {
       ...
       leaf severity {
         type enumeration {
           enum cleared {
             value 1;
           }
           enum indeterminate {
             value 2;
           }
           enum minor {
             value 3;
           }
           enum warning {
             value 4;
           }
           enum major {
             value 5;
           }
           enum critical {
             value 6;
           }
         }
       }
     }

приведенное ниже выражение XPath выбирает только сигналы с уровнем важности major и выше

     /alarm[enum-value(severity) >= 5]

10.6. Функции для типа bits

10.6.1. bit-is-set()

     boolean bit-is-set(node-set nodes, string bit-name)

Функция bit-is-set() возвращает значение true, если первый из узлов, указанных аргументом nodes имеет тип bits и флаг bit-name в нем установлен (1). Иначе возвращается значение false.

10.6.1.1. Пример использования

Если интерфейс описывается узлом флагов flags

     leaf flags {
       type bits {
         bit UP;
         bit PROMISCUOUS
         bit DISABLED;
       }
      }

приведенное ниже выражение XPath может служить для выбора активных интерфейсов (флаг UP установлен)

     /interface[bit-is-set(flags, "UP")]

11. Обновление модулей

По мере использования модуля может возникнуть потребность в его обновлении. Однако обновление опубликованных модулей не допускается, если это может вызвать проблемы взаимодействия между клиентами, использующими исходную спецификацию, и сервером, использующим обновленную спецификацию.

При публикации обновления должен использоваться новый оператор revision (параграф 7.1.9), помещаемый перед имеющимися операторами revision. Если в модуле нет операторов revision, такой оператор должен просто добавляться для обозначения нового выпуска. Кроме того, должны быть внесены все требуемые изменения в операторы metadata, включая organization и contact (см. параграфы 7.1.7 и 7.1.8).

Отметим, что содержащиеся в модуле определения доступны для импорта любому другому модулю путем указания имени данного модуля в операторе import. По этой причине менять имя модуля недопустимо. Кроме того, недопустимо менять оператор namespace, поскольку все элементы XML привязаны к пространству имен.

Устаревшие определения недопустимо удалять из опубликованных модулей, поскольку их идентификаторы еще могут применяться другими модулями.

Определение в опубликованном модуле может быть пересмотрено любым из приведенных ниже способов.

  • Для типа enumeration могут быть добавлены новые элементы enum с сохранением значения для существующих элементов. Отметим, что вставка новго элемента перед существующим или изменение порядка имеющихся элементов будут приводить к смене значений существующих элементов, если числовые значения для них не были назначены явно.

  • Для типа bits могут быть добавлены новые флаги с сохранением позиций имеющихся флагов. Отметим, что вставка нового флага перед имеющимся или изменение порядка существующих флагов будут менять позиции флагов, если эти позиции не задаются явно.

  • Операторы range, length или pattern могут расширять пространство разрешенных значений.

  • Может быть добавлен оператор default для листа (leaf), который не имел принятого по умолчанию значения (напрямую или опосредовано через его тип).

  • Может быть добавлен оператор units.

  • Может быть добавлен или изменен оператор reference.

  • Оператор must может быть удален или его ограничения ослаблены.

  • Оператор when может быть удален или его ограничения ослаблены.

  • Оператор mandatory может быть удален или значение true заменено на false.

  • Оператор min-elements может быть удален или изменен, чтобы требовать меньше элементов.

  • Оператор max-elements может быть удален или изменен, чтобы разрешить больше элементов.

  • Оператор description может быть добавлен или уточнен без изменения семантики определения.

  • Оператор base может быть добавлен в identity.

  • Оператор base может быть удален из типа identityref, пока в том остается хотя бы один оператов base.

  • Могут быть добавлены новые операторы typedef, grouping, rpc, notification, extension, feature и identity.

  • Могут быть добавлены операторы определения данных, если они не добавляют обязательных узлов (раздел 3) к имеющимся узлам или на верхнем уровне модуля или субмодуля, а также не создают для тех условных зависимостей от новой функции (т. е. if-feature с указанием новой функции).

  • Могут быть добавлены варианты case.

  • Узел, представляющий данные состояния, может быть изменен для представления данных конфигурации, если он не является обязательным (раздел 3).

  • Оператор if-feature может быть удален, если его узел не является обязательным (раздел 3).

  • Оператор status может быть добавлен или значение его изменено с current на deprecated или obsolete, а также с deprecated на obsolete.

  • Оператор type может быть заменен другим оператором type, который не меняет синтаксис и семантику типа. Например, определение типа inline может быть заменено на typedef, но тип int8 нельзя заменить на int16, поскольку это меняет синтаксис.

  • Любой набор узлов определения данных может быть заменен другим набором синтаксически и семантически эквивалентных узлов. Например, набор узлов может быть заменен оператором uses группировки с тем же набором листьев.

  • Модуль может быть разделен на несколько субмодулей или часть субмодулей может быть удалена, если определения модуля не изменятся (за исключением разрешенных здесь изменений).

  • Оператор prefix может быть изменен при условии корректировки всех локальных применений этого префикса.

В остальных случаях при изменении семантики прежнего определения (т. е. внесении изменений, выходящих за рамки перечисленного выше) должно создаваться новое определение с новым идентификатором.

В операторах, включающих какие-либо операторы определения данных в качестве своих субоператоров, недопустимо менять порядок этих субоператоров с определениями. Новые операторы определения данных могут размещаться в любом месте имеющейся последовательности субоператоров.

12. Сосуществование с YANG версии 1

Модулю YANG версии 1.1 недопустимо включать субмодуль YANG версии 1, а модулю YANG версии 1 недопустимо включать субмодуль YANG версии 1.1.

Модулю или субмодулю YANG версии 1 недопустимо импортировать модуль YANG версии 1.1 по выпуску.

Модуль или субмодуль YANG версии 1.1 может импортировать модуль YANG версии 1 по выпуску.

Если модуль A (YANG версии 1) испортирует модуль B без указания выпуска и модуль B обновлен до YANG 1.1, сервер может одновременно реализовать оба модуля (A и B). В таких случаях сервер NETCONF должен анонсировать оба модуля, используя правила, определенные в параграфе 5.6.4, также ему следует анонсировать модуль A и последний выпуск модуля B, в котором еще указан YANG версии 1, в соответствии с правилами [RFC6020].

Это правило создано для того, чтобы позволить имеющимся реализациям модулей YANG версии 1 применяться вместе с модулями YANG версии 1.1. без этого правила обновление одного модуля до YANG версии 1.1 будет создавать каскадный эффект для модулей, которые его импортируют, требуя от них обновления до версии YANG 1.1.

1В этом случае точки и верхняя граница диапазона не указываются. Прим. перев.

 

Запись опубликована в рубрике RFC. Добавьте в закладки постоянную ссылку.

Добавить комментарий

Or