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