7.20. 一致性相关的陈述
本节定义了与符合性有关的声明,如5.6节所述。
7.20.1. “feature
”声明
“feature
”语句用于定义一个机制,模式的一部分被标记为有条件的。 定义了一个功能名称,稍后可以使用“if-feature
”语句来引用(参见第7.20.2节)。 除非服务器支持给定的特征表达式,否则服务器将忽略使用“if-feature
”语句标记的模式节点。 这允许YANG
模块的部分基于服务器中的条件有条件。 该模型可以表示模型中的服务器的能力,给出一个更丰富的模型,允许不同的服务器能力和角色。
“feature
”语句的参数是新特征的名称,并遵循6.2节中有关标识符的规则。 “if-feature
”语句使用此名称将模式节点绑定到该功能。
在这个例子中,一个名为“本地存储(local-storage
)”的特性表示服务器将syslog
消息存储在某种本地存储上的能力。 此功能用于使“本地存储限制(local-storage-limit
)”以存在某种本地存储为条件。 如果服务器不报告它支持此功能,则不支持“本地存储限制”节点。
module example-syslog {
yang-version 1.1;
...
feature local-storage {
description
"This feature means that the server supports local
storage (memory, flash, or disk) that can be used to
store syslog messages.";
}
container syslog {
leaf local-storage-limit {
if-feature local-storage;
type uint64;
units "kilobyte";
config false;
description
"The amount of local storage that can be
used to hold syslog messages.";
}
}
}
YANG
语法中的许多地方都可以使用“if-feature
”语句。 当服务器不支持该功能时,将忽略带有“if-feature
”标签的定义。
一个功能不能直接或间接地通过一系列其他功能来引用它自己。
为了使服务器支持依赖于任何其他特征的特征(即特征具有一个或多个“if-feature
”子特征),服务器还必须支持所有从属特征。
7.20.1.1. feature
子语句
+--------------+---------+-------------+
| substatement | section | cardinality |
+--------------+---------+-------------+
| description | 7.21.3 | 0..1 |
| if-feature | 7.20.2 | 0..n |
| reference | 7.21.4 | 0..1 |
| status | 7.21.2 | 0..1 |
+--------------+---------+-------------+
7.20.2. “if-feature
”声明
“if-feature
”语句使其父语句有条件。参数是通过功能名称的布尔表达式。在此表达式中,当且仅当服务器支持该功能时,功能名称的计算结果为“true
”。父语句由布尔表达式求值为“true
”的服务器实现。
if-feature
布尔表达式语法由第14节中的规则“if-feature-expr
”正式定义。圆括号用于对表达式进行分组。评估表达式时,优先顺序为(最高优先优先):分组(括号),“not
”,“and
”,“or
”。
如果布尔表达式中的特征名称上存在前缀,则前缀名称是指使用该前缀导入的模块中定义的特征,如果前缀匹配本地模块的前缀,则使用本地模块。否则,必须在当前模块或包含的子模块中定义具有匹配名称的特征。
作为列表键的叶子不能有任何“if-feature
”语句。
7.20.2.1 使用示例
在本例中,如果服务器支持“outbound-tls
”或“outbound-ssh
”特性,则实现容器“target
”。
container target {
if-feature "outbound-tls or outbound-ssh";
...
}
以下示例是等效的:
if-feature "not foo or bar and baz";
if-feature "(not foo) or (bar and baz)";
7.20.3. “deviation
”声明
“deviation
”语句定义了服务器不能忠实执行的模块层次结构。参数是一个字符串,用于标识架构树中与模块发生偏差的节点。这个节点被称为偏差的目标节点。 “deviation
”声明的内容给出了有关偏差的详细信息。
参数字符串是一个绝对的模式节点标识符(请参阅第6.5节)。
偏差定义了服务器或服务器类别偏离标准的方式。这意味着偏差必须不是公布的标准的一部分,因为它们是学习实现如何与标准不同的机制。
服务器偏差是强烈的不鼓励,只能作为最后的手段。告诉应用程序如何服务器不能遵循标准是正确实施标准的替代品。偏离模块的服务器不完全符合模块。
但是,在某些情况下,特定设备可能没有硬件或软件支持标准模块的某些部分的能力。发生这种情况时,服务器可以选择将对模块的不支持部分进行配置的尝试视为报告给毫无疑问的应用程序的错误,或者忽略这些传入的请求。这两个选择都不可以接受。
相反,YANG
允许服务器通过使用“deviation
”语句来记录基础模块中不被支持,或者被支持但语法不同的部分。
在应用服务器公布的所有偏差之后,以任何顺序,产生的数据模型必须仍然有效。
7.20.3.1. deviation
子语句
+--------------+----------+-------------+
| substatement | section | cardinality |
+--------------+----------+-------------+
| description | 7.21.3 | 0..1 |
| deviate | 7.20.3.2 | 1..n |
| reference | 7.21.4 | 0..1 |
+--------------+----------+-------------+
7.20.3.2。 “deviate
”声明
“deviate
”语句定义了目标节点的服务器实现如何偏离其原始定义。参数是字符串“not-supported
”,“add
”,“replace
”或““delete
”之一。
参数“not-supported
”表示目标节点没有被这个服务器实现。
参数“add
”向目标节点添加属性。要添加的属性由子状态标识为“deviate
”语句。如果一个属性只能出现一次,那么这个属性不能存在于目标节点中。
参数“replace
”取代了目标节点的属性。要替换的属性由子状态标识为“deviate
”语句。要替换的属性必须存在于目标节点中。
参数“delete
”删除目标节点的属性。要删除的属性由子语句标识为“delete
”语句。子状态的关键字必须匹配目标节点中相应的关键字,参数的字符串必须等于目标节点中相应的关键字的参数字符串。
deviate
的子语句
+--------------+--------------+-------------+
| substatement | section | cardinality |
+--------------+--------------+-------------+
| config | 7.21.1 | 0..1 |
| default | 7.6.4, 7.7.4 | 0..n |
| mandatory | 7.6.5 | 0..1 |
| max-elements | 7.7.6 | 0..1 |
| min-elements | 7.7.5 | 0..1 |
| must | 7.5.3 | 0..n |
| type | 7.4 | 0..1 |
| unique | 7.8.3 | 0..n |
| units | 7.3.3 | 0..1 |
+--------------+--------------+-------------+
7.20.3.3. 使用示例
在这个例子中,服务器通知客户端应用程序它不支持RFC 867风格的“daytime
”服务。
module example-deviations {
yang-version 1.1;
namespace "urn:example:deviations";
prefix md;
import example-base {
prefix base;
}
deviation /base:system/base:daytime {
deviate not-supported;
}
...
}
一个服务器将通告模板“example-base
”和“example-deviations
”。
以下示例将特定于服务器的默认值设置为没有定义默认值的叶节点:
deviation /base:system/base:user/base:type {
deviate add {
default "admin"; // new users are 'admin' by default
}
}
在这个例子中,服务器将名称服务器的数量限制为3
:
deviation /base:system/base:name-server {
deviate replace {
max-elements 3;
}
}
如果最初的定义是:
container system {
must "daytime or time";
...
}
服务器可以通过执行以下操作去除这个“must
”约束:
deviation /base:system {
deviate delete {
must "daytime or time";
}
}