как сгенерировать код с помощью плагина ODL Yangtools maven для модуля yang-версии 1.1

Как сгенерировать код Java из модуля yang версии 1.1 с помощью плагина maven OpenDaylight Yangtools?

У меня есть модель yang версии 1.1 (первая часть показана далее)

module o-ran-sc-my-desc-v1 {
    yang-version 1.1;
    namespace "urn:o-ran:my-desc:1.0";
    prefix rxad;

    organization
        "O-RAN Software Community";
    contact
        "www.o-ran.org";

Я начал с руководства по инструментам YANG https://wiki.opendaylight.org/view/YANG_Tools:User_Guide для создания POM-файла и генерации кода. У него старые версии и недопустимое имя класса генератора кода. Я обновился до плагина версии 4.0.1, генератора кода версии 3.0.9, оба являются самыми последними в Maven Central, и выяснил имя класса генератора кода. Наконец-то что-то заработало в maven, но теперь я получаю эту ошибку генератора кода:

[ERROR] Failed to execute goal org.opendaylight.yangtools:yang-maven-plugin:4.0.1:generate-sources (default) on project o1-netconf-client: 
Execution default of goal org.opendaylight.yangtools:yang-maven-plugin:4.0.1:generate-sources failed: An API incompatibility was 
encountered while executing org.opendaylight.yangtools:yang-maven-plugin:4.0.1:generate-sources: java.lang.NoSuchMethodError: 
org.opendaylight.yangtools.yang.model.util.SchemaNodeUtils.getAllTypeDefinitions(Lorg/opendaylight/yangtools/yang/model/api/DataNodeContainer;)Ljava/util/Collection;

Соответствующая часть POM размещена ниже для полноты.

            <plugin>
                <groupId>org.opendaylight.yangtools</groupId>
                <artifactId>yang-maven-plugin</artifactId>
                <version>4.0.1</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>generate-sources</goal>
                        </goals>
                        <configuration>
                            <!-- directory containing yang files to parse and generate code -->
                            <yangFilesRootDir>my/agent/yang</yangFilesRootDir>
                            <codeGenerators>
                                <generator>
                                    <codeGeneratorClass>
                                        org.opendaylight.mdsal.binding.maven.api.gen.plugin.CodeGeneratorImpl
                                    </codeGeneratorClass>
                                    <!-- directory into which generated files will be placed -->
                                    <outputBaseDir>
                                        target/generated-sources/sal
                                    </outputBaseDir>
                                </generator>
                            </codeGenerators>
                            <!-- if true, plugin will search for yang files also in dependent 
                                projects -->
                            <inspectDependencies>true</inspectDependencies>
                        </configuration>
                    </execution>
                </executions>
               <dependencies>
                    <dependency>
                        <groupId>org.opendaylight.mdsal</groupId>
                        <artifactId>maven-sal-api-gen-plugin</artifactId>
                        <version>3.0.9</version>
                        <type>jar</type>
                    </dependency>
               </dependencies>
            </plugin>

Возможно ли, что я использую несовместимые версии?


person chrisinmtown    schedule 13.02.2020    source источник


Ответы (2)


Найдено решение для создания классов привязки Java из модели yang версии 1.1 с использованием Open Daylight:

