0

私の目標は、特定のデータセンター内のすべてのデータストアの一覧を取得することです。すべてのホストと VM を一覧表示できますが、データストアは一覧表示できません。その理由がわかりません (API についてはまだ学習中です)。任意の洞察をいただければ幸いです。

すべての VM を取得するためのコードは次のとおりです (これは期待どおりに機能します)。

public List<VM> getVMsInDatacenter(String datacenter, IEnumerable<String> properties)
{
  List<VM> VMs = null;

  this.joinConnection((appUtil) =>
  {
    var svcUtil = appUtil.getServiceUtil();
    var dcMoRef = svcUtil.GetDecendentMoRef(null, "Datacenter", datacenter);

    var typeinfo = buildTypeInfo("VirtualMachine", properties.ToList());

    VMs = buildVMsFromObjectContent(svcUtil.GetContentsRecursively(null, dcMoRef, typeinfo, true));
  });
  return VMs;
}

データストアの類似コードを次に示します (期待どおりに動作しません)。

public List<DataStore> getDataStoresInDatacenter(String datacenter, IEnumerable<String> properties)
{
  List<DataStore> DataStores = null;

  this.joinConnection((appUtil) =>
  {
    var svcUtil = appUtil.getServiceUtil();
    var dcMoRef = svcUtil.GetDecendentMoRef(null, "Datacenter", datacenter);

    var typeinfo = buildTypeInfo("Datastore", properties.ToList());

    DataStores = buildDataStoresFromObjectContent(svcUtil.GetContentsRecursively(null, dcMoRef, typeinfo, true));
  });
  return DataStores;
}

appUtil は、VIM SDK サンプルに付属する AppUtil クラスのインスタンス化です。接続、クエリなどの機能が含まれています。

joinConnection は、接続するためのメソッド、または既に接続している場合は接続を再利用するためのメソッドです。

コードについて他に質問がある場合は、お知らせください。

また、もっと良い方法があれば、それも知りたいです:)

4

1 に答える 1

0

問題が見つかりました。メソッド getContentsRecursively は、トラバーサル/選択仕様を構築する「buildFullTraversal」というメソッドを呼び出しています。このメソッドは、データストアのトラバーサルを追加していませんでした。私はそのようなものを追加しました:

TraversalSpec vmToDs = new TraversalSpec();
  vmToDs.name = "vmToDs";
  vmToDs.type = "VirtualMachine";
  vmToDs.path = "datastore";
  HToVm.skip = false;
  HToVm.skipSpecified = true;

次に、visitFolders トラバーサルを次のように変更しました。

// Recurse through the folders
  TraversalSpec visitFolders = new TraversalSpec();
  visitFolders.name = "visitFolders";
  visitFolders.type = "Folder";
  visitFolders.path = "childEntity";
  visitFolders.skip = false;
  visitFolders.skipSpecified = true;
  visitFolders.selectSet = new SelectionSpec[] { new SelectionSpec(), new SelectionSpec(), new SelectionSpec(), new SelectionSpec(), new SelectionSpec(), new SelectionSpec(), new SelectionSpec(), new SelectionSpec() };
  visitFolders.selectSet[0].name = "visitFolders";
  visitFolders.selectSet[1].name = "dcToHf";
  visitFolders.selectSet[2].name = "dcToVmf";
  visitFolders.selectSet[3].name = "crToH";
  visitFolders.selectSet[4].name = "crToRp";
  visitFolders.selectSet[5].name = "HToVm";
  visitFolders.selectSet[6].name = "rpToVm";
  visitFolders.selectSet[7].name = "vmToDs";
  return new SelectionSpec[] { visitFolders, dcToVmf, dcToHf, crToH, crToRp, rpToRp, HToVm, rpToVm, vmToDs };

現在、getContentsRecursively の呼び出しには VM に属するデータストアも含まれるため、問題のメソッドは期待どおりに機能します。

于 2012-07-16T19:13:53.557 に答える