为什么这个leafref根据pyang无效

时间:2017-02-10 01:27:13

标签: ietf-netmod-yang

以下

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:错误:yy:在tt.yang的路径中的x4:11(at。\ yy.yang:14)未找到

  1. 模块yy确实有容器x4,对吧?
  2. 由于分组下的leafrefs在使用它们的地方被解析了,为什么我把容器x4移到tt.yang而不起作用呢?

1 个答案:

答案 0 :(得分:0)

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

分组中的节点在使用之前缺少上下文(名称空间等)。例如,在使用分组之前,您无法分辨哪个节点是叶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。

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