見出し画像

ZFS Storage で REST APIを使ってみる

こんにちは、辻村です。この記事は、以前書いた記事のアンコールです。REST APIを使うと、ZFS Storageや Oracle Solarisの情報を引き出すことができます。以前書いた記事に少し手を入れています。

1. 下準備


ZFS Storage で REST を使って情報を引き出したり、設定したりするには、3 つ用意する必要がある。

・Oracle ZFS Storage Appliance RESTful API Guide
・ZFS Storage 上で、REST のサービスを有効にする
・REST のサービスにアクセスするためにクライアント(今回は、Python のコードで書いている)


1.1 製品マニュアル


Oracle ZFS Storage Appliance RESTful API Guide には執筆現在( 2018 年 7 月 7 日)以下の製品マニュアルが docs.oracle.com に用意されている。

・(日本語版の最新)Oracle® ZFS Storage Appliance RESTful API ガイド、Release OS8.7.0
https://docs.oracle.com/cd/E81226_01/html/E81269/index.html
・(英語版の最新)Oracle® ZFS Storage Appliance RESTful API Guide, Release OS8.7.x
https://docs.oracle.com/cd/E79446_01/html/E79460/index.html
当然と言うべきか、英語の方が新しい。

1.2 ZFS Storage 上で、REST のサービスを有効にする


Oracle ZFS Storage で REST のサービスを有効にするには、BUI から、以下のように操作する。

(1) Configuration (構成)→ Services (サービス)を選んで、サービスの画面を開ける。
(2) RESTのサービスの上にマウスポインターを持って行くと、右側に電源ボタンのようなアイコンが表示されるので、そのボタンをクリック。
(3) RESTのサービスの左側の LED がグリーンになっていれば正常に起動されている。RESTにグリーンの LEDがついていれば正常稼動。

1.3 REST のサービスにアクセスするためにクライアント


RESTのサービスを試してみるだけであれば、世の中に出回っている REST クライアントを利用するのも一つの方法だ。
一例だが、Advanced REST Client は元々 Chrome のプラグインだったのだが、最近スタンドアロンのアプリケーションになった REST のクライアントだ。https://install.advancedrestclient.com/#/install (install とあるがいきなりインストールが始まったりしないのでご心配無く。)
このクライアントは XAuth-User などのヘッダーを自由に追加できる他、クライアント側のタイムアウト値をコントロール出来たり、また、リクエストの送信、受信、受信までの待ち時間といった項目を統計情報として表示してくれる。

2. 今回やろうとしていること


今回やろうとしていることはごく簡単なことで、Python の requests パッケージをつかって、ZFS Storage に接続したり、データリンクを表示したりする事だ。
皆さんの Python の環境には、pip などで requests パッケージを導入していただきたい。以下は私が作業するなかで、気が付いた点だ。

・Windows – Cygwin + Pycharm の環境でも正しいディレクトリにて pip install requests で Pycharm のライブラリに追加される模様。
(製品マニュアルを後で調べた所、Mac 版と同様にすべき)
・Mac – Pycharm の場合、プロジェクトを開いた後、Preferences から Project Interpreter を選び、ダイアログ下の+マークをクリックして追加。
virtualenv を使っていたり、通常の IDE を使っていない Python 環境では、pip install requests で必要なパッケージを導入してくれる。

3. ZFS Storage にRESTでつないでみる

3.1 https://:215/api/access/v1


requests パッケージを使うと、ごく短く書くことが出来る。
肝としては、requests パッケージに渡す URL の書き方、戻ってきた response は JSON 形式であるので、これを加工して表示するという事だ。
今回は、全く凝った事をせず、戻って来た返事は、素直に JSON として解釈して、pprint で表示している。
実際に RESTを使う際にはあまり好ましくないのであろうが、コードをシンプルにとどめるために、以下のことを実施している。

・証明書の警告がでるので、サンプルという意味で簡単にとどめるために、requests.get を実行する際、verify=False をわたし、証明書をあえて無視させている。
・認証は auth=(ユーザー名, パスワード) の形で、リクエストの形で流している。
・(付記)プロキシーの設定に関しては、http_proxyと https_proxy の環境変数を見ていると思っていたが、最近動かしてみるとうまくいかない。以下のような変数を設定して、request.get()の引数に proxy=myproxyとして渡した方が良さそうである。

proxies = {
    "http": None,
    "https": None,
}
r = requests.get(uri, auth=(user_name, password), proxies = proxies, verify=False)

3.2 https://<hogehoge>:215/api/network/v1/datalinks


データリンクを表示しようと思えば、マニュアルに記載があるように、https://<hogehoge>:215/api/network/v1/datalinks の API を使うことになる。
リンク先に示すサンプルでは、さらにそれぞれのリクエストが帰ってくるかを簡単に計測している。時間を計測するコードを含めたのは、ZFS Storage の内部の制約で、RESTful API の処理が 5 分以上(600秒)かかる場合、Internel Error (500) を返すためだ。

ZFS Storage 内で応答を用意するコードの効率が余りよくないのか、執筆時点では、戻ってくるオブジェクトの数が大きくなるにしたがって、応答時間が悪くなる。(個人的には 数が少ないとO(N) 位だが、数が増えると急に悪くなる感じなので、N二乗よりは少しマシに思える)

お使いの環境で、少ない件数ではじめていただいて、件数を増やすことでどの程度の性能劣化になるのかの参考にして頂きたい。

以上何かの参考になれば幸いである。


この記事はここまでです。 最後まで読んでいただいてありがとうございます。 気に入っていただいたなら、スキを押していただいたり、 共有していただけるとうれしいです。 コメントや感想大歓迎です!