YANG: Как указать сложные определения типов

Я изучаю YANG. Я хочу, чтобы typedef состоял из Uri и списка IpAddress. Итак, я попробовал что-то вроде следующего:

  typedef mapping {
      type union {

                type inet:uri;

                 list addresses {
                     type inet:IpAddress;
                 }
         }
    }

Позже я хочу использовать этот определенный тип в контейнере. Но приведенное выше определение дало мне ошибку компиляции. Являются ли определения типов YANG похожими на определения типов С++? Как я могу определить такие структуры в YANG?


person LostInTheFrequencyDomain    schedule 16.10.2017    source источник
comment
Меня это тоже интересует. Я задал аналогичный вопрос некоторое время назад, но так и не получил ответа. Можете ли вы попробовать решение, которое я нашел? Это не сработало для меня, но я подозреваю, что у меня могла быть и другая проблема.   -  person Tama Yoshi    schedule 16.10.2017


Ответы (1)


Из того, что вы описываете, мне кажется, что вы хотите создать многократно используемое определение структуры с двумя полями: одно uri и список addresses. Лучшим инструментом для этой работы является группировка YANG. В RFC говорится, что «группировка похожа на «структуру» или «запись» в обычных языках программирования». Следующая группа должна быть тем, что вы ищете:

grouping mapping {
   leaf uri {
     type inet:uri;
   }
   list address {
     type inet:IpAddress;
   }
 }

Затем вы можете сослаться на такой grouping с помощью оператора uses, как в следующих примерах:

container specific_mapping {
    uses mapping;
}

а также

list my_mapping {
    key "uri";
    uses mapping;
}

Следующие экземпляры документов совместимы с указанными выше:

<specific_mapping>
    <uri>some uri</uri>
    <address>address 1</address>
    <address>address 2</address>
</specific_mapping>

а также

<my_mapping>
    <uri>some uri</uri>
    <address>address 1</address>
    <address>address 2</address>
</my_mapping>
<my_mapping>
    <uri>other uri</uri>
    <address>address 3</address>
    <address>address 4</address>
</my_mapping>

Оператор typedef объясняется в этом разделе YANG 1.1. RFC 7950. Он предназначен для указания типа одиночного листа, поэтому его нельзя использовать для создания желаемой структуры. Когда вы используете typedef, вы определяете набор всех возможных значений для этого типа. Это называется пространство значений. union встроенный тип, который вы пытались использовать, предназначен для объединения ценности пробелы типов, перечисленных внутри него. list не является типом, поэтому его здесь нельзя использовать.

person Piotr Babij    schedule 17.10.2017