VMware {code} Community
Gonadan
Contributor
Contributor
Jump to solution

How to get the RetrieveProperties examples from the Programming Guide working?

I am using the VI SDK 2.5.

When I use the SimpleClient example I can connect to the VC server and retrieve the information.

I used the code from the SimpleClient example to retrieve the properties and it works perfectly.

Then I started to read the chapter about the PropertyCollector in the Programming Guide, the first thing I noticed was that the example code givenin the guide will never work.

Unexistent constructors and methods are used, luckily there are other ways to accomplish the same code by following the example of SimpleClient.

I rewrote the big traversal method (page 75 and 76) so that it resembles the style of SimpleClient.

Everytime I try to retrieve the properties I get the InvalidArgument SoapException which, according to the API reference, means that the pfSpec is incorrect.

The pfSpec is delivered by the function from the Programming Guide I rewrote.

Can anybody tell me what I'm doing wrong? If I use the pfSpec from SimpleClient is works without any problems

Here the code I use:

PropertyFilterSpec pfSpec = getSpec(_rootFolder, pSpec);

ObjectContent[http://] oc = service.RetrieveProperties(propCol, new PropertyFilterSpec[|http://] oc = service.RetrieveProperties(propCol, new PropertyFilterSpec[] );

Variables like _rootFolder, _service and _propCol are the ones from SimpleClient, they should work as expected.

Below the rewritten function:

PropertyFilterSpec getSpec (ManagedObjectReference startObj, PropertySpec pSpec) {

// Traverses from a parent resource pool to a child resource pool.

TraversalSpec resourcePoolTraversalSpec = new TraversalSpec();

resourcePoolTraversalSpec.name = "resourcePoolTraversalSpec";

resourcePoolTraversalSpec.type = "ResourcePool";

resourcePoolTraversalSpec.path = "resourcePool";

resourcePoolTraversalSpec.skip = false;

resourcePoolTraversalSpec.selectSet = new SelectionSpec[] { new SelectionSpec(), new SelectionSpec() };

resourcePoolTraversalSpec.selectSet[0].name = "resourcePoolTraversalSpec";

resourcePoolTraversalSpec.selectSet[1].name = "resorcePoolVmTraversalSpec";

// Traverses from a resource pool to a virtual machine associated with the pool.

TraversalSpec resourcePoolVmTraversalSpec = new TraversalSpec();

resourcePoolVmTraversalSpec.name = "resourcePoolVmTraversalSpec";

resourcePoolVmTraversalSpec.type = "ResourcePool";

resourcePoolVmTraversalSpec.path = "vm";

resourcePoolVmTraversalSpec.skip = false;

// Traverses from a ComputeResource to a root ResourcePool.

TraversalSpec computeResourceRpTraversalSpec = new TraversalSpec();

computeResourceRpTraversalSpec.name = "computeResourceRpTraversalSpec";

computeResourceRpTraversalSpec.type = "ComputeResource";

computeResourceRpTraversalSpec.path = "resourcePool";

computeResourceRpTraversalSpec.skip = false;

computeResourceRpTraversalSpec.selectSet = new SelectionSpec[] { new SelectionSpec() };

computeResourceRpTraversalSpec.selectSet[0].name = "resourcePoolTraversalSpec";

// Traverses from a ComputeResource to a host.

TraversalSpec computeResourceHostTraversalSpec = new TraversalSpec();

computeResourceHostTraversalSpec.name = "computeResourceHostTraversalSpec";

computeResourceHostTraversalSpec.type = "ComputeResource";

computeResourceHostTraversalSpec.path = "host";

computeResourceHostTraversalSpec.skip = false;

// Traverses from a Datacenter to the root host Folder.

TraversalSpec datacenterHostTraversalSpec = new TraversalSpec();

datacenterHostTraversalSpec.name = "computeResourceHostTraversalSpec";

datacenterHostTraversalSpec.type = "Datacenter";

datacenterHostTraversalSpec.path = "hostFolder";

datacenterHostTraversalSpec.skip = false;

datacenterHostTraversalSpec.selectSet = new SelectionSpec[] { new SelectionSpec() };

datacenterHostTraversalSpec.selectSet[0].name = "folderTraversalSpec";

// Traverses from a Datacenter to the root virtual machine Folder.

TraversalSpec datacenterVmTraversalSpec = new TraversalSpec();

datacenterVmTraversalSpec.name = "datacenterVmTraversalSpec";

datacenterVmTraversalSpec.type = "Datacenter";

datacenterVmTraversalSpec.path = "vmFolder";

datacenterVmTraversalSpec.skip = false;

datacenterVmTraversalSpec.selectSet = new SelectionSpec[] { new SelectionSpec() };

datacenterVmTraversalSpec.selectSet[0].name = "folderTraversalSpec";

// Traverses from a host to a virtual machine.

TraversalSpec hostVmTraversalSpec = new TraversalSpec();

hostVmTraversalSpec.name = "hostVmTraversalSpec";

hostVmTraversalSpec.type = "HostSystem";

hostVmTraversalSpec.path = "vm";

hostVmTraversalSpec.skip = false;

hostVmTraversalSpec.selectSet = new SelectionSpec[] { new SelectionSpec() };

hostVmTraversalSpec.selectSet[0].name = "folderTraversalSpec";

// Traverses from a host to a virtual machine.

TraversalSpec folderTraversalSpec = new TraversalSpec();

folderTraversalSpec.name = "folderTraversalSpec";

folderTraversalSpec.type = "Folder";

folderTraversalSpec.path = "childEntity";

folderTraversalSpec.skip = false;

folderTraversalSpec.selectSet = new SelectionSpec[] {

new SelectionSpec(),

new SelectionSpec(),

new SelectionSpec(),

new SelectionSpec(),

new SelectionSpec(),

new SelectionSpec(),

new SelectionSpec() };

folderTraversalSpec.selectSet[0].name = "folderTraversalSpec";

folderTraversalSpec.selectSet[1].name = "datacenterHostTraversalSpec";

folderTraversalSpec.selectSet[2].name = "datacenterVmTraversalSpec";

folderTraversalSpec.selectSet[3].name = "computeResourceRpTraversalSpec";

folderTraversalSpec.selectSet[4].name = "computeResourceHostTraversalSpec";

folderTraversalSpec.selectSet[5].name = "hostVmTraversalSpec";

folderTraversalSpec.selectSet[6].name = "resourcePoolVmTraversalSpec";

ObjectSpec[] obSpec = new ObjectSpec[] { new ObjectSpec() };

obSpec[0].obj = startObj;

obSpec[0].skip = false;

obSpec[http://0].selectSet = new SelectionSpec[|http://0].selectSet = new SelectionSpec[] {

folderTraversalSpec,

datacenterVmTraversalSpec,

datacenterHostTraversalSpec,

computeResourceHostTraversalSpec,

computeResourceRpTraversalSpec,

resourcePoolTraversalSpec,

hostVmTraversalSpec,

resourcePoolVmTraversalSpec } ;

PropertyFilterSpec pFSpec = new PropertyFilterSpec();

pFSpec.propSet = new PropertySpec[] ;

pFSpec.objectSet = obSpec;

return pFSpec;

}

I hope anybody can give me a hint, this is taking days already.

Tags (6)
0 Kudos
1 Solution

Accepted Solutions
rkamal
VMware Employee
VMware Employee
Jump to solution

Try if this works.

Rajesh Kamal

/**

  • This method creates a SelectionSpec[] to traverses the entire

  • inventory tree starting at a Folder

  • @return The SelectionSpec[]

*/

public SelectionSpec[] buildFullTraversal()

{

// Recurse through all ResourcePools

TraversalSpec rpToVm = new TraversalSpec();

rpToVm.name = "rpToVm";

rpToVm.type = "ResourcePool";

rpToVm.path = "vm";

rpToVm.skip = false;

rpToVm.skipSpecified = true;

// Recurse through all ResourcePools

TraversalSpec rpToRp = new TraversalSpec();

rpToRp.name = "rpToRp";

rpToRp.type = "ResourcePool";

rpToRp.path = "resourcePool";

rpToRp.skip = false;

rpToRp.skipSpecified = true;

rpToRp.selectSet = new SelectionSpec[] { new SelectionSpec(), new SelectionSpec() };

rpToRp.selectSet[0].name = "rpToRp";

rpToRp.selectSet[1].name = "rpToVm";

// Traversal through ResourcePool branch

TraversalSpec crToRp = new TraversalSpec();

crToRp.name = "crToRp";

crToRp.type = "ComputeResource";

crToRp.path = "resourcePool";

crToRp.skip = false;

crToRp.skipSpecified = true;

crToRp.selectSet = new SelectionSpec[] { new SelectionSpec(), new SelectionSpec() };

crToRp.selectSet[0].name = "rpToRp";

crToRp.selectSet[1].name = "rpToVm";

// Traversal through host branch

TraversalSpec crToH = new TraversalSpec();

crToH.name = "crToH";

crToH.type = "ComputeResource";

crToH.path = "host";

crToH.skip = false;

crToH.skipSpecified = true;

// Traversal through hostFolder branch

TraversalSpec dcToHf = new TraversalSpec();

dcToHf.name = "dcToHf";

dcToHf.type = "Datacenter";

dcToHf.path = "hostFolder";

dcToHf.skip = false;

dcToHf.selectSet = new SelectionSpec[] { new SelectionSpec() };

dcToHf.selectSet[0].name = "visitFolders";

// Traversal through vmFolder branch

TraversalSpec dcToVmf = new TraversalSpec();

dcToVmf.name = "dcToVmf";

dcToVmf.type = "Datacenter";

dcToVmf.path = "vmFolder";

dcToVmf.skip = false;

dcToVmf.skipSpecified = true;

dcToVmf.selectSet = new SelectionSpec[] { new SelectionSpec() };

dcToVmf.selectSet[0].name = "visitFolders";

// Recurse through all Hosts

TraversalSpec HToVm = new TraversalSpec();

HToVm.name = "HToVm";

HToVm.type = "HostSystem";

HToVm.path = "vm";

HToVm.skip = false;

HToVm.skipSpecified = true;

HToVm.selectSet = new SelectionSpec[] { new SelectionSpec() };

HToVm.selectSet[0].name = "visitFolders";

// Recurse thriugh 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() };

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";

return new SelectionSpec[] { visitFolders, dcToVmf, dcToHf, crToH, crToRp, rpToRp, HToVm, rpToVm };

}

View solution in original post

0 Kudos
9 Replies
admin
Immortal
Immortal
Jump to solution

Please check the PropertySpec set in your PropertyFilterSpec, or for debugging share your pSpec also.

0 Kudos
Gonadan
Contributor
Contributor
Jump to solution

I assumed that the PropertySpec would be correct because it worked with the SimpleClient.

Eventually have tried several including this one which comes frome the SimpleClient example:

PropertySpec pSpec = new PropertySpec();

pSpec.all = false;

pSpec.allSpecified = true;

pSpec.pathSet = new string[] { "name" };

pSpec.type = "Folder";

The silly thing is that when I mess up the pSpec of the SimpleClient example the Exception contains childnodes stating the argument or option that is invalid.

When I use the example code from the Programming Guide it only states InvalidArgumentException without childnodes.

Is there any way to get more information about what went wrong?

0 Kudos
admin
Immortal
Immortal
Jump to solution

You have made a complete traversalSpec but while you are specifying the type of property you are interested in, you are specifying Folder

So what your Spec does it travers for Folder type entity in each TraversalSpec

Replace your PropertySpec type attribute from Folder to ManagedEntity

Use pSpec.type = "ManagedEntity"; instead of pSpec.type = "Folder";

0 Kudos
Gonadan
Contributor
Contributor
Jump to solution

I understand, but why would that give me an error?

According to the guide this TraversalSpec should be able to find any object from any starting object.

I have used the type ManagedEntity too, it did not work either, same counts for VirtualMachine or Datacenter.

They all work when using the SimpleClient code, but that one does not traverse much.

If only I could get a meaningful error from that API.

0 Kudos
admin
Immortal
Immortal
Jump to solution

You wrote above that "The silly thing is that when I mess up the pSpec of the SimpleClient example the Exception contains childnodes stating the argument or option that is invalid.

When I use the example code from the Programming Guide it only states InvalidArgumentException without childnodes." Can you specify what chilnodes were mentioned when you used the pSpec from the SimpleClient ?

0 Kudos
Gonadan
Contributor
Contributor
Jump to solution

The option that is not valid, as stated here: http://www.vmware.com/support/developer/vc-sdk/visdk25pubs/ReferenceGuide/vmodl.fault.InvalidArgumen...

That is why I wonder what is going wrong, when I use the guide's exampel I don't get any invalid options, just invalid argument.

Caught Exception :

Name : SoapException

Message : A specified parameter was not correct.

Trace : at System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, Boolean asyncCall)

