This example shows a complete Java program that collects and prints selected properties from the inventory, using traversal specs with a property collector. The example lists networks, resource pool status, and virtual machines.
Inventory Traversal in Java
import com.vmware.vim25.*; import java.util.*; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLSession; import javax.xml.ws.BindingProvider; import javax.xml.ws.soap.SOAPFaultException; // PropertyCollector example // command line input: server name, user name, password public class PCollector_traversal { private static void collectProperties(VimPortType methods, ServiceContent sContent) throws Exception { // Get references to the ViewManager and PropertyCollector ManagedObjectReference viewMgrRef = sContent.getViewManager(); ManagedObjectReference propColl = sContent.getPropertyCollector(); // use a container view for virtual machines to define the traversal // - invoke the VimPortType method createContainerView (corresponds // to the ViewManager method) - pass the ViewManager MOR and // the other parameters required for the method invocation // (use a List<String> for the type parameter's string[]) List<String> vmList = new ArrayList<String>(); vmList.add("VirtualMachine"); ManagedObjectReference cViewRef = methods.createContainerView(viewMgrRef, sContent.getRootFolder(), vmList, true); // create an object spec to define the beginning of the traversal; // container view is the root object for this traversal ObjectSpec oSpec = new ObjectSpec(); oSpec.setObj(cViewRef); oSpec.setSkip(true); // create a traversal spec to select all objects in the view TraversalSpec tSpec = new TraversalSpec(); tSpec.setName("traverseEntities"); tSpec.setPath("view"); tSpec.setSkip(false); tSpec.setType("ContainerView"); // add the traversal spec to the object spec; // the accessor method (getSelectSet) returns a reference // to the mapped XML representation of the list; using this // reference to add the spec will update the selectSet list oSpec.getSelectSet().add(tSpec); // extend from virtual machine to network TraversalSpec tSpecVmN = new TraversalSpec(); tSpecVmN.setType("VirtualMachine"); tSpecVmN.setPath("network"); tSpecVmN.setSkip(false); // extend from virtual machine to resourcepool TraversalSpec tSpecVmRp = new TraversalSpec(); tSpecVmRp.setType("VirtualMachine"); tSpecVmRp.setPath("resourcePool"); tSpecVmRp.setSkip(false); // add the network and resource pool traversal specs // to the virtual machine traversal; // the accessor method (getSelectSet) returns a reference // to the mapped XML representation of the list; using this // reference to add the spec will update the selectSet list tSpec.getSelectSet().add(tSpecVmN); tSpec.getSelectSet().add(tSpecVmRp); // specify the properties for retrieval // (virtual machine name, network summary accessible, rp runtime props); // the accessor method (getPathSet) returns a reference to the mapped // XML representation of the list; using this reference to add the // property names will update the pathSet list PropertySpec pSpec = new PropertySpec(); pSpec.setType("VirtualMachine"); pSpec.getPathSet().add("name"); PropertySpec pSpecNs = new PropertySpec(); pSpecNs.setType("Network"); pSpecNs.getPathSet().add("summary.accessible"); PropertySpec pSpecRPr = new PropertySpec(); pSpecRPr.setType("ResourcePool"); pSpecRPr.getPathSet().add("runtime.cpu.maxUsage"); pSpecRPr.getPathSet().add("runtime.memory.maxUsage"); pSpecRPr.getPathSet().add("runtime.overallStatus"); // create a PropertyFilterSpec and add the object and // property specs to it; use the getter methods to reference // the mapped XML representation of the lists and add the specs // directly to the objectSet and propSet lists PropertyFilterSpec fSpec = new PropertyFilterSpec(); fSpec.getObjectSet().add(oSpec); fSpec.getPropSet().add(pSpec); fSpec.getPropSet().add(pSpecNs); fSpec.getPropSet().add(pSpecRPr); // Create a list for the filters and add the spec to it List<PropertyFilterSpec> fSpecList = new ArrayList<PropertyFilterSpec>(); fSpecList.add(fSpec); // get the data from the server RetrieveOptions ro = new RetrieveOptions(); RetrieveResult props = methods.retrievePropertiesEx(propColl,fSpecList,ro); // go through the returned list and print out the data if (props != null) { for (ObjectContent oc : props.getObjects()) { String value = null; String path = null; List<DynamicProperty> dps = oc.getPropSet(); if (dps != null) { for (DynamicProperty dp : dps) { path = dp.getName(); if (path.equals("name")) { value = (String) dp.getVal(); } else if (path.equals("summary.accessible")) { // summary.accessible is a boolean value = String.valueOf( dp.getVal() ); } else if (path.equals("runtime.cpu.maxUsage")) { // runtime.cpu.maxUsage is an xsd:long value = String.valueOf( dp.getVal() ); } else if (path.equals("runtime.memory.maxUsage")) { // runtime.memory.maxUsage is an xsd:long value = String.valueOf( dp.getVal() ); } else if (path.equals("runtime.overallStatus")) { // runtime.overallStatus is a ManagedEntityStatus enum value = String.valueOf( dp.getVal() ); } System.out.println(path + " = " + value); } } } } }//end collectProperties() // Authentication is handled by using a TrustManager and supplying // a host name verifier method. (The host name verifier is declared // in the main function.) // // For the purposes of this example, this TrustManager implementation // will accept all certificates. This is only appropriate for // a development environment. Production code should implement certificate support. private static class TrustAllTrustManager implements javax.net.ssl.TrustManager, javax.net.ssl.X509TrustManager { public java.security.cert.X509Certificate[] getAcceptedIssuers() { return null; } public boolean isServerTrusted(java.security.cert.X509Certificate[] certs) { return true; } public boolean isClientTrusted(java.security.cert.X509Certificate[] certs) { return true; } public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) throws java.security.cert.CertificateException { return; } public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) throws java.security.cert.CertificateException { return; } } public static void main(String [] args) throws Exception { // arglist variables String serverName = args[0]; String userName = args[1]; String password = args[2]; String url = "https://"+serverName+"/sdk/vimService"; // Variables of the following types for access to the API methods // and to the vSphere inventory. // -- ManagedObjectReference for the ServiceInstance on the Server // -- VimService for access to the vSphere Web service // -- VimPortType for access to methods // -- ServiceContent for access to managed object services ManagedObjectReference SVC_INST_REF = new ManagedObjectReference(); VimService vimService; VimPortType vimPort; ServiceContent serviceContent; // Declare a host name verifier that will automatically enable // the connection. The host name verifier is invoked during // the SSL handshake. HostnameVerifier hv = new HostnameVerifier() { public boolean verify(String urlHostName, SSLSession session) { return true; } }; // Create the trust manager. javax.net.ssl.TrustManager[] trustAllCerts = new javax.net.ssl.TrustManager[1]; javax.net.ssl.TrustManager tm = new TrustAllTrustManager(); trustAllCerts[0] = tm; // Create the SSL context javax.net.ssl.SSLContext sc = javax.net.ssl.SSLContext.getInstance("SSL"); // Create the session context javax.net.ssl.SSLSessionContext sslsc = sc.getServerSessionContext(); // Initialize the contexts; the session context takes the trust manager. sslsc.setSessionTimeout(0); sc.init(null, trustAllCerts, null); // Use the default socket factory to create the socket for the secure connection javax.net.ssl.HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); // Set the default host name verifier to enable the connection. HttpsURLConnection.setDefaultHostnameVerifier(hv); // Set up the manufactured managed object reference for the ServiceInstance SVC_INST_REF.setType("ServiceInstance"); SVC_INST_REF.setValue("ServiceInstance"); // Create a VimService object to obtain a VimPort binding provider. // The BindingProvider provides access to the protocol fields // in request/response messages. Retrieve the request context // which will be used for processing message requests. vimService = new VimService(); vimPort = vimService.getVimPort(); Map<String, Object> ctxt = ((BindingProvider) vimPort).getRequestContext(); // Store the Server URL in the request context and specify true // to maintain the connection between the client and server. // The client API will include the Server's HTTP cookie in its // requests to maintain the session. If you do not set this to true, // the Server will start a new session with each request. ctxt.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, url); ctxt.put(BindingProvider.SESSION_MAINTAIN_PROPERTY, true); // Retrieve the ServiceContent object and login serviceContent = vimPort.retrieveServiceContent(SVC_INST_REF); vimPort.login(serviceContent.getSessionManager(), userName, password, null); // retrieve data collectProperties( vimPort, serviceContent ); // close the connection vimPort.logout(serviceContent.getSessionManager()); } }