Loading...
2014年10月20日月曜日

Unable to serialize object of class in vCenter Orchestrator



家ラボの vCenter Orchestrator を 5.5.2.1 (ShellShock 対応) に上げたところ、action:waitAllWorkflowComplete でエラーが発生するようになったので、その対応方法を記します。 発生するエラーメッセージは以下の通り。
Workflow:Create lab / waitAllWorkflowComplete (item6) : ch.dunes.model.type.ConvertorException: Unable to serialize object of class : ch.dunes.vso.sdk.SDKTypeConvertor_server$1
この問題を起こした Action は、直前の Foreach ノードで複数実行したワークフローの完了を workflow token (wfTokens) の内容を確認しながら待機します。この wfToken は Foreach ノードで実行したワークフローのアウトプット オブジェクトも含まれているので、その辺で Serialize Error が出ているのかもしれません。以下が、問題を発生した実際のワークフローになります。



 バグ報告をしても修正を待っていられないので、回避策として action:waitAllWorkflowComplete を Scriptable Task に置き換えます。 まず、action:waitAllWorkflowComplete のスクリプトの内容を確認します。 



次に、問題を起こしたワークフローの action:waitAllWorkflowComplete を Scriptable Task に変更します。 



そしてその中身のスクリプトとパラメーターバインディングを行います。スクリプトは以下になります。



action:waitAllWorkflowComplete のスクリプトから不要な return 文を削除します。 パラメーターバインディングは以下になります。



ワークフローでは、ワークフロー トークンの配列を wfTokens としていますが、バインディングの際に tokens という名前に変更しています。 実際のスクリプトは、貼り付けるほどでもないですが、以下のようになります。

var result = new Array();
if (tokens != null && tokens.length > 0) {
 result[tokens.length-1] = null; // init the array with the good size but full of null
 
 var allFinished = false;
 while (! allFinished) {
  System.sleep(500);
 
  allFinished = true;
  
  for (var i in tokens) {
   if (tokens[i].state == "completed" || tokens[i].state == "failed" || tokens[i].state == "canceled") {
    allFinished &= true;
    if (result[i] == null) {
     var prop = tokens[i].getOutputParameters(); // Properties
     if (prop == null) prop = new Properties();
     prop.put("__state", tokens[i].state);
     if (tokens[i].state == "failed")
      prop.put("__exception", tokens[i].exception);
     result[i] = prop;
    }
   }
   else {
    allFinished = false;
   }
  }
 } 
}
2014年10月20日月曜日

0 コメント:

コメントを投稿

Things

 
TOP