at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)

at VimApi.VimService.RetrieveProperties(ManagedObjectReference _this, PropertyFilterSpec[] specSet)

at VISDK_Test.TestApp.btnVcConnect_Click(Object sender, EventArgs e) in
fs01\home\user\Visual Studio 2008\Projects\VISDK Test\VISDK Test\Form1.cs:line 348

Detail :

0 Kudos
rkamal
VMware Employee
VMware Employee
Jump to solution

Try if this works.

Rajesh Kamal

/**

  • This method creates a SelectionSpec[] to traverses the entire

  • inventory tree starting at a Folder

  • @return The SelectionSpec[]

*/

public SelectionSpec[] buildFullTraversal()

{

// Recurse through all ResourcePools

TraversalSpec rpToVm = new TraversalSpec();

rpToVm.name = "rpToVm";

rpToVm.type = "ResourcePool";

rpToVm.path = "vm";

rpToVm.skip = false;

rpToVm.skipSpecified = true;

// Recurse through all ResourcePools

TraversalSpec rpToRp = new TraversalSpec();

rpToRp.name = "rpToRp";

rpToRp.type = "ResourcePool";

rpToRp.path = "resourcePool";

rpToRp.skip = false;

rpToRp.skipSpecified = true;

rpToRp.selectSet = new SelectionSpec[] { new SelectionSpec(), new SelectionSpec() };

rpToRp.selectSet[0].name = "rpToRp";

rpToRp.selectSet[1].name = "rpToVm";

// Traversal through ResourcePool branch

TraversalSpec crToRp = new TraversalSpec();

crToRp.name = "crToRp";

crToRp.type = "ComputeResource";

crToRp.path = "resourcePool";

crToRp.skip = false;

crToRp.skipSpecified = true;

crToRp.selectSet = new SelectionSpec[] { new SelectionSpec(), new SelectionSpec() };

crToRp.selectSet[0].name = "rpToRp";

crToRp.selectSet[1].name = "rpToVm";

// Traversal through host branch

TraversalSpec crToH = new TraversalSpec();

crToH.name = "crToH";

crToH.type = "ComputeResource";

crToH.path = "host";

crToH.skip = false;

crToH.skipSpecified = true;

// Traversal through hostFolder branch

TraversalSpec dcToHf = new TraversalSpec();

dcToHf.name = "dcToHf";

dcToHf.type = "Datacenter";

dcToHf.path = "hostFolder";

dcToHf.skip = false;

dcToHf.selectSet = new SelectionSpec[] { new SelectionSpec() };

dcToHf.selectSet[0].name = "visitFolders";

// Traversal through vmFolder branch

TraversalSpec dcToVmf = new TraversalSpec();

dcToVmf.name = "dcToVmf";

dcToVmf.type = "Datacenter";

dcToVmf.path = "vmFolder";

dcToVmf.skip = false;

dcToVmf.skipSpecified = true;

dcToVmf.selectSet = new SelectionSpec[] { new SelectionSpec() };

dcToVmf.selectSet[0].name = "visitFolders";

// Recurse through all Hosts

TraversalSpec HToVm = new TraversalSpec();

HToVm.name = "HToVm";

HToVm.type = "HostSystem";

HToVm.path = "vm";

HToVm.skip = false;

HToVm.skipSpecified = true;

HToVm.selectSet = new SelectionSpec[] { new SelectionSpec() };

HToVm.selectSet[0].name = "visitFolders";

// Recurse thriugh 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() };

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";

return new SelectionSpec[] { visitFolders, dcToVmf, dcToHf, crToH, crToRp, rpToRp, HToVm, rpToVm };

}

0 Kudos
Gonadan
Contributor
Contributor
Jump to solution

That one indeed works, thanks for that, it looks alot like the solution I found recently.

There was some Java-traversal I ported and that one had the same error.

I played a bit with it and it eventually worked, don't know why though.

Do you have any idea what is wrong with the example?

0 Kudos
LarryZio
Contributor
Contributor
Jump to solution

I wouldn't put too much time into trying to figure out why any example code in Programming Guide 2.5 doesn't work--just stick to the sample code in the SDK and look at the Programming Guide 4.0. It seems like a lot of the examples in the Programming Guide 2.5 are, in a word, wrong (or misleading). Just a suggestion. Another suggestion is to step through the code in the AppUtil package, especially the ServiceUtil.java class, to learn about retrieving properties.

0 Kudos