Compute Systems Manager REST API リファレンスガイド

[目次][前へ][次へ]


A.2 ブレードサーバの電源をONにするAPIの使用例

Compute Systems Manager が管理する特定のブレードサーバの電源をON にするタスクを登録し,タスクの終了を確認する処理のサンプルコードを示します。ユーザー認証はBasic 認証を使用しています。

処理の概要

  1. HTTP ヘッダーに認証情報や入出力データのエンコード形式などを設定します。
    このサンプルでは次のユーザーでログインします。
    ユーザーID:system
    パスワード:manager
    Basic認証のAuthorizationヘッダーは次のように設定します。
    Authorization: Basic <base64-id-password
    base64-id-password>には,ユーザーIDとパスワードを半角コロン(:)でつないだ文字列をbase64でエンコードした値を設定します。
    上記と異なるユーザーでログインする場合は, Authorizationヘッダーに設定するエンコード済みの文字列を,実際のユーザーIDとパスワードから生成した値に置き換えてください。
  2. localhostの管理サーバに対して,すべてのブレードサーバの情報を取得するAPIを実行します。
  3. 処理2で実行した API のレスポンスボディーを解析し,ブレードサーバの一覧から最初のブレードサーバのinstanceIdを取得します。
  4. 処理3で取得したブレードサーバの電源をON にするAPI を実行します。
  5. 処理4 で実行したAPI のレスポンスボディーを解析しtaskIDを取得します。
  6. 処理5で取得したtaskIDのタスクの情報を取得するAPIを,タスクが終了する(タスクの状態がCompletedCanceledFailedまたはSkippedになる)まで繰り返し実行します。
  7. 電源をONにするブレードサーバの情報,およびタスクの結果を画面に表示します。

