5.6.5. 实现一个模块
如果服务器实现了模块的数据节点(data nodes),RPCs,操作(actions),通知(notifications)和偏差(deviations),则服务器实现一个模块。
一个服务器不能实现一个以上的模块版本。
如果服务器实现了导入模块B的模块A,并且A在服务器支持的“augment”或“path”语句中使用了来自B的任何节点,则服务器必须实现模块B的修订版,该模块具有定义的这些节点。这与模块B是否被修改导入无关。
如果一个服务器实现了一个模块A,它导入一个模块C而没有指定模块C的修改日期,而服务器没有实现C(例如,如果C只定义了一些类型定义),服务器必须在“/modules-state/module“列表从”ietf-yang-library“[RFC7895],它必须将叶子”一致性类型(conformance-type)“设置为”import“模块。
如果服务器在“ietf-yang-library”的“/modules-state/module”列表中列出了一个模块C,并且还有其他的模块Ms列出了导入C而没有指定模块C的修改日期,那么服务器必须使用C列出的最新修订版C的定义。
这些规则的原因是客户端需要能够知道在服务器中实现的所有叶子和叶子列表的具体数据模型结构和类型。
例如,对于这些模块:
module a {
yang-version 1.1;
namespace "urn:example:a";
prefix "a";
import b {
revision-date 2015-01-01;
}
import c;
revision 2015-01-01;
feature foo;
augment "/b:x" {
if-feature foo;
leaf y {
type b:myenum;
}
}
container a {
leaf x {
type c:bar;
}
}
}
module b {
yang-version 1.1;
namespace "urn:example:b";
prefix "b";
revision 2015-01-01;
typedef myenum {
type enumeration {
enum zero;
}
}
container x {
}
}
module b {
yang-version 1.1;
namespace "urn:example:b";
prefix "b";
revision 2015-04-04;
revision 2015-01-01;
typedef myenum {
type enumeration {
enum zero; // added in 2015-01-01
enum one; // added in 2015-04-04
}
}
container x { // added in 2015-01-01
container y; // added in 2015-04-04
}
}
module c {
yang-version 1.1;
namespace "urn:example:c";
prefix "c";
revision 2015-02-02;
typedef bar {
...
}
}
module c {
yang-version 1.1;
namespace "urn:example:c";
prefix "c";
revision 2015-03-03;
revision 2015-02-02;
typedef bar {
...
}
}
执行模块“a”的版本“2015-01-01”并支持功能“foo”的服务器可以实现模块“b”的版本“2015-01-01”或“2015-04-04”。 由于“b”是通过修改导入的,所以叶“/b:x /a:y”的类型是相同的,而不管服务器实现哪个版本的“b”。
实现模块“a”但不支持“foo”功能的服务器不必实现模块“b”。
执行模块“a”的版本“2015-01-01”的服务器选择模块“c”的任何版本,并将其列在“ietf-yang-library”的“/modules-state/module”列表中。
以下XML编码示例显示了实现模块“a”的服务器的“/modules-state/module”列表的有效数据:
<modules-state
xmlns="urn:ietf:params:xml:ns:yang:ietf-yang-library">
<module-set-id>ee1ecb017370cafd</module-set-id>
<module>
<name>a</name>
<revision>2015-01-01</revision>
<namespace>urn:example:a</namespace>
<feature>foo</feature>
<conformance-type>implement</conformance-type>
</module>
<module>
<name>b</name>
<revision>2015-04-04</revision>
<namespace>urn:example:b</namespace>
<conformance-type>implement</conformance-type>
</module>
<module>
<name>c</name>
<revision>2015-02-02</revision>
<namespace>urn:example:c</namespace>
<conformance-type>import</conformance-type>
</module>
</modules-state>