【问题标题】:YANG and Choice - what does the XML look like?YANG 和 Choice - XML 是什么样的?
【发布时间】:2021-01-24 02:18:44
【问题描述】:

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

例如,这是我的 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 实现的选择示例的任何内容。

【问题讨论】:

    标签: model schema ietf-netmod-yang yang


    【解决方案1】:

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

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

    • 包含&lt;action&gt;(列表)和/或&lt;match&gt;(容器)的(逻辑)元素组,
    • &lt;function&gt; 容器。

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

    这是一个有效的文档(实际上并未测试)。

    <?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)的一些文本,因为您特别询问了该版本 (Section 7.9)。

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

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

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

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

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

    【讨论】:

    • 谢谢!我周末不在城里,但我计划在这个星期二进行试验。我想我确实在我的一次迭代中尝试过这个,但我会再试一次。
    • 成功了!谢谢
    猜你喜欢
    • 2012-04-17
    • 1970-01-01
    • 1970-01-01
    • 2019-08-08
    • 2010-10-21
    • 2012-02-05
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多