9.9. leafref
内置类型
leafref
内置类型被限制在模式树中的某个叶子或叶子列表节点的值空间中,并且可选地被数据树中相应的实例节点进一步限制。 “path
”子状态(第9.9.2节)用于标识模式树中引用的叶节点或叶节点列表节点。 引用节点的值空间是引用节点的值空间。
如果“require-instance
”属性(第9.9.3节)为“true
”,那么数据树中必须存在节点,或者使用默认值的节点(见7.6.1和7.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节中的定义之外,“path
”XPath
表达式在以下上下文中概念性地评估:
如果在“
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>