Cisco UCS Director Cloupia スクリプト設定ガイド リリース 4.1
Cloupia スクリプトでの作業
Cloupia スクリプトでの作業

Cloupia スクリプトでの作業

この章は、次の内容で構成されています。

Cloupia スクリプトにおけるロギング

Cloupia スクリプトには、サービス リクエスト ログへのメッセージ記録に使用できる API が用意されています。

ログ ウィンドウには、次のようなログの詳細が表示されます。

Service Request ID: 789


May 17, 2013 11:48:15 UTC Request submitted
May 17, 2013 11:48:15 UTC Executing workflow item number 1
May 17, 2013 11:48:15 Completed workflow item number 1, with status Completed
May 17, 2013 11:48:21 UTC Executing workflow item number 2
May 17, 2013 11:48:21 UTC Trigger context executeWorkFlowStep called
May 17, 2013 11:48:21 UTC Executing custom action Initiator Groups (Delete VMAX Initiator Group)
May 17, 2013 11:48:21 UTC Executing custom action Initiator Groups (Delete VMAX Initiator Group)
May 17, 2013 11:49:18 UTC Initiator group deleted successfully.
May 17, 2013 11:49:18 UTC Task #1 (Initiator Groups (Delete VMAX Initiator Group)) completed successfully in 56 seconds
May 17, 2013 11:49:18 UTC Input/Ouput values for Task #1 (Initiator Groups (Delete VMAX Initiator Group));
May 17, 2103 11:49:18 UTC [Local Input: Select VMAX Initiator Group = Default
Datacenter@Vmax20K@192604812@CUIC_DV3] 
May 17, 2103 11:49:18 UTC [Local Input: Do you want to delete selected initiator group name? = null]
May 17, 2013 11:49:18 UTC Completed workflow item number 2, with status Completed
May 17, 2013 11:49:22 UTC Executing workflow item number 3
May 17, 2013 11:49:22 UTC Completed workflow item number 3, with status completed

Logger オブジェクトには次のロギング用メソッドが用意されています。

  • addDebug:デバッグ メッセージを灰色で表示します。
  • addInfo:通常のメッセージを黒色で表示します。
  • addWarning:警告メッセージをオレンジ色で表示します。
  • addError:エラー メッセージを赤色で表示します。

これらメソッドの使用例を次に説明します。

logger.addDebug(“About to process the user request”);
 
logger.addInfo(“User “+ctxt.getUserId()+” has requested to provision this”);
 
logger.addWarning(“Resource has reached maximum capacity.”);
 
logger.addError(“Failed to provision the resource”);

ワークフロー送信者情報の決定

それぞれのワークフロー コンテキストにはワークフロー送信者のユーザ ID があります。 変数と同様に、この値をスクリプト API 経由で使用できます。 Cloupia スクリプトを使用して姓、名、電子メール アドレスなどのユーザの詳細にアクセスできます。

スクリプトで取得されて他のタスクで使用される情報のキャプチャおよび保存用に、例では次のワークフロー レベル変数を使用します。

  • SUBMITTER_EMAIL
  • SUBMITTER_FIRSTNAME
  • SUBMITTER_LASTNAME
  • SUBMITTER_GROUPNAME
var userId = ctxt.getUserId();
// Get the current workflow submitter’s profile
var userProfile = ctxt.getAPI().userAPIGetMyLoginProfile();
var firstName = userProfile.getFirstName();
var lastName = userProfile.getLastName();
var groupName = userProfile.getGroupName();
var groupId = userProfile.getGroupId();
var role = userProfile.getRole();
var email = userProfile.getEmail();
// Add some debug statements into SR log
logger.addDebug(“UserId=“+userId+”, Name=“+
            firstName + “ “+ lastName +
            “, Email=“+email+”, group=“+groupName+”, “+
            “Role=“+role);
// Save into workflow variables as needed
ctxt.updateInput("SUBMITTER_EMAIL", email);
ctxt.updateInput("SUBMITTER_FIRSTNAME", firstName);
ctxt.updateInput("SUBMITTER_LASTNAME", lastName);
ctxt.updateInput("SUBMITTER_GROUPNAME", groupName);

