杨模型递归搜索必须条件
Yang Model recursive search for must condition
我的 CLI 有限制问题。我一直在调查 yang RFC7950 (https://www.rfc-editor.org/rfc/rfc7950),但一无所获。
这是一个例子。
grouping httpGroup {
list http-list{
key "value";
leaf value {
status current { yexte:preliminary; }
description "value to match";
must "(not(../protocol)) and (not(../network-port)))" {
error-message "Not compatible with protocol or non-TCP ports";
}
type string { length "1..255"; }
}
}
}
该组将包含在具有以下结构的多个组中:
list and {
leaf-list protocol { ..... }
uses A;
list or {
leaf-list protocol { ..... }
uses A;
}
}
grouping A {
status{}
leaf-list protocol { ..... }
leaf-list X { ..... }
uses httpGroup;
}
我需要这个必须包含在 httpGroup 中的条件来验证协议值 没有 在层次结构的任何级别配置。
我已经添加了更多的亲戚路径来搜索这个节点:
// same level
not(../protocol)
// next level
not(../and/protocol)
not(../or/protocol)
// previous level
not(../../protocol)
not(../../protocol)
//recursively down previous level
not(../../and/protocol)
not(../../or/protocol)
// third level
not(../and/or/protocol)
not(../and/and/protocol)
如您所见,这根本不是一个干净的解决方案。
有什么方法可以对整个层次结构进行处理,例如:
if protocol node exists and http-list exists then error.
提前致谢。
分组是为了可重复使用。尝试创建只能在特定上下文中使用的分组是一种不好的做法。如果您在分组中定义一个 XPath 表达式并且该表达式引用属于该分组 "outside" 的节点(例如,一个未知的祖先数据节点,甚至更糟 - 一个具有特定名称的祖先),这正是会发生的情况).
处理这种情况的正确方法是在使用此分组的每个不同上下文中使用 refine 语句。您将 value
叶子作为目标,然后通过添加 must 语句对其进行优化,其表达式当然取决于使用上下文。您 没有 在分组 http-list
.
中定义 must 语句
分组内 A
:
grouping A {
status{}
leaf-list protocol { ..... }
leaf-list X { ..... }
uses httpGroup {refine "http-list/value" {must "not(../../protocol)";}}
}
如您所见,分组 A
现在是完全自给自足的,可以在任何上下文中使用 - must 不会有任何问题。
我的 CLI 有限制问题。我一直在调查 yang RFC7950 (https://www.rfc-editor.org/rfc/rfc7950),但一无所获。
这是一个例子。
grouping httpGroup {
list http-list{
key "value";
leaf value {
status current { yexte:preliminary; }
description "value to match";
must "(not(../protocol)) and (not(../network-port)))" {
error-message "Not compatible with protocol or non-TCP ports";
}
type string { length "1..255"; }
}
}
}
该组将包含在具有以下结构的多个组中:
list and {
leaf-list protocol { ..... }
uses A;
list or {
leaf-list protocol { ..... }
uses A;
}
}
grouping A {
status{}
leaf-list protocol { ..... }
leaf-list X { ..... }
uses httpGroup;
}
我需要这个必须包含在 httpGroup 中的条件来验证协议值 没有 在层次结构的任何级别配置。
我已经添加了更多的亲戚路径来搜索这个节点:
// same level
not(../protocol)
// next level
not(../and/protocol)
not(../or/protocol)
// previous level
not(../../protocol)
not(../../protocol)
//recursively down previous level
not(../../and/protocol)
not(../../or/protocol)
// third level
not(../and/or/protocol)
not(../and/and/protocol)
如您所见,这根本不是一个干净的解决方案。
有什么方法可以对整个层次结构进行处理,例如:
if protocol node exists and http-list exists then error.
提前致谢。
分组是为了可重复使用。尝试创建只能在特定上下文中使用的分组是一种不好的做法。如果您在分组中定义一个 XPath 表达式并且该表达式引用属于该分组 "outside" 的节点(例如,一个未知的祖先数据节点,甚至更糟 - 一个具有特定名称的祖先),这正是会发生的情况).
处理这种情况的正确方法是在使用此分组的每个不同上下文中使用 refine 语句。您将 value
叶子作为目标,然后通过添加 must 语句对其进行优化,其表达式当然取决于使用上下文。您 没有 在分组 http-list
.
分组内 A
:
grouping A {
status{}
leaf-list protocol { ..... }
leaf-list X { ..... }
uses httpGroup {refine "http-list/value" {must "not(../../protocol)";}}
}
如您所见,分组 A
现在是完全自给自足的,可以在任何上下文中使用 - must 不会有任何问题。