2

对于以下

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;
  }  
}

yang -f yin tt.yang

.\yy.yang:16: 错误:在 tt.yang:11 (at .\yy.yang:14) 的 l 路径中找不到 yy:x4

  1. 模块 yy 确实有容器 x4 ,对吗?
  2. 由于分组下的leafrefs在使用它们的地方得到解决,如果我将容器x4移动到tt.yang,为什么它不起作用?
4

1 回答 1

3

这是一个很好的例子,说明了为什么定义不可重用的分组是一个坏主意。这就是你的分组所代表的。它在定义它的上下文中(而不是在分组本身内)“引用”定义,而不是在使用它的地方。

分组中的节点在使用之前缺乏上下文(命名空间等)。例如,在使用分组之前,您无法判断哪个节点是 leaf 的父节点l- 这是因为分组在使用之前不是模式树的一部分。使用时,将分组中的节点复制到使用出现的位置,从而替换它。

那么当你使用你的分组并且编译器点击你的leafref时会发生什么?好吧,它会尝试在使用分组的上下文中找到引用的节点,也就是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。

另一个重要的概念是路径表达式的范围。该表达式只能“看到”使用分组的模块可访问的定义,而不是定义分组的位置。这就是为什么上面的两个示例模式树故意不同的原因。

于 2017-02-10T08:23:42.530 回答