Как реализовать рекурсию в модели YANG с использованием leafref? - PullRequest
0 голосов
/ 23 октября 2019

У меня есть следующий XML, который я хочу смоделировать с помощью YANG. XML содержит список узлов, а каждый узел содержит список соседних узлов.

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

Ниже приведена модель YANG, которую я пытался создать. К сожалению, Ян не поддерживает циклические ссылки в группировке.

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

container nodes {
   uses node;
}

Я видел в draft-ietf-netmod-routing-cfg-16 и в почтовом архиве ietf что способ подражать рекурсии - это использовать leafref. Как можно смоделировать вышеупомянутый xml с помощью группировки и листьев?

1 Ответ

1 голос
/ 26 октября 2019

Как вы сказали, рекурсия с использованием группировок не поддерживается. Простейший подход состоит в том, чтобы иметь плоский список узлов, где каждый узел имеет родительский узел, на который ссылаются как на ссылку. Что-то вроде:

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>

Вы можете сделать обратное, когда узел ссылается на своих потомков (через лист-лист), а не на свой лист. родители.


Конечно, использование одного и того же узла данных напрямую рекурсивно работает:

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
      }
    }
  }
}

, но это не допускает бесконечно глубоких иерархий. Я бы не стал использовать эту модель, а не чистый дизайн модели.

...