Is it possible to get VDC by name as well?
Sure, using Christophe's code:
var queryService = vcdHost.getQueryService();
var expression = new VclExpression(VclQueryOrgVdcField.NAME, vdcName, VclExpressionType.EQUALS);
var filter = new VclFilter(expression);
var params = new VclQueryParams();
params.setFilter(filter);
var ovdcs = new Array();
var resultSet = queryService.queryRecords(VclQueryRecordType.ORGVDC, params);
while (resultSet != null) {
var records = resultSet.getRecords(new VclQueryResultOrgVdcRecord());
System.log(records.length + " oVDC record found");
for each (var record in records) {
var ovdcRef = new VclReference();
ovdcRef.href = record.href;
ovdcRef.name = record.name;
ovdcRef.type = record.type;
ovdcs.push(vcdHost.getEntityByReference(VclEntityType.VDC, ovdcRef)); // for use with vCD 1.5.x//ovdcs.push(vcdHost.getEntityByReference(VclFinderType.VDC,ovdcRef)); // uncomment for use with vCD 5.x
}
resultSet = resultSet.getNextPage();
}
return ovdcs;
Inputs:
vdcName (string)
vcdHost (vCloud:Host)
Return: Array/vCloud:Vdc
With the vCD 5.1 plug-ib replace VclEntityType by VclFinderType.
The API shows that getEntityByReference return type is Object so how do you cast that object to vCloud:Vdc? We are using the same code but cannot use any of the objects on the array to instantiate a vApp.
It will return an object of the type you specified (at least if it can with the reference you provided).
Where can I find the package that supplies the method you mention?
var vAppTemplates = System.getModule("com.vmware.pso.library.vcloud.qs").getVAppTemplatesByName(vdc.getHost(), name);
specificaly getVAppTemplatesByName
Ceastman - this action is not mentioned in this thread - it seems you have replied to the wrong thread here. In any case, that action is likely in one of Christophe's packages found on the "Documents" tab of this community... I'm unsure which one at the moment since this message is not with the original reference.
For me, (and apparently for a poster in the original thread) querying on ORGVDC gets no results (no errors, just an empty ResultSet no matter what query is made).
You have to search for ADMINVDC instead. But strangely, you don't use the AdminQueryService for this, instead you use the regular query service.
Also, when I do a similar query for edge gateways in our production environment, the getEntityByReference takes ~10 seconds per entry, so actually making a list of all 60 edge gateways takes 566 seconds!
So, three points/questions:
1) why can't we search for ORGVDC?
2) How do I know which query service to use for which object type? I would have thought that searching for an AdminVdc would use the AdminQueryService.
3) Beware doing getEntityByReference inside a loop when stepping through a query resultset. If your query returns more than one result, you may take a huge performance hit.
and bonus:
4) Wow. getEntityByReference is a dog. I can understand that there might be some overhead to retrieve the details for the entity and update VCO's cache, but it seems that this is very non-linear. In my Development environment where we have 9 Gateways, doing getEntityByReference takes ~2 seconds, so retrieving all 9 takes 21 seconds. In production, at two seconds apiece this would take ~120 seconds, which is a long time, but nowhere near 566 seconds.
Naturally it should take longer to run through a longer list, but each lookup is also taking longer, so the result is exponential. Why shouldn't it take constant-time to retrieve update a single entry in the cache?