カタログ プロビジョニングの繰り返し

カタログのプロビジョニングを何回も繰り返す場合は、次のワークフロー スクリプトを使用して子ワークフローを作成し、それらの完了を待つことによりカタログのプロビジョニングを何度も実行できます。

ワークフロー スクリプトは次のワークフロー レベル変数を使用します。

  • Catalog
  • vDC
  • Provision Quantity
// Full Script
importPackage(java.util);
importPackage(java.lang);
importPackage(com.cloupia.model.cIM);
importPackage(com.cloupia.service.cIM.inframgr);
 
// Assume the names  of the Input Variables as below
var CATALOG_ID = "Catalog";
var VDC_ID  = "vDC";
var PROVISION_QTY  = "Provision Quantity";
 
// Set the duration of the VMs as -1 (or number of hours)
var duration = -1;
 
// set begin time to now
var beginTime = -1;
 
var catId = ctxt.getInput(CATALOG_ID);
var vdcId = ctxt.getInput(VDC_ID);
var quantity = ctxt.getInput(PROVISION_QTY);
var delaySecondsBetweenInvocation = 30;
 
var vdc = VDCUtil.getVDC(vdcId);
var vdcName = vdc.getVdcName();
var cat = VDCUtil.getVDCCatalogItem(catId);
var catName = cat.getCatalogItemName();
 
logger.addInfo("CatalogName: " + catName + " vdcName: " + vdcName);
logger.addInfo("Provision Qty ="+quantity);
 
var qty = 1;
 
try {
    qty = Integer.valueOf(quantity);
} catch(e) {
    logger.addWarning("Invalid quantity specified:"+quantity+ " provisioning one VM");
}
 
var childSrIdArray = [];
var comment = "";
for (var ctr = 0; ctr < qty; ctr = ctr + 1)
{
                logger.addInfo("Provision VM ="+ (ctr+1) + " of "+qty);
                var srId = ctxt.getAPI().userAPISubmitServiceRequest(catName, vdcName , duration, beginTime, 1, comment);
                childSrIdArray[ctr] = srId;
 
              // Allow some delay between provisioning
                sleep();
}
 
function sleep()
{
              var milliseconds = delaySecondsBetweenInvocation * 1000;
              Thread.sleep(milliseconds);
}
 
for (var i=0; i<childSrIdArray.length; i++)
{
                var childSrId = childSrIdArray[i];
                var status = ctxt.waitForCompletion(childSrId, 1800000);              
                if (status == 0)
                {
                                logger.addInfo("Provisioned SR ID  ="+ childSrId+ " successfully.");
                } else {
                                logger.addError("SR ID  ="+ childSrId+ " failed");
                }
}

仮想マシン ディスクのサイズ変更

Cloupia スクリプトを使用して、仮想マシン(VM)のプロビジョニング後に VM ディスクのサイズ変更ができます。

次のスクリプトでは、サイズ変更が必要な VM を示す VMID という入力変数を使用します。

importPackage(java.lang);
importPackage(java.util);
importPackage(com.cloupia.model.cIM);
importPackage(com.cloupia.service.cIM.inframgr);
 
function resizeVmDisk(vmidstr, diskName, sizeInGB)
{
     var vmid = Integer.parseInt(vmidstr);
 
     // create the Context to
      var vmcontext = util.createContext("vm", null, vmidstr);
 
      // obtain VM details
      var vminfo = ctxt.getAPI().getVMwareVMInfo(vmid);
      var vmname = vminfo.getName();
 
      var nameparam = new ActionParam("vmName", vmname);
      var sizeparam = new ActionParam("vmSize", sizeInGB);
      var diskparam = new ActionParam("vmDiskLabel", diskName);
 
      var paramarr = [ nameparam, sizeparam, diskparam ];
      logger.addInfo("About to resize VM "+vmidstr+" name="+vmname);
       var status = ctxt.getAPI().performAction(vmcontext,"diskResize","Resizing VM for testing the script",ctxt.getUserId(),paramarr);
 
       logger.addInfo("status  = "+status);
}
 
var vmidstr1 = ctxt.getInput("VMID");
resizeVmDisk(vmidstr1, "Hard Disk 1", "10");