VMWare VIM SDK。列出所有VM的工作,但列出所有数据源都没有。我错过了什么吗?

时间:2012-07-16 14:56:58

标签: vmware

我的目标是获取特定数据中心中所有DataStore的列表。我能够列出所有主机和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是一种连接或重新使用连接的方法,如果我们已经连接的话。

如果对代码有任何其他疑问,请告诉我。

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

1 个答案:

答案 0 :(得分: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的数据存储,因此问题中的方法将按预期工作。

相关问题