7.6. “叶”声明

leaf”语句用于在模式树中定义叶节点。 它需要一个参数,它是一个标识符,后面是一个包含详细叶子信息的子状态块。

叶节点在数据树中有一个值,但没有子节点。 从概念上讲,数据树中的值始终是规范形式(参见第9.1节)。

数据树中存在零个或一个实例的叶节点。

leaf”语句用于定义特定内置或派生类型的标量变量。

7.6.1. 叶子的默认值

如果叶子不存在于数据树中,叶子的默认值就是服务器使用的值。缺省值的使用取决于架构树中不是不存在容器的树叶最近的祖先节点(请参阅第7.5.1节):

  • 如果模式树中不存在这样的祖先,则必须使用默认值。

  • 否则,如果这个祖先是个案例节点,如果数据树中存在任何案例的节点,或者案例节点是选择的默认案例,并且数据中不存在任何其他案例的节点,则必须使用默认值树。

  • 否则,如果祖先节点存在于数据树中,则必须使用默认值。

在这些情况下,默认值被认为正在使用中。

请注意,如果叶子或其任何祖先具有“​​when”条件或“if-feature”表达式评估为“false”,则默认值未被使用。

当默认值正在使用时,服务器必须在操作上表现得好像数据树中存在叶子,其默认值是它的值。

如果一个叶子有一个“default”语句,叶子的默认值就是“default”语句的值。否则,如果叶子的类型有一个默认值,叶子不是强制性的,叶子的默认值就是该类型的默认值。在其他所有情况下,叶子没有默认值。

7.6.2. leaf子语句

  1. +--------------+---------+-------------+
  2. | substatement | section | cardinality |
  3. +--------------+---------+-------------+
  4. | config | 7.21.1 | 0..1 |
  5. | default | 7.6.4 | 0..1 |
  6. | description | 7.21.3 | 0..1 |
  7. | if-feature | 7.20.2 | 0..n |
  8. | mandatory | 7.6.5 | 0..1 |
  9. | must | 7.5.3 | 0..n |
  10. | reference | 7.21.4 | 0..1 |
  11. | status | 7.21.2 | 0..1 |
  12. | type | 7.6.3 | 1 |
  13. | units | 7.3.3 | 0..1 |
  14. | when | 7.21.5 | 0..1 |
  15. +--------------+---------+-------------+

7.6.3. 叶的“类型”声明

必须存在的“type”语句将现有内置类型或派生类型的名称作为参数。 可选的子变量指定了这种类型的限制。 细节见第7.4节

7.6.4. 叶子的“默认”声明

default”语句是可选的,它将一个包含叶子默认值的字符串作为参数。

default”语句的值必须根据叶的“type”语句中指定的类型有效。

default”语句不能出现在“mandatory”为“true”的节点上。

默认值的定义不能用“if-feature”语句来标记。 例如,以下是非法的:

  1. leaf color {
  2. type enumeration {
  3. enum blue { if-feature blue; }
  4. ...
  5. }
  6. default blue; // 非法 - 枚举值是有条件的
  7. }

7.6.5. 叶的“强制性”声明

mandatory”语句是可选的,它将字符串“true”或“false”作为参数,并对有效数据进行约束。 如果未指定,则默认为“false”。

如果“mandatory”为“true”,那么约束的行为取决于架构树中不是不存在容器的叶节点最接近的祖先节点的类型(见第7.5.1节):

  • 如果模式树中不存在这样的祖先,叶必须存在。

  • 否则,如果这个祖先是一个案例节点,如果数据树中存在任何来自案例的节点,叶子必须存在。

否则,如果祖先节点存在于数据树中,叶子必须存在。

这个约束是根据第8节中的规则执行的。

7.6.6. XML编码规则

叶节点被编码为XML元素。 元素的本地名称是叶子的标识符,其名称空间是模块的XML名称空间(参见第7.1.3节)。

叶节点的值根据类型编码为XML,并作为元素中的字符数据发送。

一个例子见7.6.8节

7.6.7. NETCONF <edit-config>操作

NETCONF服务器处理<edit-config>请求时,叶节点的过程元素如下:

  • 如果操作是“合并(merge)”或“替换(replace)”,则创建该节点(如果该节点不存在),并将其值设置为在XML RPC数据中找到的值。

  • 如果操作是“创建(create)”,则创建该节点(如果该节点不存在)。 如果节点已经存在,则返回“数据存在(data-exists)”错误。

  • 如果操作是“删除(delete)”,则该节点将被删除(如果存在)。 如果节点不存在,则返回“数据缺失(data-missing)”错误。

7.6.8. 使用示例

鉴于下面的“leaf”声明,放在先前定义的“ssh”容器中(见7.5.9节):

  1. leaf port {
  2. type inet:port-number;
  3. default 22;
  4. description
  5. "The port to which the SSH server listens.";
  6. }

相应的XML实例示例:

  1. <port>2022</port>

使用<edit-config>设置叶子的值:

  1. <rpc message-id="101"
  2. xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
  3. xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0">
  4. <edit-config>
  5. <target>
  6. <running/>
  7. </target>
  8. <config>
  9. <system xmlns="urn:example:config">
  10. <services>
  11. <ssh>
  12. <port>2022</port>
  13. </ssh>
  14. </services>
  15. </system>
  16. </config>
  17. </edit-config>
  18. </rpc>