Q1:这个 netconf xml 文件会有 yang 模型吗?
您可以轻松地确定设备是否正在使用 YANG 从其<hello>
消息中对其内容进行建模。兼容的设备宣传他们支持的 YANG 模块。YANG 1 和 YANG 1.1 的宣传功能会有所不同。
对于 YANG 1 (RFC6020),这就是规范所说的 ( 5.6.4.1 ):
服务器通过<hello>
消息指示支持的模块的名称。模块名称空间被编码为能力字符串中的基本 URI,模块名称被编码为基本 URI 的“模块”参数。
服务器必须公布它实现的所有模块的所有修订。
例如,此<hello>
消息通告一个模块“syslog”。
<hello xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<capability>
http://example.com/syslog?module=syslog&revision=2008-04-01
</capability>
</hello>
对于 YANG 1.1 (RFC7950),在5.6.4中:
NETCONF 服务器必须通过实现 [RFC7895] 中定义的 YANG 模块“ietf-yang-library”并在“/modules-state/module”列表中列出所有实现的模块来宣布它实现的模块(参见第 5.6.5 节)。
服务器还必须在消息中通告以下功能
<hello>
(换行符和空格仅用于格式化原因):
urn:ietf:params:netconf:capability:yang-library:1.0?
revision=<date>&module-set-id=<id>
参数“revision”与服务器实现的“ietf-yang-library”模块的修订日期具有相同的值。该参数必须存在。
参数“module-set-id”与“ietf-yang-library”中的叶子“/modules-state/module-set-id”具有相同的值。该参数必须存在。
使用这种机制,客户端可以为服务器缓存支持的模块,并且仅当消息中的“module-set-id”值发生更改时才更新缓存
<hello>
。
似乎无法找到停止上述块引用的方法,因此这个
Q2:我如何访问这个 xml 文件的底层 yang 模型(文件)?
设备制造商通常会在他们的网站上提供一个下载页面,您可以在其中获取他们的 YANG 文件。请注意,并非所有设备都支持 YANG。NETCONF 没有指定建模的内容;可能是一堆 XSD 模式、YANG、RelaxNG 等,尽管 YANG 的设计初衷是考虑到这个目的(最初)。
还定义了一个可选的标准操作,称为<get-schema>
,它是ietf-netconf-monitoring YANG 模块的一部分。您首先发现可用的模式,然后获取它们。由于它是可选的,因此并非所有设备都支持它。
<?xml version="1.0" encoding="utf-8"?>
<rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="2">
<get>
<filter type="subtree">
<ncm:netconf-state xmlns:ncm="urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring">
<ncm:schemas/>
</ncm:netconf-state>
</filter>
</get>
</rpc>
<?xml version="1.0" encoding="utf-8"?>
<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="2">
<data>
<netconf-state xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring">
<schemas>
<schema>
<identifier>ietf-inet-types</identifier>
<version>2013-07-15</version>
<format>yang</format>
<namespace>urn:ietf:params:xml:ns:yang:ietf-inet-types</namespace>
<location>NETCONF</location>
</schema>
<!-- ... -->
</schemas>
</netconf-state>
</data>
</rpc-reply>
<?xml version="1.0" encoding="utf-8"?>
<rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="8">
<get-schema xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring">
<identifier>ietf-interfaces</identifier>
<version>2014-05-08</version>
<format>yang</format>
</get-schema>
</rpc>
<?xml version="1.0" encoding="utf-8"?>
<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="8">
<data xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring">module ietf-interfaces {
namespace "urn:ietf:params:xml:ns:yang:ietf-interfaces";
prefix if;
// ...
}
</data>
</rpc-reply>