【问题标题】:YANG - mandatory choiceYANG——必选
【发布时间】:2018-10-08 19:54:50
【问题描述】:

来自RFC 7950#7.9.4

[强制]约束的行为取决于选择的类型 架构树中不存在的最近祖先节点(参见第 7.5.1 节):

  • 如果架构树中不存在这样的祖先,则强制执行约束。
  • 否则,如果此祖先是案例节点,则如果存在案例中的任何其他节点,则会强制执行约束。
  • 否则,如果祖先节点存在,则强制执行。

现在:第一点和最后一点似乎很简单,但我无法理解第二点。

是不是想说如果第一个non-presence container 祖先是case 节点,那么如果case 有多个子节点,则必须强制执行约束?基本上,这意味着如果case 包含uses,我必须强制执行?

【问题讨论】:

    标签: ietf-netmod-yang


    【解决方案1】:

    强制选择意味着只有一个案例分支(案例的数据节点后代)必须存在于有效的实例文档中 - RFC 使用术语“有效数据”来引用这一点。第二个项目符号是一个例外。

    第二个项目符号适用于嵌套选择 - 如果选择的祖先是案例节点,则您正在处理嵌套在另一个选择中的选择。

    module choice-case {
        yang-version 1.1;
        namespace "org:example:choice-case";
        prefix "cc";
    
        container top {
            choice choice {
                case mandatory-choice { // <-- case mentioned in 2nd bullet
                    choice choice {
                        mandatory true; // <-- constraint not enforced until f is instantiated
                        case a-b-c { 
                            leaf a {type string;}
                            leaf b {type string;}
                            leaf c {type string;}
                        }
                        case d-e { 
                            leaf d {type string;}
                            leaf e {type string;}
                        }
                    }
                    leaf f {
                        type string;
                    }
                }
            }
        }
    }
    

    在上面的例子中,强制选择约束没有被强制执行,直到叶 f 也出现在实例文档中。如果来自a-b-cd-e 分支的叶节点被实例化,约束也将被强制执行,但条件将始终得到满足。

    是不是想说如果第一个不存在的容器祖先是案例节点,那么如果案例有多个子节点,则必须强制执行约束?

    没有。如果实例文档中存在此类子项的实例,则会强制执行该约束。

    基本上,这意味着如果案例包含用途,我必须强制执行?

    强制约束适用于实例文档,而不是架构 - 架构仅规定约束。 uses 永远不会存在于强制约束被强制执行的上下文中。只有被引用分组定义的实例化数据节点可能存在于这样的上下文中,并且在强制执行约束时可能会被考虑。

    【讨论】:

    • 为了清楚起见:这意味着外部选择不是强制性的,但如果在实例文档中我有外部选择并实例化 mandatory-choice 那么它可以为空,因为它的内部选择是强制性的。对吗?
    • @Fylax,无法实例化选择/案例,它仅对有效数据节点施加限制。只有在其中一个案例分支中选择的数据节点后代可以被实例化(例如我的示例中的a-b-cd-e 叶子)。如果删除外部选项(和大小写),则需要至少一个实例化的叶子以使文档有效(如果容器 top 也存在),但有了它,您不需要任何他们是。
    • 我想我明白了。 outer-choice 不需要任何实例化的后代。但是如果我用mandatory-choice 进行实例化,那么我还需要实例化a-b-cd-e。对吗?
    • @Fylax,是的,类似的东西。也许我选择了一个不好的例子。想象另一个叶子 f 是嵌套强制选择的兄弟,mandatory-choice 案例是它们的父级。现在,如果 f 被实例化,您还必须从 a-b-cd-e 实例化一些东西。
    • @Fylax,不确定我是否关注。如果实例文档中没有f,则对选择兄弟的强制约束将被忽略,因此不会强制执行。如果存在f,则不能再忽略强制约束——它需要被评估并且必须评估为真,因此被强制执行。
    猜你喜欢
    • 1970-01-01
    • 2020-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-28
    • 2015-08-10
    • 2016-05-09
    • 2023-04-10
    相关资源
    最近更新 更多