1

我试图找出将选择字段从 yang 模型实现到其相应配置 xml 的正确语法。不幸的是,RFC 6020 和其他 Yang 相关网页中的文档似乎没有显示如何choice在实际 XML 中使用与 Yang 模型相关的字段。

例如,这是我的 YANG 模型:

container MYMODEL {
    container PacketOperationConf {
        list RuleID {
            key id;
            leaf id {
                type int32;
            }
            leaf priority { 
                type int32; 
            }
            leaf name { 
                type string; 
            }
            choice type {
                case flow {
                    list action {
                        key order;
                        uses mymodel:action;
                    }
                    container match {
                        uses mymodel:match;
                    }
                }
                case function {
                    container function {
                        
                    }
                }
            }
        }
        ...

这个容器有相应的 XML:

<?xml version="1.0" encoding="UTF-8" ?>
<rpc message-id="101"
    xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
    <edit-config>
        <target>
            <running />
        </target>
        <config>
            <MYMODEL xmlns="urn:com:tug:mymodel">
                <PacketOperationConf>
                    <RuleID>
                        <id>101</id>
                        <type>
                            <flow>
                                <action>
                                    <order>1</order>
                                    <set-dl-src-action>
                                        <address>01:02:03:04:05:06</address>
                                    </set-dl-src-action>
                                </action>
                            </flow>
                        </type>
                    </RuleID>
                </PacketOperationConf>
            </MYMODEL>
        </config>
    </edit-config>
</rpc>

但是当我运行它时,yang2dsdl我得到以下错误:

$ yang2dsdl -t edit-config -v rmbn-full-test-1.xml -d /tmp rmbn-full.yang
== Generating RELAX NG schema '/tmp/rmbn-full-edit-config.rng'
Done.

== Validating grammar and datatypes ...
rmbn-full-test-1.xml:13: element type: Relax-NG validity error : Element RuleID has extra content: type
Relax-NG validity error : Extra element RuleID in interleave
rmbn-full-test-1.xml:11: element RuleID: Relax-NG validity error : Element PacketOperationConf failed to validate content
rmbn-full-test-1.xml fails to validate

所以发生错误是因为它不知道如何处理该type元素。type元素是 yang 模型中我的选择部分的名称。

我已经尝试了各种这样的安排,但都没有奏效。我也无法在 SOF 或 Google 上找到关于以 XML 实现的选择示例的任何内容。

4

1 回答 1

1

case 和 selection 都是 RFC 所指的模式节点,但它们也不是数据节点——可以实例化的模式节点。因此,选择和案例节点永远不会出现在有效的实例文档中,它们只会对有效的实例文档施加限制。

在您的情况下,这意味着以下之间的可选选择(XOR):

  • <action>包含(列表)和/或<match>(容器)的(逻辑)元素组,
  • <function>容器。

换句话说,如果<action>出现在实例文档中,<match>也可能出现(反之亦然),但<function>可能不会出现。

这是一个有效的文件(实际上没有测试)。

<?xml version="1.0" encoding="UTF-8" ?>
<rpc message-id="101"
    xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
    <edit-config>
        <target>
            <running />
        </target>
        <config>
            <RMBN xmlns="urn:com:tug:rmbn-full">
                <PacketOperationConf>
                    <RuleID>
                        <id>101</id>
                        <action>
                            <order>1</order>
                            <set-dl-src-action>
                                <address>01:02:03:04:05:06</address>
                            </set-dl-src-action>
                        </action>
                    </RuleID>
                </PacketOperationConf>
            </RMBN>
        </config>
    </edit-config>
</rpc>

以下是来自 RFC6020(YANG 版本 1.0)的一些文本,因为您特别询问了该版本(第 7.9 节)。

“选择”语句定义了一组备选方案,任何时候只有一个备选方案可能存在。参数是一个标识符,后跟一个包含详细选择信息的子语句块。标识符用于标识模式树中的选择节点。 数据树中不存在选择节点。

一个选择由许多分支组成,用“case”子语句定义。每个分支包含许多子节点。最多来自选择分支之一的节点同时存在。

“case”语句用于定义选择的分支。它将标识符作为参数,后跟包含详细案例信息的子语句块。

该标识符用于标识模式树中的案例节点。 数据树中不存在案例节点。

在“case”语句中,“anyxml”、“choice”、“container”、“leaf”、“list”、“leaf-list”和“uses”语句可用于定义case节点的子节点. 在选择的所有情况下,所有这些子节点的标识符必须是唯一的。

于 2020-10-09T06:43:40.463 回答