Hitachi

Hitachi Command Suite Configuration Manager REST API リファレンスガイド


21.2 ストレージシステムの情報登録

ストレージシステムの情報登録のサンプルコード(register_storage.py)について説明します。

ストレージシステムの情報登録のサンプルコードの流れ

ストレージシステムの情報登録のサンプルコードの流れと、対応するコードの構成要素を次に示します。
ステップ

サンプルコードの流れ

コードの構成要素

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、G800VSP G1000VSP G1500VSP F400、F600、F800VSP F1500Virtual Storage PlatformUnified 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、G900VSP 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パラメータの値も事前に見直してください。

サンプルコードの内容

サンプルコードの内容について説明します。

  1. 必要なライブラリのインポートおよびパラメータの設定
    ストレージシステムの情報登録の処理を開始する前に、必要なライブラリやクラスをインポートします。サンプルコードでは、共通ライブラリのほか、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"
    
    ###########################################################
    
  2. ヘッダの定義
    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
    
    ###########################################################
    
  3. REST APIのバージョンの確認
    REST APIのバージョン情報を取得し、サポートしているバージョンであることを確認します。
    ヒント

    次の場合は、ストレージシステムのマイクロコードのバージョンが適切であるかどうかも確認してください。

    • REST APIサーバとストレージシステム間でSSL通信を利用する場合
    • ストレージシステムがVSP 5000 シリーズVSP E シリーズVSP G150、G350、G370、G700、G900VSP 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)
    
  4. ストレージシステムの情報登録

    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)
        
  5. ストレージシステムの情報取得
    ストレージシステムが正しく登録されていることを確認するため、ストレージデバイス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()  
        
  6. エラーメッセージの出力
    サンプルコードでは、通信エラー、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()