如何使用leafref在YANG模型中实现递归?

时间:2019-10-23 14:15:13

标签: xml data-modeling ietf-netmod-yang

我有以下要使用YANG建模的XML。 XML包含一个节点列表,每个节点包含一个邻居节点列表。

<nodes>
  <node>
    <id>1</id>
    <node>
      <id>2</id>
    </node>
  </node>
  <node>
    <id>3</id>
    <node>
      <id>4</id>
    </node>
  </node>
</nodes>

请在我尝试创建的YANG模型下方找到。遗憾的是,Yang不支持在分组中使用循环引用。

grouping node {
  list node {
    leaf id {
      type int32;
    }
    uses node;
  }
}

container nodes {
   uses node;
}

我在draft-ietf-netmod-routing-cfg-16ietf mail archive中看到,一种模拟递归的方法是使用leafref。上面的xml如何用grouping和leafref建模?

1 个答案:

答案 0 :(得分:1)

正如您所说,不支持使用分组进行递归。 最简单的方法是拥有一个平面的节点列表,其中每个节点都有一个父节点,称为叶引用。 像这样:

container nodes {
  list node {
    key id;
    leaf id { type int32; }
    leaf parent-id {
      type leafref {
        path "../../node/id";
      }
    }
  }
}

等效的XML将是:

<nodes>
  <node>
    <id>1</id>
  <node>
  <node>
    <id>2</id>
    <parent-id>1</parent-id>
  </node>
  <node>
    <id>3</id>
  <node>
  <node>
    <id>4</id>
    <parent-id>3</parent-id>
  </node>
</nodes>

您可以做相反的事情,即节点引用其子节点(通过leafref叶子列表)而不是其父节点。


当然,直接递归使用同一数据节点确实可行:

container nodes {
  list node {
    key id;
    leaf id { type int32; }

    list node {
      key id;
      leaf id { type int32; }

      list node {
        key id;
        leaf id { type int32; }

        // and so on
      }
    }
  }
}

但是这不允许无限深层次。不过,我会避免使用这种模式,这不是一个干净的模型设计。