杨模型递归搜索的必要条件

时间:2019-01-17 09:29:58

标签: ietf-netmod-yang

我对CLI的限制存在问题。我一直在研究yang RFC7950(https://tools.ietf.org/html/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.

谢谢。

1 个答案:

答案 0 :(得分:0)

分组是可重用的。尝试创建只能在特定上下文中使用的分组是一种不良做法。如果您在分组中定义XPath表达式,并且该表达式引用该分组“之外”的节点(例如,尚不知道的祖先数据节点,或更糟糕的是-具有特定名称的祖先),则会发生这种情况。

处理此情况的正确方法是在使用此分组的每个不同上下文中使用优化语句。您可以将value叶作为目标,然后通过添加must语句对其进行优化,该语句的表达当然取决于使用情况。您没有在分组http-list内定义必须声明。

在分组A内:

grouping A {
  status{}
  leaf-list protocol { ..... }
  leaf-list X { ..... }
  uses httpGroup {refine "http-list/value" {must "not(../../protocol)";}}
}

如您所见,对A进行分组现在是完全自给自足的,可以在任何上下文中使用-必定不会有任何问题。