OpenDayLightのドキュメントは結構充実しているが、古かったり、たくさんあったりでどれを信頼していいかわからない。

公式Developer DocumentのDeveloping Apps on the OpenDaylight controllerの通り実施しようとしたら大ハマリした。

事前準備:環境構築

ひとまずGettingStarted:Development Environment Setupの通り環境をUbuntu上で構築する。

.bashrcに書くべき以下のパラメータは-XX:MaxPermSize=512mの部分のパラメータがコンパイル時にWarning出るのでOptionalの設定なのでやめました。

あと必要性があるかはわかりませんが、念の為Server Faultの通りに.bashrcにJAVE_HOMEを設定しました。

それでドキュメント通りm2のsetteing.xmlを入手する。

ハマりポイント1:archetype

さて第一のハマりポイント

をドキュメント通り実行すると、以下のエラーが帰ってくる。

ググりまくった結果、stackoverflowの解決方法が正しくてDarchetypeCatalog=remoteをするのが重要そう。maven-archetype-puginが3以降だと問題が起きるみたいです。

Archetype-VersionはOpenDayLight wikiに書いてある。

というわけで以下で解決した。

ハマりポイント2:onSessionInitiated

引き続き、Defining a Simple Hello World RPCに従って作業していくとこれまたはまる。HelloProvider.javaで定義するonSessionInitiatedが呼ばれないのである。

結論から言うとPart 2 – Hello World – Defining a Simple RPCを信じなさいということになります。onSessionInitiatedが呼ばれないのでInitでaddRpcImplementationを呼ぶ必要がある模様である。なお、impl-blueprint.xmlも編集しないと、featureのbuild時に失敗する。

といわけで、最終的に以下のような感じになりました。

api/src/main/yang/hello.yang

api/src/main/yang/hello.yang はサンプル通り以下のように作成

impl/src/main/java/org/opendaylight/hello/impl/HelloWorldImpl.java

impl/src/main/java/org/opendaylight/hello/impl/HelloWorldImpl.java はサンプル通り以下のように作成

impl/src/main/resources/org/opendaylight/blueprint/impl-blueprint.xml

impl/src/main/resources/org/opendaylight/blueprint/impl-blueprint.xml は以下の通りrpcRegistryのreferenceとbean配下のargumentを追加

impl/src/main/java/org/opendaylight/hello/impl/HelloProvider.java

impl/src/main/java/org/opendaylight/hello/impl/HelloProvider.java は以下のように変更しました。コンストラクタは自動生成されたのはdataBrokerのみでしたが、rpcProviderRegistryも引数にします。

そのためにorg.opendaylight.controller.sal.binding.api.RpcProviderRegistryをimportする必要があります。

onSessionIntiatedは呼ばれていないはずですが一応そのまま残しています。