Hitachi

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


21.8 ファイルダウンロードのサンプルコード(暗号化鍵バックアップ)

暗号化鍵バックアップのサンプルコードについて説明します。このサンプルコードには、暗号化鍵バックアップファイルをクライアントにダウンロードする手順があります。

暗号化鍵バックアップのサンプルコードの流れ

暗号化鍵バックアップのサンプルコードの流れと、対応するコードの構成要素を次に示します。
ステップ

サンプルコードの流れ

コードの構成要素

1

必要なライブラリのインポートおよびパラメータの設定

2

ヘッダの定義

リクエストヘッダの指定(既定のHTTPヘッダの場合)

3

REST APIのバージョンの確認

GET操作によるREST APIバージョン情報の取得

4

暗号化鍵バックアップのダウンロード

リソースのURL取得(単一インスタンスなどの固定のオブジェクトIDを指定する場合)

PUT操作によるオブジェクトに対するアクションの実行

5

エラーメッセージの出力

エラーメッセージの出力

サンプルコードのパラメータに設定する値

サンプルコードのパラメータに設定している値を次に示します。必要に応じて、システムの環境や要件に合わせた設定に変更してください。

パラメータ

設定値

説明

USER_CREDENTIAL

("user1","pass1")

ストレージシステムでの認証に使用する認証情報です。サンプルコードの例は、ユーザIDがuser1、パスワードがpass1の場合の設定例です。このユーザには、セキュリティ管理者(参照・編集)ロールが必要です。

BACKUP_PASSWORD

backuppassword

暗号化鍵バックアップファイルのパスワードです。

ENCRYPTION_KEY_BACKUP_FILE_PATH

D:\encryption\\

暗号化鍵バックアップファイルの格納先のパスです。

ENCRYPTION_KEY_BACKUP_FILE_NAME

backupfile.ekf

暗号化鍵バックアップファイルのファイル名です。

サンプルコードの内容

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

  1. 必要なライブラリのインポートおよびパラメータの設定

    ボリューム割り当ての処理を開始する前に、必要なライブラリやクラスをインポートします。サンプルコードでは、共通ライブラリのほか、URLを生成する関数を定義したBlockStorageAPIクラスをインポートしています。

    # coding:utf-8
    
    """
    backup_encryption_keys
    
    This program requires API version 1.12.0 or newer.
    """
    
    import requests
    import json
    import sys
    import http.client
    import traceback
    import rest_server_param
    import storage_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")
    
    # A backup password
    BACKUP_PASSWORD = "backuppassword"
    
    # A path of encryption key backup file
    ENCRYPTION_KEY_BACKUP_FILE_PATH = "D:\encryption\\"
    
    # A encryption key backup file name
    ENCRYPTION_KEY_BACKUP_FILE_NAME = "backupfile.ekf"
    
    ###########################################################
    
  2. ヘッダの定義

    HTTPリクエストヘッダを定義します。REST APIの標準であるJSON形式のほかに、ファイルをダウンロードするAPIで使用するストリーム形式も扱うようヘッダ情報を定義しておきます。

    # ###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"}
    
    file_download_headers = {"content-type": "application/json",
                             "accept": "application/octet-stream"}
    
    REQUIRED_MAJOR_VERSION = 1
    REQUIRED_MINOR_VERSION = 12
    
    ###########################################################
    
  3. REST APIのバージョンの確認

    REST APIのバージョン情報を取得し、サポートしているバージョンであることを確認します。

    ヒント

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

    • REST APIサーバとストレージシステム間でSSL通信を利用する場合
    • ストレージシステムが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):
        version = api_version.split(".")
        major_version = int(version[0])
        minor_version = int(version[1])
        if not ((major_version == required_major_version and
                 minor_version >= required_minor_version) or
                major_version >= required_major_version + 1):
            sys.exit("This program requires API Version " +
                     str(required_major_version) + "." +
                     str(required_minor_version) +
                     "." + "x 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)
    
  4. 暗号化鍵バックアップファイルのダウンロード

    暗号化鍵バックアップファイルを指定したパスにダウンロードします。

        # step2 Get the encryption keys backup #
        print("Get the encryption keys backup")
        url = block_storage_api.encryption_key_file_backup()
        body = {
            "parameters": {
                "password": BACKUP_PASSWORD
            }
        }
        r = requests.post(url, headers=file_download_headers,
                          auth=USER_CREDENTIAL, data=json.dumps(body),
                          verify=False)
        if r.status_code != http.client.OK:
            raise requests.HTTPError(r)
        with open(ENCRYPTION_KEY_BACKUP_FILE_PATH + ENCRYPTION_KEY_BACKUP_FILE_NAME, 'wb') as saveFile:
            saveFile.write(r.content)
    
  5. エラーメッセージの出力

    サンプルコードでは、通信エラー、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()