vmwarevimsdk。列出所有虚拟机&x27;它正在工作,但列出所有数据源却不起作用。我错过什么了吗?

vmwarevimsdk。列出所有虚拟机&x27;它正在工作,但列出所有数据源却不起作用。我错过什么了吗?,vmware,Vmware,我的目标是获得特定数据中心中所有数据存储的列表。我能够列出所有主机和虚拟机,但不能列出数据存储,我不明白为什么(我还在学习API)。如有任何见解,将不胜感激 以下是获取所有虚拟机的代码(如预期的那样工作): public List getVMsInDatacenter(字符串数据中心,IEnumerable属性) { 列表VMs=null; this.joinConnection((appUtil)=> { var svcUtil=appUtil.getServiceUtil(); var dc

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

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

public List getVMsInDatacenter(字符串数据中心,IEnumerable属性)
{
列表VMs=null;
this.joinConnection((appUtil)=>
{
var svcUtil=appUtil.getServiceUtil();
var dcMoRef=svcUtil.getDecentMoref(null,“数据中心”,数据中心);
var typeinfo=buildTypeInfo(“VirtualMachine”,properties.ToList());
VMs=buildVMsFromObjectContent(svcUtil.GetContentsRecursively(null,dcMoRef,typeinfo,true));
});
返回虚拟机;
}
以下是数据存储的类似代码(它不能按预期工作):

public List getDataStoresInDatacenter(字符串数据中心,IEnumerable属性)
{
列表数据存储=null;
this.joinConnection((appUtil)=>
{
var svcUtil=appUtil.getServiceUtil();
var dcMoRef=svcUtil.getDecentMoref(null,“数据中心”,数据中心);
var typeinfo=buildTypeInfo(“Datastore”,properties.ToList());
DataStores=buildDataStoresFromObjectContent(svcUtil.GetContentsRecursively(null,dcMoRef,typeinfo,true));
});
返回数据存储;
}
appUtil是VIM SDK示例附带的appUtil类的实例化。它包含连接、查询等功能

joinConnection是一种连接方法,如果我们已经连接,则可以重新使用连接

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


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

找到了问题。GetContentsRecursive方法正在调用名为“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 };
现在,对GetContentsRecursive的调用还将包括属于VM的数据存储,因此问题中的方法将按预期工作

TraversalSpec vmToDs = new TraversalSpec();
  vmToDs.name = "vmToDs";
  vmToDs.type = "VirtualMachine";
  vmToDs.path = "datastore";
  HToVm.skip = false;
  HToVm.skipSpecified = true;
// 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 };