【问题标题】:Only allow unique keys in seperate lists in YANG Model在 YANG 模型中只允许单独列表中的唯一键
【发布时间】:2021-06-01 23:12:21
【问题描述】:

我的 yang 模型有两个同级列表。我需要两个列表上的元素都是唯一的。在每个列表中不是唯一的,但在列表的联合中是唯一的。有没有办法用必须声明或其他东西来定义它?

container parent {
    list a {
        key "name";
        leaf name {
            type string;
        }
        leaf something {
            type string;
        }
    }
    list b {
        key "name";
        leaf name {
            type string;
        }
        leaf something-else{
            type string;
        }
    }
}

那么,我如何确保每个元素都有不同的名称?

【问题讨论】:

  • 你的问题有点不清楚。 元素名称唯一性是由 YANG 建模者通过在设计时指定叶名称来实现的。你可能想要元素值唯一性。
  • 是的,我说的是叶子名称的值。这个例子只是一个糟糕的叶子命名。

标签: ietf-netmod-yang


【解决方案1】:

假设您需要两个列表之间的联合中某些元素的唯一 ,您确实可以使用 must 约束来实现这一点。

(另外)假设您需要 somethingsomething-else 的唯一,您可以使用以下条件对 list b 设置一个必须约束:

not(../a[something=current()/something-else])

因此,something 的值不需要在 list a 的所有实例中唯一,something-else 的值不需要在 list b 的所有实例中唯一,但不同值之间的交集somethingsomething-else 的不同值必须为空集。

module a {
  yang-version 1.1;
  namespace "a:uri";
  prefix "a";

  container parent {
    list a {
        key "name";
        leaf name {
            type string;
        }
        leaf something {
            type string;
        }
    }
    list b {
        must "not(../a[something=current()/something-else])";
        key "name";
        leaf name {
            type string;
        }
        leaf something-else{
            type string;
        }
    }
  }
}

无效文档示例:

<?xml version="1.0" encoding="utf-8"?>
<data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
  <a1:parent xmlns:a1="a:uri">
    <a1:a>
      <a1:name>a-1</a1:name>
      <a1:something>foo</a1:something>
    </a1:a>
    <a1:a>
      <a1:name>a-2</a1:name>
      <a1:something>foo</a1:something>
    </a1:a>
    <a1:b>
      <a1:name>b-1</a1:name>
      <a1:something-else>bar</a1:something-else> 
    </a1:b>
    <a1:b>
      <a1:name>b-2</a1:name>
      <a1:something-else>foo</a1:something-else>
    </a1:b>
  </a1:parent>
</data>

这会导致验证失败,例如: Error at (16:5): failed assert at "/nc:data/a1:parent/a1:b": Condition "not(../a1:a[a1:something=current()/a1:something-else])" must be true

请注意,这只是您如何满足您的要求的一个示例。例如,您可以将我的条件移动到 something-else 叶,然后它会变成这样(未测试):

not(.=../../a/something)

【讨论】:

  • 嘿,你的回答很好用。我刚刚意识到我有更复杂的事情,但我不想提出另一个问题。如果联合中的列表超过 2 个,您的解决方案将如何工作?
  • @SavvasParastatidis,如果你有一个额外的list c,其中有一个leaf something-else-entirely,你需要在b和c列表中添加“&ed”条件:not(../a[something=current()/something-else]) and not(../c[something-else-entirely=current()/something-else])到“list b " 和 not(../a[something=current()/something-else-entirely]) and not(../b[something-else=current()/something-else-entirely]) 到 "列表 c"。每个新列表都需要在所有列表中添加一个 & 条件(第一个列表除外 - a)。不理想。也许您需要从头开始重新考虑这个模型。
  • 是的,我意识到这很复杂。然而,它并不完全由我来设计,所以我会在提出建议之前找出解决方案。
猜你喜欢
  • 2012-05-29
  • 2020-06-28
  • 2012-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-07
  • 1970-01-01
相关资源
最近更新 更多