VMWare VIM SDK.列出所有VM'正在工作,但列出所有数据源不起作用.我是不是错过了什么



我的目标是获得特定数据中心中所有DataStore的列表。我可以列出所有的主机和虚拟机,但不能列出数据存储,我不明白为什么(我仍在学习API)。任何见解都将不胜感激。

以下是获取所有虚拟机的代码(如预期那样工作):

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是一种连接方法,或者如果我们已经连接,则重新使用连接。

如果还有其他关于代码的问题,请告诉我。

此外,如果有更好的方法,我也想知道:)

发现问题。方法getContentsReturnly正在调用一个名为"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 };

现在,对getContentsReturnly的调用还将包括属于VM的数据存储,因此问题中的方法将按预期工作。