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. 使用示例

用下面的列表:

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>

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

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>

results matching ""

    No results matching ""