  1. Установите родительский pom в файл Open Daylight. Родитель указывает совместимые версии, определяет генератор кода и т. д.
  2. Поместите файлы yang в каталог src/main/yang. Наличие этого каталога активирует требуемый профиль из #1.

Рабочий POM показан ниже, он абсурдно короткий, надеюсь, это избавит следующего человека от некоторого разочарования.

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.opendaylight.mdsal</groupId>
        <artifactId>binding-parent</artifactId>
        <version>5.0.9</version>
        <relativePath></relativePath>
    </parent>
    <groupId>org.your.group.id.goes.here</groupId>
    <artifactId>o1-netconf-client</artifactId>
    <packaging>jar</packaging>
    <name>Descriptive Name Goes Here</name>
    <version>0.0.1-SNAPSHOT</version>
</project>

Когда я запускаю «mvn install», выполняемые шаги включают генерацию исходного кода, тестирование, пакет в виде jar и т. д. Это критично:

[INFO] --- yang-maven-plugin:4.0.6:generate-sources (binding) @ o1-netconf-client ---
[INFO] yang-to-sources: Code generator instantiated from org.opendaylight.mdsal.binding.maven.api.gen.plugin.CodeGeneratorImpl
[INFO] yang-to-sources: Inspecting /Users/me/path/to/files/o1-netconf-client/src/main/yang
[INFO] yang-to-sources: Found 0 dependencies in 16.91 ms
[INFO] yang-to-sources: Project model files found: 2
[INFO] yang-to-sources: 2 YANG models processed in 174.2 ms
[INFO] yang-to-sources: Sources will be generated to /Users/me/path/to/files/o1-netconf-client/target/generated-sources/mdsal-binding
[INFO] Found 13 Binding types in 106.8 ms
[INFO] Generating 21 Binding source files into 8 directories
[INFO] yang-to-sources: Sources generated by org.opendaylight.mdsal.binding.maven.api.gen.plugin.CodeGeneratorImpl: 26 in 211.1 ms

Если вы хотите создать свой собственный, выберите совместимые версии здесь: https://docs.opendaylight.org/projects/integration-distribution/en/latest/platform-versions.html

person chrisinmtown    schedule 14.02.2020
comment
Спасибо за это, это было полезно. Знаете ли вы какие-нибудь примеры того, как использовать сгенерированный код для создания небольшого Java-клиента netconf? - person Michael H; 08.07.2020
comment
@ michael-h Мне никогда не удавалось создать клиента. Вы можете попробовать lighty.io/components/#client. IIRC netconf, похоже, не поддерживает простое взаимодействие вызовов и ответов в стиле REST, вместо этого ваша программа в основном становится активным узлом, который может совершать вызовы, и будут вызываться другими узлами. - person chrisinmtown; 08.07.2020

Я обнаружил, что добавление следующего в POM без каких-либо других дополнений было достаточным для компиляции YANG.

<parent>
    <groupId>org.opendaylight.mdsal</groupId>
    <artifactId>binding-parent</artifactId>
    <version>6.0.8</version>
    <relativePath/>
  </parent>

  <groupId>your.group.id</groupId>
  <artifactId>YourArtifactId</artifactId>
  <version>1.0-SNAPSHOT</version>

Вы также можете использовать компилятор YANG Open Network Operating System (ONOS) аналогичным образом.

Как видно из приведенной ниже записи maven POM, вы можете настроить расположение файлов YANG для компиляции.

<dependency>
  <groupId>org.onosproject</groupId>
  <artifactId>onos-yang-compiler-maven-plugin</artifactId>
  <version>2.4.4</version>
</dependency>

<plugin>
    <groupId>org.onosproject</groupId>
    <artifactId>onos-yang-maven-plugin</artifactId>
    <version>1.11</version>
    <executions>
      <execution>
        <configuration>
          <yangFilesDir>src/main/yang</yangFilesDir>
        </configuration>
        <goals>
          <goal>yang2java</goal>
        </goals>
      </execution>
    </executions>
  </plugin>

Это сгенерирует интерфейсы и классы Java в целевые/сгенерированные источники, которые будут доступны в виде скомпилированных классов для импорта из файла jar, который создает компонент POM.

Подробнее о том, как настроить компилятор ONOS и что он делает, можно прочитать по адресу: https://wiki.onosproject.org/display/ONOS/YANG+Compiler

Для тех, кто интересуется различием между OpenDaylight и ONOS, это очень краткое изложение основных различий: https://cloudsmartz.com/insights/onos-and-odl-know-the-difference/

person GCUGreyArea    schedule 12.06.2021