Compute Systems Manager が管理する特定のブレードサーバの電源をON にするタスクを登録し,タスクの終了を確認する処理のサンプルコードを示します。ユーザー認証はBasic 認証を使用しています。
処理の概要
system
manager
Authorization
ヘッダーは次のように設定します。Authorization: Basic <base64-id-password>
<base64-id-password>には,ユーザーIDとパスワードを半角コロン(:)でつないだ文字列をbase64でエンコードした値を設定します。Authorization
ヘッダーに設定するエンコード済みの文字列を,実際のユーザーIDとパスワードから生成した値に置き換えてください。instanceId
を取得します。taskID
を取得します。taskID
のタスクの情報を取得するAPIを,タスクが終了する(タスクの状態がCompleted
,Canceled
,Failed
またはSkipped
になる)まで繰り返し実行します。サンプルコード
<!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