9.9. leafref内置类型

leafref内置类型被限制在模式树中的某个叶子或叶子列表节点的值空间中,并且可选地被数据树中相应的实例节点进一步限制。 “path”子状态(第9.9.2节)用于标识模式树中引用的叶节点或叶节点列表节点。 引用节点的值空间是引用节点的值空间。

如果“require-instance”属性(第9.9.3节)为“true”,那么数据树中必须存在节点,或者使用默认值的节点(见7.6.17.7.2节), 所引用的模式树叶或叶列表节点的值与有效数据树中的leafref值相同。

如果引用节点代表配置数据,并且“require-instance”属性(第9.9.3节)为“true”,则引用节点也必须表示配置。

不得有任何圆形的树叶链。

如果leafref引用的叶是基于一个或多个特征的条件(参见7.20.2节),那么带有leafref type的叶也必须是基于至少相同的一组特征的条件。

9.9.1. 限制

leafref可以用“require-instance”语句来限制(第9.9.3节)。

9.9.2. “path”声明

如果类型是“leafref”,则必须存在“path”语句,它是“type”语句的子语句。它需要一个字符串作为参数,它必须引用一个叶或叶子列表节点。

路径参数的语法是XPath缩写语法的子集。谓词仅用于约束列表条目的关键节点的值。每个谓词包含每个关键字只有一个相等性测试,并且如果列表具有多个关键字,则多个相邻谓词可以存在。该语法由第14节中的规则“path-arg”正式定义。

只有在需要多个关键字引用来唯一标识一个叶子实例时,谓词才被使用。如果列表中有多个键或者需要除列表中的键以外的叶子的引用,则会发生这种情况。在这些情况下,通常会指定多个leafrefs,并使用谓词将它们绑定在一起。

path”表达式评估为由零个,一个或多个节点组成的节点集。如果“require-instance”属性为“true”,那么这个节点集必须是非空的。

除了第6.4.1节中的定义之外,“pathXPath表达式在以下上下文中概念性地评估:

  • 如果在“typedef”中定义了“path”语句,则上下文节点是数据树中引用typedef的叶节点或叶节点列表节点。

  • 否则,上下文节点是定义了“path”语句的数据树中的节点。

9.9.3. “require-instance”声明

如果类型是“instance-identifier”或“leafref”,那么“require-instance”语句可以是“type”语句的子语句。 它将字符串“true”或“false”作为参数。 如果此语句不存在,则默认为“true”。

如果“require-instance”为“true”,则意味着被引用的实例必须存在以使数据有效。 这个约束是根据第8节中的规则执行的。

如果“require-instance”为“false”,则意味着被引用的实例可能存在于有效数据中。

9.9.4. 词汇表示

leafref值在词法上与其引用的叶代表其值的方式相同。

9.9.5. 规范形式

leafref的规范形式与它引用的叶子的规范形式相同。

9.9.6. 使用示例

用下面的列表:

  1. list interface {
  2. key "name";
  3. leaf name {
  4. type string;
  5. }
  6. leaf admin-status {
  7. type admin-status;
  8. }
  9. list address {
  10. key "ip";
  11. leaf ip {
  12. type yang:ip-address;
  13. }
  14. }
  15. }

以下leafref引用了一个现有的接口:

  1. leaf mgmt-interface {
  2. type leafref {
  3. path "../interface/name";
  4. }
  5. }

相应XML片段的示例:

  1. <interface>
  2. <name>eth0</name>
  3. </interface>
  4. <interface>
  5. <name>lo</name>
  6. </interface>
  7. <mgmt-interface>eth0</mgmt-interface>

以下leafrefs指的是接口的现有地址:

  1. container default-address {
  2. leaf ifname {
  3. type leafref {
  4. path "../../interface/name";
  5. }
  6. }
  7. leaf address {
  8. type leafref {
  9. path "../../interface[name = current()/../ifname]"
  10. + "/address/ip";
  11. }
  12. }
  13. }

相应XML片段的示例:

  1. <interface>
  2. <name>eth0</name>
  3. <admin-status>up</admin-status>
  4. <address>
  5. <ip>192.0.2.1</ip>
  6. </address>
  7. <address>
  8. <ip>192.0.2.2</ip>
  9. </address>
  10. </interface>
  11. <interface>
  12. <name>lo</name>
  13. <admin-status>up</admin-status>
  14. <address>
  15. <ip>127.0.0.1</ip>
  16. </address>
  17. </interface>
  18. <default-address>
  19. <ifname>eth0</ifname>
  20. <address>192.0.2.2</address>
  21. </default-address>

下面的列表使用其中一个键的leafref。 这与关系数据库中的外键类似。

  1. list packet-filter {
  2. key "if-name filter-id";
  3. leaf if-name {
  4. type leafref {
  5. path "/interface/name";
  6. }
  7. }
  8. leaf filter-id {
  9. type uint32;
  10. }
  11. ...
  12. }

相应XML片段的示例:

  1. <interface>
  2. <name>eth0</name>
  3. <admin-status>up</admin-status>
  4. <address>
  5. <ip>192.0.2.1</ip>
  6. </address>
  7. <address>
  8. <ip>192.0.2.2</ip>
  9. </address>
  10. </interface>
  11. <packet-filter>
  12. <if-name>eth0</if-name>
  13. <filter-id>1</filter-id>
  14. ...
  15. </packet-filter>
  16. <packet-filter>
  17. <if-name>eth0</if-name>
  18. <filter-id>2</filter-id>
  19. ...
  20. </packet-filter>

以下通知定义了两个引用到现有管理状态的引用:

  1. notification link-failure {
  2. leaf if-name {
  3. type leafref {
  4. path "/interface/name";
  5. }
  6. }
  7. leaf admin-status {
  8. type leafref {
  9. path "/interface[name = current()/../if-name]"
  10. + "/admin-status";
  11. }
  12. }
  13. }

一个相应的XML通知的例子:

  1. <notification
  2. xmlns="urn:ietf:params:xml:ns:netconf:notification:1.0">
  3. <eventTime>2008-04-01T00:01:00Z</eventTime>
  4. <link-failure xmlns="urn:example:system">
  5. <if-name>eth0</if-name>
  6. <admin-status>up</admin-status>
  7. </link-failure>
  8. </notification>