OpenDaylight Potassiumでプラグイン開発(RestconfでCRUD処理実装編)
はじめに
前回では、Potassium-SR2上で動作する環境を整えることが出来ました。
この環境で、データのCRUD操作をGUIで行えるようにしたいと思います。
OpenDaylightでは、YANGというモデリング言語により、RestconfのCRUD操作用エンドポイントの自動生成が可能になっています。今回は、これを利用してCRUD操作の機能を追加したいと思います。
OpenDaylightでは、YANGというモデリング言語により、RestconfのCRUD操作用エンドポイントの自動生成が可能になっています。今回は、これを利用してCRUD操作の機能を追加したいと思います。
概要
OpenDaylightには、YANG Toolsという、YANGのサポートや処理を行うツール群が存在します。
YANG Toolsを利用して、YANGで定義したデータ型の格納場所を、Datastoreにツリー構造で追加したり、RestconfのCRUD操作用エンドポイントを自動生成することができます。
今回は、このエンドポイントを使用してCRUD操作を行っていきたいと思います。
本記事のソースコード全体は以下から参照可能です。
https://github.com/t-matz/techblog-odlsample/tree/blog01
今回は、このエンドポイントを使用してCRUD操作を行っていきたいと思います。
本記事のソースコード全体は以下から参照可能です。
https://github.com/t-matz/techblog-odlsample/tree/blog01
実装
以下の手順でCRUD操作を行っていきます。
- YANGモデルの追加
- ビルド/ODLで読み込み
- CRUD操作
YANGモデルの追加
概要で触れましたが、Datastoreへ格納場所を作るにはYANGを定義する必要があります。
初期生成されたodlsample.yangに定義を追加していきたいと思います。
◦list
◦leaf
listに格納するノードを定義します。今回は
- revision
description
に書いておくと分かりやすいです。
revision "2024-03-04" { description "Initial revision of odlsample model"; }
- grouping
sample-grp
を再利用可能なノードの塊として定義します。
grouping sample-grp { list data-list { key "id"; leaf id { type string; } leaf name { type string; } leaf comment { type string; } leaf last-modified { config false; type string; } } }
◦list
data-list
は、 "格納" するためのノードのため、複数のノードを定義します。
◦leaf
listに格納するノードを定義します。今回は
id, name, comment, last-modified
のノードを定義しました。key "id";
とすることで、id
で一意に識別することが出来るようになります。また、config false;
を定義することでlast-modified
をReadOnlyにしています。この値はPOST/PUTすることはできません。
- container
sample
は、"格納" するためのノードで、モジュールの階層化された要素を表すために使用します。
uses sample-grp;
でgroupingで定義したノードの塊sample-grp
を利用出来るようになります。
container sample { uses sample-grp; }
確認
実装完了したら、前回同様mvnコマンドでビルドして、ODLで読み込みます。
読み込みが完了したら、以下のアドレスにアクセスできるようになります。ユーザー名/パスワードが要求されたら、admin/adminでログインしてください。
http://localhost:8181/openapi/explorer/index.html
ログインできると以下の画面が表示され、CRUD操作が行えるようになります。
http://localhost:8181/openapi/explorer/index.html
ログインできると以下の画面が表示され、CRUD操作が行えるようになります。
CRUD操作
odlsample.yang
に定義してあるモデルのCRUD操作を行っていきます。一番下にある、odlsampleでは、定義したデータ構造のCRUD操作が行えます。
- POST
試しにデータを登録してみましょう。 data-listのid,name,commentに適当な文字列を入力してみます。
今回は、以下のようにしました。
{ "data-list": [ { "id": "TEST1", "name": "TEST1", "comment": "POST DATA TEST1" } ] }
入力が終わったら、Executeボタンを押すことで、POSTすることが出来ます。 POSTした結果が下記に表示されます。GUIで操作しましたが、実際はcurlでPOSTデータを投げていることがわかります。
- GET
POSTしたものがDatastoreに反映されたかGETで確認してみましょう。 この際、contentはconfigを選択します。 POSTした内容が、Datastoreに反映されていることがわかりました。
◦content:nonconfig
次にcontentをnonconfigにしてGETしてみます。 データが存在しないため、エラーが返って来ています。 これには理由があります。
Datastore
実はDatastoreでは、CONFIGRATION DatastoreとOPERATIONAL Datastoreという二つの領域が存在し、別々にデータを保持しています。このOPERATIONAL Datastoreというのが、contentでいうnonconfigにあたります。通常POSTしたデータはCONFIGRATION Datastoreのみに保存されます。それはOPERATIONAL Datastoreが読み取り専用の領域になるからです。
概要で、YANGで定義したモデルがDatastoreにツリー構造で追加されると記述しましたが、以下のようなルールで追加されています。
POST/PUTの操作で、OPERATIONAL Datastoreにも変更を反映するには、プラグイン内での書き換え処理が必要になります。
概要で、YANGで定義したモデルがDatastoreにツリー構造で追加されると記述しましたが、以下のようなルールで追加されています。
- CONFIGRATIONのNodeはOPERATIONALにもある
- OPERATIONALのNodeはCONFIGRATIONにもあるとは限らない(ReadOnlyが存在する)
- YANGモデルにおいては、config false;という属性を与えることで表現する
POST/PUTの操作で、OPERATIONAL Datastoreにも変更を反映するには、プラグイン内での書き換え処理が必要になります。
おわりに
今回はYANGで定義したモデルでRestconfでCRUD操作が出来ることを確認しました。
次回は、OPERATIONAL Datastoreにも変更を反映するように、プラグイン内での書き換え処理を試していきたいと思います。