APRESIA Technical Blog

OpenDaylight Potassiumでプラグイン開発 (開発環境構築編)

はじめに

OpenDaylight(ODL)は、OSSのSDNコントローラーフレームワークです。2013年より開発が始まり、現在はLF Networkingのプロジェクトのひとつとして開発が進められています。ODLはJavaベースで開発されているフレームワークで、実態はbundleと呼ばれるプラグイン群で構成されています。今回は、現時点(2024年3月)での最新版であるOpenDaylight Potassium-SR2上で動作するプラグインの開発を試していきたいと思います。

以下の記事に分けて説明していきます。今回は開発環境構築編になります。

  1. 開発環境構築
  2. RestconfでCRUD処理実装
  3. DataTreeChangeListenerを使ったイベント駆動処理実装
  4. Notification処理実装

環境

以下の環境で試しています。
項目 内容
OS ubuntu 20.04
Java openjdk 17.0.10
Maven 3.9.5
上記ツールのインストール方法に関しては公式ページを参考にしてください。

Maven設定

Mavenで各種ライブラリ管理していますが、一部ODL専用のリポジトリを使うため、設定を変更しておきます。設定ファイルは公式が用意してくれているので、そのまま使うことが出来ます。
cp -n ~/.m2/settings.xml{,.orig}
wget -q -O - https://raw.githubusercontent.com/opendaylight/odlparent/master/settings.xml > ~/.m2/settings.xml
 

Archetypes

Mavenにはプロジェクトの雛形を作成するためにArchetypesという仕組みがあります。ODL公式からもプラグイン開発用のArchetypesが提供されていますが、情報が若干古いため動作しません。
そこで公式のArchetypesを参考に、最新(Potassium)で動作するプラグイン用のArchetypesを以下に公開しました。今回はこちらを使って開発していきます。
https://github.com/t-matz/archetypes
独自のArchetypesを使うには、ローカルにインストールする必要がありますので、以下の通りインストールします。
git clone https://github.com/t-matz/archetypes
cd archetypes/opendaylight-startup
mvn install
「BUILD SUCCESS」と表示されたらインストール完了です。

雛形の作成

上記で作成したArchetypesを使って、プラグイン開発用のプロジェクトを作成していきます。Archetypesを実行すると、プロジェクト用のディレクトリが生成されるので、適切な場所で以下の通り実行してください。
mvn archetype:generate -DarchetypeGroupId=org.opendaylight.archetypes -DarchetypeArtifactId=opendaylight-startup-archetype -DarchetypeVersion=1.8.0-SNAPSHOT
初回はいくつかのライブラリダウンロードで時間がかかりますが、しばらくすると以下のようにいくつか質問されるので、自分の環境に応じて適宜回答していきます。 本記事では、以下の想定で回答しました。
項目 内容 説明
copyright APRESIA Systems, Ltd. ソースコードのヘッダに記載される著作権表示
groupId jp.apresia.techblog プロジェクトのgroupId。 javaのpackage名になる
artifactId odlsample プロジェクトのartifactId。各サブプロジェクトはこちらの名前をベースに生成される。また、プロジェクトのディレクトリ名にも利用される
 
[INFO] Generating project in Interactive mode
[INFO] Archetype repository not defined. Using the one from [org.opendaylight.archetypes:opendaylight-startup-archetype:1.2.2] found in catalog remote
Define value for property 'copyright': APRESIA Systems, Ltd.
[INFO] Using property: copyrightYear = 2024
[INFO] Using property: version = 0.1.0-SNAPSHOT
Define value for property 'groupId': jp.apresia.techblog
Define value for property 'artifactId': odlsample
Define value for property 'package' jp.apresia.techblog: :
Define value for property 'classPrefix' Odlsample: :
Confirm properties configuration:
copyright: APRESIA Systems, Ltd.
copyrightYear: 2024
version: 0.1.0-SNAPSHOT
groupId: jp.apresia.techblog
artifactId: odlsample
package: jp.apresia.techblog
classPrefix: Odlsample
 Y: :
[INFO] ----------------------------------------------------------------------------
「BUILD SUCCESS」の文字と、実行したパスの直下にodlsampleという名前のディレクトリが生成されていれば成功です。

ビルドの確認

上記で雛形の作成に成功したら、一度そのままの状態でビルドしてみます。以下のコマンドを実行します。
cd odlsample
mvn clean install
「BUILD SUCCESS」と表示されたらビルド成功です。

OpenDaylightのダウンロードと設定

上記でビルドしたプラグインをOpenDaylight上で動作させるために、OpenDaylight本体を準備します。
OpenDaylightは公式からダウンロードします。動作環境に応じて適切なファイルタイプをダウンロードしてください。今回はubuntu上で動作させたいので、Tar形式のものをダウンロードしました。
wget https://nexus.opendaylight.org/content/repositories/opendaylight.release/org/opendaylight/integration/karaf/0.19.2/karaf-0.19.2.tar.gz
tar xvf karaf-0.19.2.tar.gz
cd karaf-0.19.2
デフォルト状態の場合、ローカルのmavenリポジトリを参照してくれないので、以下を書き換えておきます。
vi etc/org.ops4j.pax.url.mvn.cfg
以下行をコメントアウト
org.ops4j.pax.url.mvn.localRepository=${karaf.home}/${karaf.default.repository}
↓↓
#org.ops4j.pax.url.mvn.localRepository=${karaf.home}/${karaf.default.repository}

プラグインのインストール

ODLに先ほどビルドしたプラグインをインストールします。プラグインのインストールはODLのコマンドライン上で実施可能です。
ODLは以下で起動できます。(まっさらな環境で立ち上げるためにcleanオプションを付与しています)
./bin/karaf clean
上記実行すると、ODLのプロンプト入力待ち状態となり、ODLのコマンド実行が可能になります。
プラグインをインストールするために、自作プラグイン用のfeatureカタログを追加します。
opendaylight-user@root>feature:repo-add mvn:jp.apresia.techblog/odlsample-features/0.1.0-SNAPSHOT/xml/features
Adding feature url mvn:jp.apresia.techblog/odlsample-features/0.1.0-SNAPSHOT/xml/features
※コマンド内のjp.apresia.techblogはArchetypesで回答したgroupId、 odlsample-featuresはArchetypesで回答したartifactIdを一部使って<artifactId>-featuresにそれぞれ置き換えてください。
今回開発するプラグインのfeature(それぞれのbundleが固まったもの)をインストールします。
opendaylight-user@root>feature:install odlsample-features
プラグインが読み込まれているかどうか、ログで確認します。
opendaylight-user@root>log:display jp.apresia.techblog
16:27:46.644 INFO [features-3-thread-1] OdlsampleProvider Session Initiated
※同様にコマンド内のjp.apresia.techblogはArchetypesで回答したgroupIdに置き換えてください。
「XXXXX Session Initiated」というログが確認できたら、プラグイン読み込み成功です。
以上で、環境構築は一通り完了となります。次回から自作プラグインに機能を追加していきたいと思います。

おまけ

ODLプラグインはMavenプロジェクトであり、Javaベースで開発します。Javaを書く環境は何を使っても問題ありませんが、本記事ではVisual Studio CodeのExtension Pack for Javaを利用して開発しました。