0

我的目标是获取特定数据中心中所有数据存储的列表。我能够列出所有主机和虚拟机,但不能列出数据存储,我不明白为什么(我仍在学习 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;
}

这是 Datastore 的类似代码(不能按预期工作):

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 回答