APRESIA Technical Blog

OpenDaylight Potassiumでプラグイン開発(RestconfでCRUD処理実装編)

はじめに

前回では、Potassium-SR2上で動作する環境を整えることが出来ました。 この環境で、データのCRUD操作をGUIで行えるようにしたいと思います。

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操作を行っていきます。

  1. YANGモデルの追加
  2. ビルド/ODLで読み込み
  3. CRUD操作

YANGモデルの追加

概要で触れましたが、Datastoreへ格納場所を作るにはYANGを定義する必要があります。 初期生成されたodlsample.yangに定義を追加していきたいと思います。

  • 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操作が行えるようになります。

CRUD操作

odlsample.yangに定義してあるモデルのCRUD操作を行っていきます。
一番下にある、odlsampleでは、定義したデータ構造のCRUD操作が行えます。

  • POST
POSTを展開してTry it outボタンを押すと編集できます。
試しにデータを登録してみましょう。 data-listのid,name,commentに適当な文字列を入力してみます。

今回は、以下のようにしました。

{
"data-list": [
  {
    "id": "TEST1",
    "name": "TEST1",
    "comment": "POST DATA TEST1"
  }
]
}


入力が終わったら、Executeボタンを押すことで、POSTすることが出来ます。 POSTした結果が下記に表示されます。GUIで操作しましたが、実際はcurlでPOSTデータを投げていることがわかります。

  • GET
content:config
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にツリー構造で追加されると記述しましたが、以下のようなルールで追加されています。


  • CONFIGRATIONのNodeはOPERATIONALにもある
  • OPERATIONALのNodeはCONFIGRATIONにもあるとは限らない(ReadOnlyが存在する)
    • YANGモデルにおいては、config false;という属性を与えることで表現する


POST/PUTの操作で、OPERATIONAL Datastoreにも変更を反映するには、プラグイン内での書き換え処理が必要になります。

おわりに

今回はYANGで定義したモデルでRestconfでCRUD操作が出来ることを確認しました。
次回は、OPERATIONAL Datastoreにも変更を反映するように、プラグイン内での書き換え処理を試していきたいと思います。