サンプルコード

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>HCSM REST API Sample</title>
<script type="text/javascript" lang="javascript">
    function CreateHttpRequest() {
        try {
            return new XMLHttpRequest();
        } catch (e) {
        }
        try {
            return new ActiveXObject('MSXML2.XMLHTTP.6.0');
        } catch (e) {
        }
        try {
            return new ActiveXObject('MSXML2.XMLHTTP.3.0');
        } catch (e) {
        }
        try {
            return new ActiveXObject('MSXML2.XMLHTTP');
        } catch (e) {
        }

        return null;
    }

    /**
     * Set the request header to call HCSM API
     */
    function setHeader(req) {

        // In the Authorization header of the request, 
        // specify the word Basic, followed by a base64-encoded string 
        // that encodes the user name and password separated by a colon. 
        req.setRequestHeader("Authorization", "Basic c3lzdGVtOm1hbmFnZXI=");
        req.setRequestHeader('Accept', 'application/json');
        req.setRequestHeader('Content-Type', 'application/json; charset=UTF-8');
        return req;
    }

    /**
     * Send request (HTTP GET)
     */
    function sendGetRequest(url) {
        var req = new CreateHttpRequest();
        req.open("GET", url, false);
        setHeader(req);
        req.send(null);
        return req;
    }

    /**
     * Send request (HTTP PUT)
     */
    function sendPutRequest(url, body) {
        var req = new CreateHttpRequest();
        req.open("PUT", url, false);
        setHeader(req);
        req.send(body);
        return req;
    }

    /**
     * Obtain instance ID of the first blade from the list of blades
     */
    function getFirstBlade() {

        // Obtain information for all blade servers
        var uri = "http://localhost:22015/ComputeSystemsManager/v1/objects/Blades";
        var req = sendGetRequest(uri);

        var instanceId = null;
        if (req.status == 200) { // success
            var jsonObj = JSON.parse(req.responseText);
            var servers = jsonObj.Server;
            
            // Obtain instance ID of the first blade from the list of blades
            instanceId = servers[0].instanceId; 

            document.getElementById("targetblade").innerHTML = "instanceId="
                    + instanceId
                    + "<br>serverProductName="
                    + servers[0].serverProductName
                    + "<br>slotNumber="
                    + servers[0].slotNumber
                    + "<br>serverStatus="
                    + servers[0].serverStatus;
        } else if (req.status == 204) { // no content
            document.getElementById("targetblade").innerHTML = req.status
                    + " "
                    + req.statusText;
        } else { // failed
            document.getElementById("targetblade").innerHTML = req.status
                    + " "
                    + req.statusText
                    + "<br>"
                    + req.responseText;
        }
        return instanceId;
    }

    /**
     * Wait for task completed
     */
    function waitForTaskCompleted(taskid) {
        var status = "error"

        // Obtains information for the task with the specified taskID until a task is completed.
        var hoge = setInterval(function() {
            try {
                //  Obtains information for the task with the specified taskID
                var uri = "http://localhost:22015/ComputeSystemsManager/v1/objects/Tasks/"
                        + taskid;
                var req = sendGetRequest(uri);

                if (req.status == 200) { // success
                    var jsonObj = JSON.parse(req.responseText);
                    var taskExecutionInfoList = jsonObj.TaskExecutionInfo;
                    var taskExecutionInfo = taskExecutionInfoList[0];
                    var taskName = taskExecutionInfo.taskName;
                    status = taskExecutionInfo.status;
                    if (taskExecutionInfo.status == "Canceled"
                            || taskExecutionInfo.status == "Completed"
                            || taskExecutionInfo.status == "Failed"
                            || taskExecutionInfo.status == "Skipped") {

                        clearInterval(hoge);
                    }
                    document.getElementById("taskRes").innerHTML = "taskID="
                            + taskid
                            + ", taskName="
                            + taskName
                            + ", status="
                            + status;

                } else if (req.status == 204) { // no content
                    document.getElementById("taskRes").innerHTML = req.status
                            + " "
                            + req.statusText;
                    clearInterval(hoge);
                } else { // fail
                    document.getElementById("taskRes").innerHTML = req.status
                            + " "
                            + req.statusText
                            + "<br>"
                            + req.responseText;
                    clearInterval(hoge);
                }
            } catch (err) {
                clearInterval(hoge);
                alert(err.description);
            }
        }, 1000);
        return status;
    }

    /**
     * Set parameter for power on blade
     */
    function PowerOnParameter(schedule, time, elapseTime, verifyLpm, lpmElapseTime,
            emailNotificationType) {
        this.schedule = schedule;
        this.time = time;
        this.elapseTime = elapseTime;
        this.verifyLpm = verifyLpm;
        this.lpmElapseTime = lpmElapseTime;
        this.emailNotificationType = emailNotificationType;
    }

    /**
     * Obtains time one minute after the current time
     */
    function getTaskStartTime() {
        var current = new Date();
        formatedData = 'YYYY/MM/DD hh:mm:ss';
        formatedData = formatedData.replace(/YYYY/g, current.getFullYear());
        formatedData = formatedData.replace(/MM/g, ('0' + (current.getMonth() + 1)).slice(-2));
        formatedData = formatedData.replace(/DD/g, ('0' + current.getDate()).slice(-2));
        formatedData = formatedData.replace(/hh/g, ('0' + current.getHours()).slice(-2));
        formatedData = formatedData.replace(/mm/g, ('0' + (current.getMinutes() + 1)).slice(-2));
        formatedData = formatedData.replace(/ss/g, ('0' + current.getSeconds()).slice(-2));
        return formatedData;
    }

    /**
     * Create Http Body
     */
    function createBody() {
        // api parameter
        var schedule = "LATER"; // NOW or LATER
        var time = getTaskStartTime();
        var elapseTime = 0;
        var verifyLpm = "YES"; // YES or NO
        var lpmElapseTime = 0;
        var emailNotificationType = "NOT_SEND"; // NOT_SEND or SEND_ONLY_TASK_FAILED or SEND

        // object -> json
        var param = new PowerOnParameter(schedule, time, elapseTime, verifyLpm, lpmElapseTime,
                emailNotificationType);

        var body = JSON.stringify(param);
        document.getElementById("taskparam").innerHTML = body;
        return body;
    }

    /**
     *  Power on blade
     */
    function powerOnBlade() {
        try {
            // Obtain instance ID of the first blade from the list of blades
            var instanceId = getFirstBlade();
            if (instanceId == null) {
                return;
            }

            // create HTTP Body parameter
            var body = createBody();

            // call HCSM REST API(blade power on)
            var uri = "http://localhost:22015/ComputeSystemsManager/v1/objects/Blades/"
                    + instanceId
                    + "/actions/Poweron/invoke";
            var req = sendPutRequest(uri, body);

            if (req.status == 200) { // success
                var jsonObj = JSON.parse(req.responseText);
                var taskid = jsonObj.id;
                document.getElementById("taskreg").innerHTML = taskid;
                var status = waitForTaskCompleted(taskid);

            } else { // fail
                document.getElementById("taskreg").innerHTML = req.status
                        + " "
                        + req.statusText
                        + "<br>"
                        + req.responseText;
            }

        } catch (err) {
            alert(err.description);
        }
    }
</script>
</head>
<body>
    Obtain information for all blade servers and then power on the first blade of the list
    <br>
    <input type="button" value="Power On" onclick="powerOnBlade()">
    <hr>
    Target blade :
    <div id="targetblade"></div>
    <hr>
    Task parameter :
    <div id="taskparam"></div>
    <hr>
    Task registration :
    <div id="taskreg"></div>
    <hr>
    Task result :
    <div id="taskRes"></div>
</body>
</html>

サンプルコードの実行結果例

Target blade : 
instanceId=SGl0YWNoaV8wX0RNWV9CTF9TTl8wMTAxMDEwMV8wMA==
serverProductName=BladeSymphony 520AA1
slotNumber=0
serverStatus=Running
-------------------------------------------------------------------------
Task parameter : 
{"schedule":"LATER","time":"2016/03/01 16:49:17","elapseTime":0,"verifyLpm":"YES","lpmElapseTime":0,"emailNotificationType":"NOT_SEND"}
-------------------------------------------------------------------------
Task registration : 
400000000015882
-------------------------------------------------------------------------
Task result :
taskID=400000000015882, taskName=Power On-22, status=Completed

[目次] [前へ] [次へ]


All Rights Reserved. Copyright© 2016, Hitachi, Ltd.