2

如果我有以下型号

devices {
  device {
     key id;
     interfaces {
        interface {
            key id;
            unique name;        
        }
     }
  }
}

which data is valid or invalid according to yang's key and unique    specification ?
1. devices/device=1/interfaces/interface=1; name = a 
2. devices/device=1/interfaces/interface=1; name = b  // key violation 
3. devices/device=1/interfaces/interface=2; name = a  // unique violation
4. devices/device=2/interfaces/interface=1; name = a  // unique violation ?

假设我将“接口”对象存储在关系表中并将名称标记为唯一列,我不能同时拥有数据行 3 和 4。这就是规范的含义吗?

或者,我可以将唯一性或键约束解释为唯一资源路径吗?如果我这样做,下面的数据行不会冲突,因为它们是两个不同的资源 url,因为它们属于不同的设备。

devices/device=1/interfaces/interface=2; name = a  
devices/device=2/interfaces/interface=2; name = a  

什么是正确的解释?全局唯一 vs 列表中的唯一父级?

4

2 回答 2

2

正确的答案可能是:it is unclear对于嵌套列表。

“唯一”约束指定参数字符串中指定的所有叶子实例的组合值,包括具有默认值的叶子,在所有引用的叶子都存在或具有默认值的所有列表条目实例中必须是唯一的。

RFC7950,第 7.8.3 节

“list”语句用于定义模式树中的内部数据节点。一个列表节点可能存在于数据树的多个实例中。每个这样的实例都称为列表条目。

RFC7950,第 7.8 节

相同的文本出现在RFC6020(YANG 版本 1)中。

如果您严格解释它,您别无选择:您必须使所有列表条目在name全局范围内具有唯一性才能满足约束。请注意,由于措辞相似,这同样适用于列表的键。

尚不清楚这是否是故意的。

RFC6110使用现有 XML 技术处理基于 YANG 的实例验证,将其解释unique within parent为由同一个 WG 创建:它使用preceding-sibling::XPath 轴来强制执行约束,它不会提取device/id=2内部的接口条目device/id=1,因为device/id=1/interfaces/interface实例和device/id=2/interfaces/interface实例是不是 XML 文档中的兄弟姐妹。

请注意,RFC 不能免于错误。

于 2016-11-25T13:17:56.677 回答
0

的范围与unique的范围相同key。也就是说,在您的示例中,不同的设备具有单独的接口列表。同样,设备“1”和“2”都具有接口“1”,设备“1”和“2”可以具有名称为“a”的接口。

请注意,与 不同keyunique它可以引用后代节点。如果想使名称在设备之间唯一,则可以unique在设备列表中使用:

list device {
    key 'id';
    unique 'interfaces/interface/name';
    ...
}
于 2019-04-15T16:37:37.900 回答