// Copyright 2012 Citrix Systems, Inc. Licensed under the // Apache License, Version 2.0 (the "License"); you may not use this // file except in compliance with the License. Citrix Systems, Inc. // reserves all rights not expressly granted by the License. // You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // // Automatically generated by addcopyright.py at 04/03/2012 package com.cloud.vmware; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.net.URL; import java.rmi.RemoteException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLSession; import org.apache.log4j.xml.DOMConfigurator; import com.cloud.utils.PropertiesUtil; import com.vmware.apputils.version.ExtendedAppUtil; import com.vmware.vim25.HostIpConfig; import com.vmware.vim25.HostVirtualNicSpec; import com.vmware.vim25.HostConfigManager; import com.vmware.vim25.HostPortGroupSpec; import com.vmware.vim25.HttpNfcLeaseDeviceUrl; import com.vmware.vim25.HttpNfcLeaseInfo; import com.vmware.vim25.HttpNfcLeaseState; import com.vmware.vim25.OvfCreateImportSpecParams; import com.vmware.vim25.OvfCreateImportSpecResult; import com.vmware.vim25.OvfFileItem; import com.vmware.vim25.OvfNetworkMapping; import com.vmware.vim25.VirtualMachineConfigSpec; import com.vmware.vim25.VirtualDeviceConfigSpecOperation; import com.vmware.vim25.VirtualEthernetCard; import com.vmware.vim25.VirtualEthernetCardNetworkBackingInfo; import com.vmware.vim25.VirtualNicManagerNetConfig; import com.vmware.vim25.VirtualPCNet32; import com.vmware.vim25.VirtualDeviceConfigSpec; import com.vmware.vim25.VirtualMachineCloneSpec; import com.vmware.vim25.VirtualMachineRelocateSpec; import com.vmware.vim25.ArrayOfManagedObjectReference; import com.vmware.vim25.DatastoreInfo; import com.vmware.vim25.DynamicProperty; import com.vmware.vim25.InvalidProperty; import com.vmware.vim25.ManagedObjectReference; import com.vmware.vim25.ObjectContent; import com.vmware.vim25.ObjectSpec; import com.vmware.vim25.PropertyFilterSpec; import com.vmware.vim25.PropertySpec; import com.vmware.vim25.RuntimeFault; import com.vmware.vim25.SelectionSpec; import com.vmware.vim25.TraversalSpec; public class TestVMWare { private static ExtendedAppUtil cb; static { try { javax.net.ssl.TrustManager[] trustAllCerts = new javax.net.ssl.TrustManager[1]; javax.net.ssl.TrustManager tm = new TrustAllManager(); trustAllCerts[0] = tm; javax.net.ssl.SSLContext sc = javax.net.ssl.SSLContext.getInstance("SSL"); sc.init(null, trustAllCerts, null); javax.net.ssl.HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); } catch (Exception e) { } } private static void setupLog4j() { File file = PropertiesUtil.findConfigFile("log4j-cloud.xml"); if(file != null) { System.out.println("Log4j configuration from : " + file.getAbsolutePath()); DOMConfigurator.configureAndWatch(file.getAbsolutePath(), 10000); } else { System.out.println("Configure log4j with default properties"); } } private void getAndPrintInventoryContents() throws Exception { TraversalSpec resourcePoolTraversalSpec = new TraversalSpec(); resourcePoolTraversalSpec.setName("resourcePoolTraversalSpec"); resourcePoolTraversalSpec.setType("ResourcePool"); resourcePoolTraversalSpec.setPath("resourcePool"); resourcePoolTraversalSpec.setSkip(new Boolean(false)); resourcePoolTraversalSpec.setSelectSet( new SelectionSpec [] { new SelectionSpec(null,null,"resourcePoolTraversalSpec") }); TraversalSpec computeResourceRpTraversalSpec = new TraversalSpec(); computeResourceRpTraversalSpec.setName("computeResourceRpTraversalSpec"); computeResourceRpTraversalSpec.setType("ComputeResource"); computeResourceRpTraversalSpec.setPath("resourcePool"); computeResourceRpTraversalSpec.setSkip(new Boolean(false)); computeResourceRpTraversalSpec.setSelectSet( new SelectionSpec [] { new SelectionSpec(null,null,"resourcePoolTraversalSpec") }); TraversalSpec computeResourceHostTraversalSpec = new TraversalSpec(); computeResourceHostTraversalSpec.setName("computeResourceHostTraversalSpec"); computeResourceHostTraversalSpec.setType("ComputeResource"); computeResourceHostTraversalSpec.setPath("host"); computeResourceHostTraversalSpec.setSkip(new Boolean(false)); TraversalSpec datacenterHostTraversalSpec = new TraversalSpec(); datacenterHostTraversalSpec.setName("datacenterHostTraversalSpec"); datacenterHostTraversalSpec.setType("Datacenter"); datacenterHostTraversalSpec.setPath("hostFolder"); datacenterHostTraversalSpec.setSkip(new Boolean(false)); datacenterHostTraversalSpec.setSelectSet( new SelectionSpec [] { new SelectionSpec(null,null,"folderTraversalSpec") }); TraversalSpec datacenterVmTraversalSpec = new TraversalSpec(); datacenterVmTraversalSpec.setName("datacenterVmTraversalSpec"); datacenterVmTraversalSpec.setType("Datacenter"); datacenterVmTraversalSpec.setPath("vmFolder"); datacenterVmTraversalSpec.setSkip(new Boolean(false)); datacenterVmTraversalSpec.setSelectSet( new SelectionSpec [] { new SelectionSpec(null,null,"folderTraversalSpec") }); TraversalSpec folderTraversalSpec = new TraversalSpec(); folderTraversalSpec.setName("folderTraversalSpec"); folderTraversalSpec.setType("Folder"); folderTraversalSpec.setPath("childEntity"); folderTraversalSpec.setSkip(new Boolean(false)); folderTraversalSpec.setSelectSet( new SelectionSpec [] { new SelectionSpec(null,null,"folderTraversalSpec"), datacenterHostTraversalSpec, datacenterVmTraversalSpec, computeResourceRpTraversalSpec, computeResourceHostTraversalSpec, resourcePoolTraversalSpec }); PropertySpec[] propspecary = new PropertySpec[] { new PropertySpec() }; propspecary[0].setAll(new Boolean(false)); propspecary[0].setPathSet(new String[] { "name" }); propspecary[0].setType("ManagedEntity"); PropertyFilterSpec spec = new PropertyFilterSpec(); spec.setPropSet(propspecary); spec.setObjectSet(new ObjectSpec[] { new ObjectSpec() }); spec.getObjectSet(0).setObj(cb.getServiceConnection3().getRootFolder()); spec.getObjectSet(0).setSkip(new Boolean(false)); spec.getObjectSet(0).setSelectSet( new SelectionSpec[] { folderTraversalSpec }); // Recursively get all ManagedEntity ManagedObjectReferences // and the "name" property for all ManagedEntities retrieved ObjectContent[] ocary = cb.getServiceConnection3().getService().retrieveProperties( cb.getServiceConnection3().getServiceContent().getPropertyCollector(), new PropertyFilterSpec[] { spec } ); // If we get contents back. print them out. if (ocary != null) { ObjectContent oc = null; ManagedObjectReference mor = null; DynamicProperty[] pcary = null; DynamicProperty pc = null; for (int oci = 0; oci < ocary.length; oci++) { oc = ocary[oci]; mor = oc.getObj(); pcary = oc.getPropSet(); System.out.println("Object Type : " + mor.getType()); System.out.println("Reference Value : " + mor.get_value()); if (pcary != null) { for (int pci = 0; pci < pcary.length; pci++) { pc = pcary[pci]; System.out.println(" Property Name : " + pc.getName()); if (pc != null) { if (!pc.getVal().getClass().isArray()) { System.out.println(" Property Value : " + pc.getVal()); } else { Object[] ipcary = (Object[])pc.getVal(); System.out.println("Val : " + pc.getVal()); for (int ii = 0; ii < ipcary.length; ii++) { Object oval = ipcary[ii]; if (oval.getClass().getName().indexOf("ManagedObjectReference") >= 0) { ManagedObjectReference imor = (ManagedObjectReference)oval; System.out.println("Inner Object Type : " + imor.getType()); System.out.println("Inner Reference Value : " + imor.get_value()); } else { System.out.println("Inner Property Value : " + oval); } } } } } } } } else { System.out.println("No Managed Entities retrieved!"); } } private void listDataCenters() { try { ManagedObjectReference[] morDatacenters = getDataCenterMors(); if(morDatacenters != null) { for(ManagedObjectReference mor : morDatacenters) { System.out.println("Datacenter : " + mor.get_value()); Map<String, Object> properites = new HashMap<String, Object>(); properites.put("name", null); properites.put("vmFolder", null); properites.put("hostFolder", null); getProperites(mor, properites); for(Map.Entry<String, Object> entry : properites.entrySet()) { if(entry.getValue() instanceof ManagedObjectReference) { ManagedObjectReference morProp = (ManagedObjectReference)entry.getValue(); System.out.println("\t" + entry.getKey() + ":(" + morProp.getType() + ", " + morProp.get_value() + ")"); } else { System.out.println("\t" + entry.getKey() + ":" + entry.getValue()); } } System.out.println("Datacenter clusters"); ManagedObjectReference[] clusters = getDataCenterClusterMors(mor); if(clusters != null) { for(ManagedObjectReference morCluster : clusters) { Object[] props = this.getProperties(morCluster, new String[] {"name"}); System.out.println("cluster : " + props[0]); System.out.println("cluster hosts"); ManagedObjectReference[] hosts = getClusterHostMors(morCluster); if(hosts != null) { for(ManagedObjectReference morHost : hosts) { Object[] props2 = this.getProperties(morHost, new String[] {"name"}); System.out.println("host : " + props2[0]); } } } } System.out.println("Datacenter standalone hosts"); ManagedObjectReference[] hosts = getDataCenterStandaloneHostMors(mor); if(hosts != null) { for(ManagedObjectReference morHost : hosts) { Object[] props = this.getProperties(morHost, new String[] {"name"}); System.out.println("host : " + props[0]); } } System.out.println("Datacenter datastores"); ManagedObjectReference[] stores = getDataCenterDatastoreMors(mor); if(stores != null) { for(ManagedObjectReference morStore : stores) { // data store name property does not work for some reason Object[] props = getProperties(morStore, new String[] {"info" }); System.out.println(morStore.getType() + ": " + ((DatastoreInfo)props[0]).getName()); } } System.out.println("Datacenter VMs"); ManagedObjectReference[] vms = getDataCenterVMMors(mor); if(stores != null) { for(ManagedObjectReference morVm : vms) { Object[] props = this.getProperties(morVm, new String[] {"name"}); System.out.println("VM name: " + props[0] + ", ref val: " + morVm.get_value()); } } } } } catch(RuntimeFault e) { e.printStackTrace(); } catch(RemoteException e) { e.printStackTrace(); } } private void listInventoryFolders() { TraversalSpec folderTraversalSpec = new TraversalSpec(); folderTraversalSpec.setName("folderTraversalSpec"); folderTraversalSpec.setType("Folder"); folderTraversalSpec.setPath("childEntity"); folderTraversalSpec.setSkip(new Boolean(false)); folderTraversalSpec.setSelectSet( new SelectionSpec [] { new SelectionSpec(null, null, "folderTraversalSpec")} ); PropertySpec[] propSpecs = new PropertySpec[] { new PropertySpec() }; propSpecs[0].setAll(new Boolean(false)); propSpecs[0].setPathSet(new String[] { "name" }); propSpecs[0].setType("ManagedEntity"); PropertyFilterSpec filterSpec = new PropertyFilterSpec(); filterSpec.setPropSet(propSpecs); filterSpec.setObjectSet(new ObjectSpec[] { new ObjectSpec() }); filterSpec.getObjectSet(0).setObj(cb.getServiceConnection3().getRootFolder()); filterSpec.getObjectSet(0).setSkip(new Boolean(false)); filterSpec.getObjectSet(0).setSelectSet( new SelectionSpec[] { folderTraversalSpec } ); try { ObjectContent[] objContent = cb.getServiceConnection3().getService().retrieveProperties( cb.getServiceConnection3().getServiceContent().getPropertyCollector(), new PropertyFilterSpec[] { filterSpec } ); printContent(objContent); } catch (InvalidProperty e) { e.printStackTrace(); } catch (RuntimeFault e) { e.printStackTrace(); } catch (RemoteException e) { e.printStackTrace(); } } private TraversalSpec getFolderRecursiveTraversalSpec() { SelectionSpec recurseFolders = new SelectionSpec(); recurseFolders.setName("folder2childEntity"); TraversalSpec folder2childEntity = new TraversalSpec(); folder2childEntity.setType("Folder"); folder2childEntity.setPath("childEntity"); folder2childEntity.setName(recurseFolders.getName()); folder2childEntity.setSelectSet(new SelectionSpec[] { recurseFolders }); return folder2childEntity; } private ManagedObjectReference[] getDataCenterMors() throws RuntimeFault, RemoteException { PropertySpec pSpec = new PropertySpec(); pSpec.setType("Datacenter"); pSpec.setPathSet(new String[] { "name"} ); ObjectSpec oSpec = new ObjectSpec(); oSpec.setObj(cb.getServiceConnection3().getRootFolder()); oSpec.setSkip(Boolean.TRUE); oSpec.setSelectSet(new SelectionSpec[] { getFolderRecursiveTraversalSpec() }); PropertyFilterSpec pfSpec = new PropertyFilterSpec(); pfSpec.setPropSet(new PropertySpec[] { pSpec }); pfSpec.setObjectSet(new ObjectSpec[] { oSpec }); ObjectContent[] ocs = cb.getServiceConnection3().getService().retrieveProperties( cb.getServiceConnection3().getServiceContent().getPropertyCollector(), new PropertyFilterSpec[] { pfSpec }); if(ocs != null) { ManagedObjectReference[] morDatacenters = new ManagedObjectReference[ocs.length]; for(int i = 0; i < ocs.length; i++) morDatacenters[i] = ocs[i].getObj(); return morDatacenters; } return null; } private ManagedObjectReference[] getDataCenterVMMors(ManagedObjectReference morDatacenter) throws RuntimeFault, RemoteException { PropertySpec pSpec = new PropertySpec(); pSpec.setType("VirtualMachine"); pSpec.setPathSet(new String[] { "name"} ); ObjectSpec oSpec = new ObjectSpec(); oSpec.setObj(morDatacenter); oSpec.setSkip(Boolean.TRUE); TraversalSpec tSpec = new TraversalSpec(); tSpec.setName("dc2VMFolder"); tSpec.setType("Datacenter"); tSpec.setPath("vmFolder"); tSpec.setSelectSet(new SelectionSpec[] { getFolderRecursiveTraversalSpec() } ); oSpec.setSelectSet(new SelectionSpec[] { tSpec }); PropertyFilterSpec pfSpec = new PropertyFilterSpec(); pfSpec.setPropSet(new PropertySpec[] { pSpec }); pfSpec.setObjectSet(new ObjectSpec[] { oSpec }); ObjectContent[] ocs = cb.getServiceConnection3().getService().retrieveProperties( cb.getServiceConnection3().getServiceContent().getPropertyCollector(), new PropertyFilterSpec[] { pfSpec }); if(ocs != null) { ManagedObjectReference[] morVMs = new ManagedObjectReference[ocs.length]; for(int i = 0; i < ocs.length; i++) morVMs[i] = ocs[i].getObj(); return morVMs; } return null; } private ManagedObjectReference[] getDataCenterDatastoreMors(ManagedObjectReference morDatacenter) throws RuntimeFault, RemoteException { Object[] stores = getProperties(morDatacenter, new String[] { "datastore" }); if(stores != null && stores.length == 1) { return ((ArrayOfManagedObjectReference)stores[0]).getManagedObjectReference(); } return null; } private ManagedObjectReference[] getDataCenterClusterMors(ManagedObjectReference morDatacenter) throws RuntimeFault, RemoteException { PropertySpec pSpec = new PropertySpec(); pSpec.setType("ClusterComputeResource"); pSpec.setPathSet(new String[] { "name"} ); ObjectSpec oSpec = new ObjectSpec(); oSpec.setObj(morDatacenter); oSpec.setSkip(Boolean.TRUE); TraversalSpec tSpec = new TraversalSpec(); tSpec.setName("traversalHostFolder"); tSpec.setType("Datacenter"); tSpec.setPath("hostFolder"); tSpec.setSkip(false); tSpec.setSelectSet(new SelectionSpec[] { getFolderRecursiveTraversalSpec() }); oSpec.setSelectSet(new TraversalSpec[] { tSpec }); PropertyFilterSpec pfSpec = new PropertyFilterSpec(); pfSpec.setPropSet(new PropertySpec[] { pSpec }); pfSpec.setObjectSet(new ObjectSpec[] { oSpec }); ObjectContent[] ocs = cb.getServiceConnection3().getService().retrieveProperties( cb.getServiceConnection3().getServiceContent().getPropertyCollector(), new PropertyFilterSpec[] { pfSpec }); if(ocs != null) { ManagedObjectReference[] morDatacenters = new ManagedObjectReference[ocs.length]; for(int i = 0; i < ocs.length; i++) morDatacenters[i] = ocs[i].getObj(); return morDatacenters; } return null; } private ManagedObjectReference[] getDataCenterStandaloneHostMors(ManagedObjectReference morDatacenter) throws RuntimeFault, RemoteException { PropertySpec pSpec = new PropertySpec(); pSpec.setType("ComputeResource"); pSpec.setPathSet(new String[] { "name"} ); ObjectSpec oSpec = new ObjectSpec(); oSpec.setObj(morDatacenter); oSpec.setSkip(Boolean.TRUE); TraversalSpec tSpec = new TraversalSpec(); tSpec.setName("traversalHostFolder"); tSpec.setType("Datacenter"); tSpec.setPath("hostFolder"); tSpec.setSkip(false); tSpec.setSelectSet(new SelectionSpec[] { getFolderRecursiveTraversalSpec() }); oSpec.setSelectSet(new TraversalSpec[] { tSpec }); PropertyFilterSpec pfSpec = new PropertyFilterSpec(); pfSpec.setPropSet(new PropertySpec[] { pSpec }); pfSpec.setObjectSet(new ObjectSpec[] { oSpec }); ObjectContent[] ocs = cb.getServiceConnection3().getService().retrieveProperties( cb.getServiceConnection3().getServiceContent().getPropertyCollector(), new PropertyFilterSpec[] { pfSpec }); if(ocs != null) { List<ManagedObjectReference> listComputeResources = new ArrayList<ManagedObjectReference>(); for(ObjectContent oc : ocs) { if(oc.getObj().getType().equalsIgnoreCase("ComputeResource")) listComputeResources.add(oc.getObj()); } List<ManagedObjectReference> listHosts = new ArrayList<ManagedObjectReference>(); for(ManagedObjectReference morComputeResource : listComputeResources) { ManagedObjectReference[] hosts = getComputeResourceHostMors(morComputeResource); if(hosts != null) { for(ManagedObjectReference host: hosts) listHosts.add(host); } } return listHosts.toArray(new ManagedObjectReference[0]); } return null; } private ManagedObjectReference[] getComputeResourceHostMors(ManagedObjectReference morCompute) throws RuntimeFault, RemoteException { PropertySpec pSpec = new PropertySpec(); pSpec.setType("HostSystem"); pSpec.setPathSet(new String[] { "name"} ); ObjectSpec oSpec = new ObjectSpec(); oSpec.setObj(morCompute); oSpec.setSkip(true); TraversalSpec tSpec = new TraversalSpec(); tSpec.setName("computeResource2Host"); tSpec.setType("ComputeResource"); tSpec.setPath("host"); tSpec.setSkip(false); oSpec.setSelectSet(new TraversalSpec[] { tSpec }); PropertyFilterSpec pfSpec = new PropertyFilterSpec(); pfSpec.setPropSet(new PropertySpec[] { pSpec }); pfSpec.setObjectSet(new ObjectSpec[] { oSpec }); ObjectContent[] ocs = cb.getServiceConnection3().getService().retrieveProperties( cb.getServiceConnection3().getServiceContent().getPropertyCollector(), new PropertyFilterSpec[] { pfSpec }); if(ocs != null) { ManagedObjectReference[] morDatacenters = new ManagedObjectReference[ocs.length]; for(int i = 0; i < ocs.length; i++) morDatacenters[i] = ocs[i].getObj(); return morDatacenters; } return null; } private ManagedObjectReference[] getClusterHostMors(ManagedObjectReference morCluster) throws RuntimeFault, RemoteException { // ClusterComputeResource inherits from ComputeResource return getComputeResourceHostMors(morCluster); } private ObjectContent[] getDataCenterProperites(String[] properites) throws RuntimeFault, RemoteException { PropertySpec pSpec = new PropertySpec(); pSpec.setType("Datacenter"); pSpec.setPathSet(properites ); SelectionSpec recurseFolders = new SelectionSpec(); recurseFolders.setName("folder2childEntity"); TraversalSpec folder2childEntity = new TraversalSpec(); folder2childEntity.setType("Folder"); folder2childEntity.setPath("childEntity"); folder2childEntity.setName(recurseFolders.getName()); folder2childEntity.setSelectSet(new SelectionSpec[] { recurseFolders }); ObjectSpec oSpec = new ObjectSpec(); oSpec.setObj(cb.getServiceConnection3().getRootFolder()); oSpec.setSkip(Boolean.TRUE); oSpec.setSelectSet(new SelectionSpec[] { folder2childEntity }); PropertyFilterSpec pfSpec = new PropertyFilterSpec(); pfSpec.setPropSet(new PropertySpec[] { pSpec }); pfSpec.setObjectSet(new ObjectSpec[] { oSpec }); return cb.getServiceConnection3().getService().retrieveProperties( cb.getServiceConnection3().getServiceContent().getPropertyCollector(), new PropertyFilterSpec[] { pfSpec }); } private void printContent(ObjectContent[] objContent) { if(objContent != null) { for(ObjectContent oc : objContent) { ManagedObjectReference mor = oc.getObj(); DynamicProperty[] objProps = oc.getPropSet(); System.out.println("Object type: " + mor.getType()); if(objProps != null) { for(DynamicProperty objProp : objProps) { if(!objProp.getClass().isArray()) { System.out.println("\t" + objProp.getName() + "=" + objProp.getVal()); } else { Object[] ipcary = (Object[])objProp.getVal(); System.out.print("\t" + objProp.getName() + "=["); int i = 0; for(Object item : ipcary) { if (item.getClass().getName().indexOf("ManagedObjectReference") >= 0) { ManagedObjectReference imor = (ManagedObjectReference)item; System.out.print("(" + imor.getType() + "," + imor.get_value() + ")"); } else { System.out.print(item); } if(i < ipcary.length - 1) System.out.print(", "); i++; } System.out.println("]"); } } } } } } private void getProperites(ManagedObjectReference mor, Map<String, Object> properties) throws RuntimeFault, RemoteException { PropertySpec pSpec = new PropertySpec(); pSpec.setType(mor.getType()); pSpec.setPathSet(properties.keySet().toArray(new String[0])); ObjectSpec oSpec = new ObjectSpec(); oSpec.setObj(mor); PropertyFilterSpec pfSpec = new PropertyFilterSpec(); pfSpec.setPropSet(new PropertySpec[] {pSpec} ); pfSpec.setObjectSet(new ObjectSpec[] {oSpec} ); ObjectContent[] ocs = cb.getServiceConnection3().getService().retrieveProperties( cb.getServiceConnection3().getServiceContent().getPropertyCollector(), new PropertyFilterSpec[] {pfSpec} ); if(ocs != null) { for(ObjectContent oc : ocs) { DynamicProperty[] propSet = oc.getPropSet(); if(propSet != null) { for(DynamicProperty prop : propSet) { properties.put(prop.getName(), prop.getVal()); } } } } } private Object[] getProperties(ManagedObjectReference moRef, String[] properties) throws RuntimeFault, RemoteException { PropertySpec pSpec = new PropertySpec(); pSpec.setType(moRef.getType()); pSpec.setPathSet(properties); ObjectSpec oSpec = new ObjectSpec(); // Set the starting object oSpec.setObj(moRef); PropertyFilterSpec pfSpec = new PropertyFilterSpec(); pfSpec.setPropSet(new PropertySpec[] {pSpec} ); pfSpec.setObjectSet(new ObjectSpec[] {oSpec} ); ObjectContent[] ocs = cb.getServiceConnection3().getService().retrieveProperties( cb.getServiceConnection3().getServiceContent().getPropertyCollector(), new PropertyFilterSpec[] {pfSpec} ); Object[] ret = new Object[properties.length]; if(ocs != null) { for(int i = 0; i< ocs.length; ++i) { ObjectContent oc = ocs[i]; DynamicProperty[] dps = oc.getPropSet(); if(dps != null) { for(int j = 0; j < dps.length; ++j) { DynamicProperty dp = dps[j]; for(int p = 0; p < ret.length; ++p) { if(properties[p].equals(dp.getName())) { ret[p] = dp.getVal(); } } } } } } return ret; } private void powerOnVm() throws Exception { ManagedObjectReference morVm = new ManagedObjectReference(); morVm.setType("VirtualMachine"); morVm.set_value("vm-480"); cb.getServiceConnection3().getService().powerOnVM_Task(morVm, null); } private void powerOffVm() throws Exception { ManagedObjectReference morVm = new ManagedObjectReference(); morVm.setType("VirtualMachine"); morVm.set_value("vm-66"); cb.getServiceConnection3().getService().powerOffVM_Task(morVm); } private void createSnapshot() throws Exception { ManagedObjectReference morVm = new ManagedObjectReference(); morVm.setType("VirtualMachine"); morVm.set_value("vm-66"); cb.getServiceConnection3().getService().createSnapshot_Task(morVm, "RunningSnapshotProg", "", false, false); } private void registerTemplate() throws Exception { ManagedObjectReference morFolder = new ManagedObjectReference(); morFolder.setType("Folder"); morFolder.set_value("group-v3"); ManagedObjectReference morHost = new ManagedObjectReference(); morHost.setType("HostSystem"); morHost.set_value("host-48"); System.out.println("Begin registerVM_Task"); ManagedObjectReference taskmor = cb.getServiceConnection3().getService().registerVM_Task( morFolder, "[NFS datastore] Template-Fedora/Template-Fedora.vmtx", "Template-Fedora", true, null, morHost); System.out.println("End registerVM_Task"); String result = cb.getServiceUtil3().waitForTask(taskmor); if (result.equalsIgnoreCase("Sucess")) { System.out.println("Registering The Virtual Machine ..........Done"); } else { System.out.println("Some Exception While Registering The VM"); } } private void createVmFromTemplate() throws Exception { VirtualMachineCloneSpec cloneSpec = new VirtualMachineCloneSpec(); ManagedObjectReference morDatastore = new ManagedObjectReference(); morDatastore.setType("Datastore"); morDatastore.set_value("datastore-30"); ManagedObjectReference morHost = new ManagedObjectReference(); morHost.setType("HostSystem"); morHost.set_value("host-48"); ManagedObjectReference morPool = new ManagedObjectReference(); morPool.setType("ResourcePool"); morPool.set_value("resgroup-41"); VirtualMachineRelocateSpec relocSpec = new VirtualMachineRelocateSpec(); cloneSpec.setLocation(relocSpec); cloneSpec.setPowerOn(false); cloneSpec.setTemplate(false); relocSpec.setDatastore(morDatastore); relocSpec.setHost(morHost); relocSpec.setPool(morPool); ManagedObjectReference morTemplate = new ManagedObjectReference(); morTemplate.setType("VirtualMachine"); morTemplate.set_value("vm-76"); ManagedObjectReference morFolder = new ManagedObjectReference(); morFolder.setType("Folder"); morFolder.set_value("group-v3"); ManagedObjectReference cloneTask = cb.getServiceConnection3().getService().cloneVM_Task(morTemplate, morFolder, "Fedora-clone-test", cloneSpec); String status = cb.getServiceUtil3().waitForTask(cloneTask); if(status.equalsIgnoreCase("failure")) { System.out.println("Failure -: Virtual Machine cannot be cloned"); } if(status.equalsIgnoreCase("sucess")) { System.out.println("Virtual Machine Cloned successfully."); } } private void addNic() throws Exception { ManagedObjectReference morVm = new ManagedObjectReference(); morVm.setType("VirtualMachine"); morVm.set_value("vm-77"); ManagedObjectReference morNetwork = new ManagedObjectReference(); morNetwork.setType("DistributedVirtualPortgroup"); morNetwork.set_value("dvportgroup-56"); VirtualDeviceConfigSpec nicSpec = new VirtualDeviceConfigSpec(); nicSpec.setOperation(VirtualDeviceConfigSpecOperation.add); VirtualEthernetCard nic = new VirtualPCNet32(); VirtualEthernetCardNetworkBackingInfo nicBacking = new VirtualEthernetCardNetworkBackingInfo(); nicBacking.setDeviceName("Adapter to dSwitch-vlan26"); nicBacking.setNetwork(morNetwork); nic.setAddressType("generated"); nic.setBacking(nicBacking); nic.setKey(4); nicSpec.setDevice(nic); VirtualMachineConfigSpec vmConfigSpec = new VirtualMachineConfigSpec(); VirtualDeviceConfigSpec [] nicSpecArray = {nicSpec}; vmConfigSpec.setDeviceChange(nicSpecArray); ManagedObjectReference tmor = cb.getServiceConnection3().getService().reconfigVM_Task( morVm, vmConfigSpec); String status = cb.getServiceUtil3().waitForTask(tmor); if(status.equalsIgnoreCase("failure")) { System.out.println("Failure -: Virtual Machine cannot be cloned"); } if(status.equalsIgnoreCase("sucess")) { System.out.println("Virtual Machine Cloned successfully."); } } // add virtual NIC to vmkernel private void addNicToNetwork() throws Exception { ManagedObjectReference morHost = new ManagedObjectReference(); morHost.setType("HostSystem"); morHost.set_value("host-48"); HostPortGroupSpec portgrp = new HostPortGroupSpec(); portgrp.setName("VM Network vlan26"); Object cmobj = cb.getServiceUtil3().getDynamicProperty(morHost, "configManager"); HostConfigManager configMgr = (HostConfigManager)cmobj; ManagedObjectReference nwSystem = configMgr.getNetworkSystem(); HostVirtualNicSpec vNicSpec = new HostVirtualNicSpec(); HostIpConfig ipConfig = new HostIpConfig(); ipConfig.setDhcp(false); ipConfig.setIpAddress("192.168.26.177"); ipConfig.setSubnetMask("255.255.255.0"); vNicSpec.setIp(ipConfig); vNicSpec.setPortgroup("VM Network vlan26"); cb.getServiceConnection3().getService().addVirtualNic(nwSystem, "dvPortGroup-vlan26", vNicSpec); } private void createDatacenter() throws Exception { cb.getServiceConnection3().getService().createDatacenter( cb.getServiceConnection3().getRootFolder(), "cloud.dc.test"); } private void getPropertyWithPath() throws Exception { ManagedObjectReference morHost = new ManagedObjectReference(); morHost.setType("HostSystem"); morHost.set_value("host-161"); VirtualNicManagerNetConfig[] netConfigs = (VirtualNicManagerNetConfig[])cb.getServiceUtil3().getDynamicProperty(morHost, "config.virtualNicManagerInfo.netConfig"); } private void getHostVMs() throws Exception { ManagedObjectReference morHost = new ManagedObjectReference(); morHost.setType("HostSystem"); morHost.set_value("host-48"); PropertySpec pSpec = new PropertySpec(); pSpec.setType("VirtualMachine"); pSpec.setPathSet(new String[] { "name", "runtime.powerState", "config.template" }); TraversalSpec host2VmTraversal = new TraversalSpec(); host2VmTraversal.setType("HostSystem"); host2VmTraversal.setPath("vm"); host2VmTraversal.setName("host2VmTraversal"); ObjectSpec oSpec = new ObjectSpec(); oSpec.setObj(morHost); oSpec.setSkip(Boolean.TRUE); oSpec.setSelectSet(new SelectionSpec[] { host2VmTraversal }); PropertyFilterSpec pfSpec = new PropertyFilterSpec(); pfSpec.setPropSet(new PropertySpec[] { pSpec }); pfSpec.setObjectSet(new ObjectSpec[] { oSpec }); ObjectContent[] ocs = cb.getServiceConnection3().getService().retrieveProperties( cb.getServiceConnection3().getServiceContent().getPropertyCollector(), new PropertyFilterSpec[] { pfSpec }); this.printContent(ocs); } private void testFT() throws Exception { ManagedObjectReference morVm = new ManagedObjectReference(); morVm.setType("VirtualMachine"); morVm.set_value("vm-480"); ManagedObjectReference morHost = new ManagedObjectReference(); morHost.setType("HostSystem"); morHost.set_value("host-470"); System.out.println("Create secondary VM"); ManagedObjectReference morTask = cb.getServiceConnection3().getService().createSecondaryVM_Task(morVm, morHost); String result = cb.getServiceUtil3().waitForTask(morTask); System.out.println("Create secondary VM resutl : " + result); } private void testFTEnable() throws Exception { ManagedObjectReference morVm = new ManagedObjectReference(); morVm.setType("VirtualMachine"); morVm.set_value("vm-480"); ManagedObjectReference morHost = new ManagedObjectReference(); morHost.setType("HostSystem"); morHost.set_value("host-470"); ManagedObjectReference morSecondaryVm = new ManagedObjectReference(); morSecondaryVm.setType("VirtualMachine"); morSecondaryVm.set_value("vm-485"); System.out.println("Enable FT"); ManagedObjectReference morTask = cb.getServiceConnection3().getService().enableSecondaryVM_Task(morVm, morSecondaryVm, morHost); String result = cb.getServiceUtil3().waitForTask(morTask); System.out.println("Enable FT resutl : " + result); } private void importOVF() throws Exception { ManagedObjectReference morHost = new ManagedObjectReference(); morHost.setType("HostSystem"); morHost.set_value("host-223"); ManagedObjectReference morRp = new ManagedObjectReference(); morRp.setType("ResourcePool"); morRp.set_value("resgroup-222"); ManagedObjectReference morDs = new ManagedObjectReference(); morDs.setType("Datastore"); morDs.set_value("datastore-30"); ManagedObjectReference morVmFolder = new ManagedObjectReference(); morVmFolder.setType("Folder"); morVmFolder.set_value("group-v3"); ManagedObjectReference morNetwork = new ManagedObjectReference(); morNetwork.setType("Network"); morNetwork.set_value("network-32"); ManagedObjectReference morOvf = cb.getServiceConnection3().getServiceContent().getOvfManager(); OvfCreateImportSpecParams importSpecParams = new OvfCreateImportSpecParams(); importSpecParams.setHostSystem(morHost); importSpecParams.setLocale("US"); importSpecParams.setEntityName("winxpsp3-ovf-deployed"); importSpecParams.setDeploymentOption(""); importSpecParams.setDiskProvisioning("thin"); /* OvfNetworkMapping networkMapping = new OvfNetworkMapping(); networkMapping.setName("VM Network"); networkMapping.setNetwork(morNetwork); // network); importSpecParams.setNetworkMapping(new OvfNetworkMapping[] { networkMapping }); */ importSpecParams.setPropertyMapping(null); String ovfDescriptor = readOvfContent("C:\\research\\vmware\\winxpsp3-ovf\\winxpsp3-ovf.ovf"); OvfCreateImportSpecResult ovfImportResult = cb.getServiceConnection3().getService().createImportSpec( morOvf, ovfDescriptor, morRp, morDs, importSpecParams); if(ovfImportResult != null) { long totalBytes = addTotalBytes(ovfImportResult); ManagedObjectReference morLease = cb.getServiceConnection3().getService().importVApp(morRp, ovfImportResult.getImportSpec(), morVmFolder, morHost); HttpNfcLeaseState state; for(;;) { state = (HttpNfcLeaseState)cb.getServiceUtil3().getDynamicProperty(morLease, "state"); if(state == HttpNfcLeaseState.ready || state == HttpNfcLeaseState.error) break; } if(state == HttpNfcLeaseState.ready) { HttpNfcLeaseInfo httpNfcLeaseInfo = (HttpNfcLeaseInfo)cb.getServiceUtil3().getDynamicProperty(morLease, "info"); HttpNfcLeaseDeviceUrl[] deviceUrls = httpNfcLeaseInfo.getDeviceUrl(); long bytesAlreadyWritten = 0; for (HttpNfcLeaseDeviceUrl deviceUrl : deviceUrls) { String deviceKey = deviceUrl.getImportKey(); for (OvfFileItem ovfFileItem : ovfImportResult.getFileItem()) { if (deviceKey.equals(ovfFileItem.getDeviceId())) { System.out.println("Import key==OvfFileItem device id: " + deviceKey); System.out.println("device URL: " + deviceUrl.getUrl()); String absoluteFile = "C:\\research\\vmware\\winxpsp3-ovf\\" + ovfFileItem.getPath(); String urlToPost = deviceUrl.getUrl().replace("*", "esxhost-1.lab.vmops.com"); uploadVmdkFile(ovfFileItem.isCreate(), absoluteFile, urlToPost, bytesAlreadyWritten, totalBytes); bytesAlreadyWritten += ovfFileItem.getSize(); System.out.println("Completed uploading the VMDK file:" + absoluteFile); } } } cb.getServiceConnection3().getService().httpNfcLeaseProgress(morLease, 100); cb.getServiceConnection3().getService().httpNfcLeaseComplete(morLease); } } } private static void uploadVmdkFile(boolean put, String diskFilePath, String urlStr, long bytesAlreadyWritten, long totalBytes) throws IOException { HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() { public boolean verify(String urlHostName, SSLSession session) { return true; } }); HttpsURLConnection conn = (HttpsURLConnection) new URL(urlStr).openConnection(); conn.setDoOutput(true); conn.setUseCaches(false); int CHUCK_LEN = 64*1024; conn.setChunkedStreamingMode(CHUCK_LEN); conn.setRequestMethod(put? "PUT" : "POST"); // Use a post method to write the file. conn.setRequestProperty("Connection", "Keep-Alive"); conn.setRequestProperty("Content-Type", "application/x-vnd.vmware-streamVmdk"); conn.setRequestProperty("Content-Length", Long.toString(new File(diskFilePath).length())); BufferedOutputStream bos = new BufferedOutputStream(conn.getOutputStream()); BufferedInputStream diskis = new BufferedInputStream(new FileInputStream(diskFilePath)); int bytesAvailable = diskis.available(); int bufferSize = Math.min(bytesAvailable, CHUCK_LEN); byte[] buffer = new byte[bufferSize]; long totalBytesWritten = 0; while (true) { int bytesRead = diskis.read(buffer, 0, bufferSize); if (bytesRead == -1) { System.out.println("Total bytes written: " + totalBytesWritten); break; } totalBytesWritten += bytesRead; bos.write(buffer, 0, bufferSize); bos.flush(); System.out.println("Total bytes written: " + totalBytesWritten); /* int progressPercent = (int) (((bytesAlreadyWritten + totalBytesWritten) * 100) / totalBytes); leaseUpdater.setPercent(progressPercent); */ } diskis.close(); bos.flush(); bos.close(); conn.disconnect(); } public static long addTotalBytes(OvfCreateImportSpecResult ovfImportResult) { OvfFileItem[] fileItemArr = ovfImportResult.getFileItem(); long totalBytes = 0; if (fileItemArr != null) { for (OvfFileItem fi : fileItemArr) { printOvfFileItem(fi); totalBytes += fi.getSize(); } } return totalBytes; } private static void printOvfFileItem(OvfFileItem fi) { System.out.println("================ OvfFileItem ================"); System.out.println("chunkSize: " + fi.getChunkSize()); System.out.println("create: " + fi.isCreate()); System.out.println("deviceId: " + fi.getDeviceId()); System.out.println("path: " + fi.getPath()); System.out.println("size: " + fi.getSize()); System.out.println("=============================================="); } public static String readOvfContent(String ovfFilePath) throws IOException { StringBuffer strContent = new StringBuffer(); BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(ovfFilePath))); String lineStr; while ((lineStr = in.readLine()) != null) { strContent.append(lineStr); } in.close(); return strContent.toString(); } public static String escapeSpecialChars(String str) { str = str.replaceAll("<", "<"); return str.replaceAll(">", ">"); // do not escape "&" -> "&", "\"" -> """ } public static void main(String[] args) throws Exception { setupLog4j(); TestVMWare client = new TestVMWare(); // skip certificate check System.setProperty("axis.socketSecureFactory", "org.apache.axis.components.net.SunFakeTrustSocketFactory"); String serviceUrl = "https://" + args[0] + "/sdk/vimService"; try { String[] params = new String[] {"--url", serviceUrl, "--username", args[1], "--password", args[2] }; cb = ExtendedAppUtil.initialize("Connect", params); cb.connect(); System.out.println("Connection Succesful."); // client.listInventoryFolders(); // client.listDataCenters(); // client.powerOnVm(); // client.createSnapshot(); // client.registerTemplate(); // client.createVmFromTemplate(); // client.addNic(); // client.addNicToNetwork(); // client.createDatacenter(); // client.getPropertyWithPath(); // client.getHostVMs(); // client.testFT(); // client.testFTEnable(); client.importOVF(); cb.disConnect(); } catch (Exception e) { e.printStackTrace(); } } public static class TrustAllManager 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; } } }