21.2 ストレージシステムの情報登録
ストレージシステムの情報登録のサンプルコードの流れ
| ステップ |
サンプルコードの流れ |
コードの構成要素 |
|---|---|---|
|
1 |
必要なライブラリのインポートおよびパラメータの設定 |
― |
|
2 |
ヘッダの定義 |
リクエストヘッダの指定(既定のHTTPヘッダの場合) |
|
3 |
REST APIのバージョンの確認 |
GET操作によるREST APIバージョン情報の取得 |
|
4 |
ストレージシステムの情報登録 |
リソースのURL 取得(オブジェクトIDを指定しない場合) JSON形式によるリクエストボディの生成 POST操作によるオブジェクトの新規作成 |
|
5 |
ストレージシステムの情報取得 |
GET操作によるオブジェクトの取得(特定のオブジェクトを取得する場合) 取得した情報の出力 |
|
6 |
エラーメッセージの出力 |
エラーメッセージの出力 |
想定するシステム構成
このサンプルコードでは、次の概念図のようなシステム構成を想定しています。
サンプルコードのパラメータに設定している値を次に示します。必要に応じて、システムの環境や要件に合わせた設定に変更してください。
|
パラメータ |
設定値 |
説明 |
|---|---|---|
|
USER_CREDENTIAL |
("user1", "pass1") |
ストレージシステムでの認証に使用する認証情報です。サンプルコードの例は、ユーザIDがuser1、パスワードがpass1の場合の設定例です。 このユーザには、セキュリティ管理者(参照)またはセキュリティ管理者(参照・編集)のロールが必要です。 |
|
IS_SECURE |
"true" |
REST APIサーバとストレージシステム間のSSL通信を有効にするかどうか設定します。サンプルコードの例は、SSL通信を有効にする場合の設定例です。 |
ローカルストレージシステムの情報をサンプルコード間での共通変数として使うために、storage_param.pyファイルに定義したパラメータと値を使用します。登録するストレージシステムによって、ファイル内のパラメータを使い分けてください。使用しないパラメータは、コメント行にしてください。
VSP 5000 シリーズ、VSP G100、G200、G400、G600、G800、VSP G1000、VSP G1500、VSP F400、F600、F800、VSP F1500、Virtual Storage Platform、Unified Storage VMの場合は、次のパラメータを設定します。
|
パラメータ |
設定値 |
説明 |
|---|---|---|
|
SVP_IP_ADDR |
192.0.2.100 |
SVPのIPアドレスです。 |
|
STORAGE_MODEL |
VSP G800 |
ストレージシステムのモデル名です。 |
|
SERIAL_NUMBER |
410000 |
ストレージシステムのシリアル番号です。 |
VSP E シリーズ、VSP G150、G350、G370、G700、G900、VSP F350、F370、F700、F900の場合は、次のパラメータを設定します。
|
パラメータ |
設定値 |
説明 |
|---|---|---|
|
GUM1_IP_ADDR※ |
192.0.3.100 |
ストレージシステムのコントローラ1のIPアドレスです。 |
|
GUM2_IP_ADDR※ |
192.0.3.200 |
ストレージシステムのコントローラ2のIPアドレスです。 |
|
STORAGE_MODEL※ |
VSP G900 |
ストレージシステムのモデル名です。 |
|
SERIAL_NUMBER※ |
420000 |
ストレージシステムのシリアル番号です。 |
注※ 初期状態ではコメント行になっています。
また、ご利用のストレージシステムに合わせて、BlockStorageAPIクラスを定義したファイル(block_storage_api.py)のSTORAGE_MODEL_DICTパラメータの値も事前に見直してください。
サンプルコードの内容
サンプルコードの内容について説明します。
- 必要なライブラリのインポートおよびパラメータの設定 ストレージシステムの情報登録の処理を開始する前に、必要なライブラリやクラスをインポートします。サンプルコードでは、共通ライブラリのほか、URLを生成する関数を定義したBlockStorageAPIクラスをインポートしています。
# coding:utf-8 """ register_storage This program requires API version 1.9.1 or newer. """ import traceback import requests import json import sys import http.client import storage_param import rest_server_param from block_storage_api import BlockStorageAPI
サンプルコード内で使用するパラメータを設定します。# #################Initialize parameters################# # # Change the following parameters to fit your environment # An user id and password of the target storage USER_CREDENTIAL = ("user1", "pass1") # Enable cipher mode IS_SECURE = "true" ########################################################### - ヘッダの定義 HTTPリクエストヘッダを定義します。REST APIはJSON形式のデータだけをサポートしているため、データをJSON形式で扱うようヘッダ情報を定義しておきます。
# ###You don't have to change the following parameters### # block_storage_api = BlockStorageAPI( rest_server_param.REST_SERVER_IP_ADDR, rest_server_param.REST_SERVER_PORT, storage_param.STORAGE_MODEL, storage_param.SERIAL_NUMBER) headers = {"content-type": "application/json", "accept": "application/json"} REQUIRED_MAJOR_VERSION = 1 REQUIRED_MINOR_VERSION = 9 REQUIRED_REVISION_VERSION = 1 ########################################################### - REST APIのバージョンの確認 REST APIのバージョン情報を取得し、サポートしているバージョンであることを確認します。
- ヒント
-
次の場合は、ストレージシステムのマイクロコードのバージョンが適切であるかどうかも確認してください。
- REST APIサーバとストレージシステム間でSSL通信を利用する場合
- ストレージシステムがVSP 5000 シリーズ、VSP E シリーズ、VSP G150、G350、G370、G700、G900、VSP F350、F370、F700、F900の場合
REST APIのバージョンとストレージシステムのマイクロコードのバージョンの対応については、Configuration Managerバージョン対応表を参照してください。
""" Check whether this API version allows the REST Server to execute this program @param api_version api version of this REST Server @param required_major_version the lowest number of the major version that this program requires @param required_minor_version the lowest number of the minor version that this program requires """ def check_api_version(api_version, required_major_version, required_minor_version, required_revision_version): version = api_version.split(".") major_version = int(version[0]) minor_version = int(version[1]) revision_version = int(version[2]) version_error = False if major_version == required_major_version: if minor_version == required_minor_version: if revision_version < required_revision_version: version_error = True elif minor_version < required_minor_version: version_error = True elif major_version < required_major_version: version_error = True if version_error == True: sys.exit( "This program requires API Version " + str(required_major_version) + "." + str(required_minor_version) + "." + str(required_revision_version) + " or newer.\n")try: # step1 Check the API version # print("Check the API version") url = block_storage_api.api_version() r = requests.get(url, headers=headers, verify=False) if r.status_code != http.client.OK: raise requests.HTTPError(r) check_api_version( r.json()["apiVersion"], REQUIRED_MAJOR_VERSION, REQUIRED_MINOR_VERSION, REQUIRED_REVISION_VERSION) -
ストレージシステムの情報登録
REST APIサーバに、管理対象にするストレージシステムの情報を登録します。このコードでは、登録するストレージシステムによって、リクエストボディの内容を切り替えて使用しています。# step2 Register a storage print("Register a storage") url = block_storage_api.local_storages() if storage_param.SVP_IP_ADDR is not None: body = { "svpIp": storage_param.SVP_IP_ADDR, "serialNumber": storage_param.SERIAL_NUMBER, "model": storage_param.STORAGE_MODEL, "isSecure" : IS_SECURE } else: body = { "ctl1Ip": storage_param.GUM1_IP_ADDR, "ctl2Ip": storage_param.GUM2_IP_ADDR, "serialNumber": storage_param.SERIAL_NUMBER, "model": storage_param.STORAGE_MODEL } r = requests.post(url, headers=headers, data=json.dumps(body), auth=USER_CREDENTIAL, verify=False) if r.status_code != http.client.OK: raise requests.HTTPError(r) - ストレージシステムの情報取得 ストレージシステムが正しく登録されていることを確認するため、ストレージデバイスIDを指定して、登録されたストレージシステムの情報を取得します。このコードでは、登録されたストレージシステムによって、取得する内容を切り替えて出力しています。
# step3 Get the storage print("Get the storage") url = block_storage_api.local_storage( str(r.json()["storageDeviceId"])) r = requests.get(url, headers=headers, auth=USER_CREDENTIAL, verify=False) if r.status_code != http.client.OK: raise requests.HTTPError(r) if storage_param.SVP_IP_ADDR is not None: print("STORAGE DEVICE ID : " + str(r.json()["storageDeviceId"])) print("MODEL : " + r.json()["model"]) print("SERIAL NUMBER : " + str(r.json()["serialNumber"])) print("SVP IP ADDRESS : " + r.json()["svpIp"]) print("RMI PORT : " + str(r.json()["rmiPort"])) print("DKC MICRO VERSION : " + r.json()["dkcMicroVersion"]) print() else: print("STORAGE DEVICE ID : " + str(r.json()["storageDeviceId"])) print("MODEL : " + r.json()["model"]) print("SERIAL NUMBER : " + str(r.json()["serialNumber"])) print("CTL1 IP ADDRESS : " + r.json()["ctl1Ip"]) print("CTL2 IP ADDRESS : " + r.json()["ctl2Ip"]) print("TARGET CONTROLLER : " + str(r.json()["targetCtl"])) print("DKC MICRO VERSION : " + r.json()["dkcMicroVersion"]) print() - エラーメッセージの出力 サンプルコードでは、通信エラー、HTTPリクエストエラー、ジョブ実行時エラーの処理を記載しています。通信エラーの場合は、エラーメッセージを出力します。HTTPリクエストエラーの場合は、エラーコードとメッセージ、レスポンスボディを出力します。ジョブ実行時エラーの場合は、ジョブの実行結果に含まれる内容をすべて出力します。
except requests.ConnectionError: sys.stderr.write("Connection Error!\n") sys.stderr.write(traceback.format_exc()) except requests.HTTPError as he: sys.stderr.write("HTTP Error! status code : ") sys.stderr.write(str(he.args[0].status_code) + "\n") sys.stderr.write(he.args[0].text + "\n") except Exception as e: sys.stderr.write(traceback.format_exc()) for msg in e.args: sys.stderr.write(str(msg) + "\n") finally: print("Operation was completed.") sys.exit()