http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/011281f9/vmware-base/test/com/cloud/vmware/TestVMWare.java ---------------------------------------------------------------------- diff --git a/vmware-base/test/com/cloud/vmware/TestVMWare.java b/vmware-base/test/com/cloud/vmware/TestVMWare.java new file mode 100644 index 0000000..43c784c --- /dev/null +++ b/vmware-base/test/com/cloud/vmware/TestVMWare.java @@ -0,0 +1,1140 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with 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. +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; + } + } +} +
