почему этот leafref недействителен в соответствии с pyang

Для следующих

module yy {
  yang-version 1.1;
  namespace "urn:example:yy";
  prefix yyX;


  container x4 {
      leaf x5 {
          type string;
      }
    }

  grouping gx {
          leaf l {
              type leafref {
                  path "../x4/x5";
              }
          }
     }
}

А также

module tt {
  yang-version 1.1;
  namespace "urn:example:tt";
  prefix ttX;

  import yy {
    prefix zz;
  }

  container ty {
     uses zz:gx;
  }  
}

ян -ф инь tt.ян

.\yy.yang:16: ошибка: yy:x4 в пути для l в tt.yang:11 (в .\yy.yang:14) не найден

  1. модуль yy имеет контейнер x4, верно?
  2. так как листовые ссылки при группировке разрешаются относительно места, где они используются, почему это не работает, если вместо этого я перемещаю контейнер x4 в tt.yang?

person user19937    schedule 10.02.2017    source источник


Ответы (1)


Это хороший пример того, почему определение группировки, не допускающей повторного использования, — плохая идея. Это то, что представляет ваша группировка. Он «ссылается» на определения в том контексте, в котором он определен (а не в самой группе), а не в том месте, где он используется.

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

Так что же происходит, когда вы используете свою группировку, а компилятор попадает в вашу личную ссылку? Что ж, он попытается найти указанный узел в том контексте, где используется группировка, то есть модуль tt. Вы использовали группировку внутри контейнера ty, поэтому дерево схемы выглядит так:

+--rw container ty
  +--rw leaf l?  leafref

Ваше выражение ../x4/x5, что в более длинной форме означает parent::*/child::x4/child::x5. Исходным контекстом выражения является l лист дерева схемы. Таким образом, разбитое на три шага, ваше выражение оценивается как:

+-----------+----------------+----------------+--------------+
|   Step    |    Context     |     Result     | Final result |
+-----------+----------------+----------------+--------------+
| parent::* | leaf l         | container ty   |              |
| child::x4 | container ty   | empty node set |              |
| child::x5 | empty node set | empty node set | <--          |
+-----------+----------------+----------------+--------------+

Да, есть отметка, которая соответствует выражению.

Если вы переместите контейнер в модуль tt, вы получите следующее дерево схемы:

+--rw container x4
  +--rw leaf x5? string
+--rw container tt
  +--rw leaf l?  leafref

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

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

person predi    schedule 10.02.2017