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は呼ばれていないはずですが一応そのまま残しています。