Cisco UCS Director Cloupia スクリプト設定ガイド、リリース 5.0
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");

Cloupia スクリプト インタープリタの概要

Cloupia スクリプト インタープリタは、ライブラリと API が組み込まれた JavaScript インタープリタです。 Cloupia スクリプト インタープリタを使用して関数を実行したり、変数や関数を定義したりすることができます。

Cloupia スクリプト インタープリタには、次の関数が用意されています。

  • PrintObj:オブジェクトを取り、そのオブジェクト内のすべてのプロパティとメソッドを出力します。 出力結果には、オブジェクト内の変数の値およびオブジェクトを使って実行できる関数が示されます。 myFunction.toString() などの JavaScript 関数に対して toString() を呼び出すと、その関数のメソッド シグニチャが返されます。

    以下の例は、ReportContext オブジェクトのプロパティとメソッドを表示する方法、および setCloudName 関数のソース コードを戻す方法を示しています。
    session started
    > importPackage(com.cloupia.model.cIM);
    
    > var ctx = new ReportContext();
    
    > printObj(ctx);
    properties = 
    cloudName:null
    class:class com.cloupia.model.cIM.ReportContext
    filterId:null
    id:null
    targetCuicId:null
    type:0
    ids:[Ljava.lang.String;@4de27bc5
    methods = 
    setIds
    jdoReplaceField
    jdoReplaceFields
    toString
    getCloudName
    wait
    getClass
    jdoReplaceFlags
    hashCode
    jdoNewInstance
    jdoReplaceStateManager
    jdoIsDetached
    notify
    jdoGetVersion
    jdoProvideField
    jdoCopyFields
    jdoGetObjectId
    jdoGetPersistenceManager
    jdoCopyKeyFieldsToObjectId
    jdoGetTransactionalObjectId
    getType
    getFilterId
    setType
    jdoIsPersistent
    equals
    setCloudName
    jdoNewObjectIdInstance
    jdoIsDeleted
    getTargetCuicId
    setId
    setFilterId
    jdoProvideFields
    jdoMakeDirty
    jdoIsNew
    requiresCloudName
    getIds
    notifyAll
    jdoIsTransactional
    getId
    jdoReplaceDetachedState
    jdoIsDirty
    setTargetCuicId
    jdoCopyKeyFieldsFromObjectId
    
    > var func = ctx.setCloudName;
    
    > func
    void setCloudName(java.lang.String)
    
    > func.toString();
    function setCloudName() {/*
    void setCloudName(java.lang.String)
    */}
    
    
  • Upload:インタープリタにロードする JavaScript ファイルをアップロードします。 別のファイルにコードを保管し、upload コマンドを使ってそのファイルをアップロードすることができます。

JavaScript のテスト

[インタープリタの起動] を使用すると、JavaScript が Cisco UCS Director にロードされる前に、構文エラーの有無をテストできます。


    ステップ 1   メニュー バーで、[ポリシー] > [オーケストレーション] を選択します。
    ステップ 2   [カスタム ワークフロー タスク] タブをクリックします。
    ステップ 3   [インタープリタの起動] をクリックします。 [Cloupia スクリプト インタープリタ] ダイアログボックスが表示されます。
    ステップ 4   JavaScript コードを入力し、Enter キーを押します。 コードが実行され、結果が表示されます。 コードに構文エラーがある場合、そのエラーが表示されます。

    カスタム タスクの JavaScript のテスト

    カスタム タスクを選択すると表示される [コンテキストを使用してインタープリタを起動] アクションを使用すると、カスタム タスクの JavaScript を評価できます。 このアクションは、作成時にカスタム タスク実行用に定義されたすべてのグローバル変数を使用して、インタープリタを起動します。

    起動されたインタープリタは、カスタム タスクの開発時に設定された入力フィールドの値を取得し、そのタスクの入力オブジェクトのデータを設定します。 こうして、カスタム オブジェクトの実行に必要なすべての変数(入力、出力、ロガー、ctxt を含む)が使用可能になります。


      ステップ 1   メニュー バーで、[ポリシー] > [オーケストレーション] を選択します。
      ステップ 2   [カスタム ワークフロー タスク] タブをクリックします。
      ステップ 3   JavaScript のテストの対象となるカスタム タスクを選択します。
      ステップ 4   [コンテキストを使用してインタープリタを起動] をクリックします。 [インタープリタの起動] ダイアログボックスが表示されます。ここには、カスタム タスクの入力値を収集するための入力フィールドが示されます。 これらの入力フィールドは、カスタム タスクの作成時に定義された入力に基づいて表示されます。
      ステップ 5   [送信] をクリックします。 カスタム タスク用に定義された JavaScript コードが実行され、その結果が [Cloupia スクリプト インタープリタ] ダイアログボックスに表示されます。 コードに構文エラーがある場合、そのエラーが表示されます。