http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/3ae274a4/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareContext.java ---------------------------------------------------------------------- diff --git a/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareContext.java b/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareContext.java index 155a3a7..6dd6475 100755 --- a/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareContext.java +++ b/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareContext.java @@ -27,38 +27,38 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.ConnectException; -import java.net.HttpURLConnection; -import java.net.URL; -import java.net.URLEncoder; -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.Logger; - -import com.cloud.hypervisor.vmware.mo.DatacenterMO; -import com.cloud.hypervisor.vmware.mo.DatastoreFile; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLEncoder; +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.Logger; + +import com.cloud.hypervisor.vmware.mo.DatacenterMO; +import com.cloud.hypervisor.vmware.mo.DatastoreFile; import com.cloud.utils.ActionDelegate; -import com.vmware.apputils.version.ExtendedAppUtil; -import com.vmware.apputils.vim25.ServiceConnection; -import com.vmware.apputils.vim25.ServiceUtil; -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.SelectionSpec; -import com.vmware.vim25.ServiceContent; -import com.vmware.vim25.TaskInfo; -import com.vmware.vim25.TraversalSpec; -import com.vmware.vim25.VimPortType; - -public class VmwareContext { +import com.vmware.apputils.version.ExtendedAppUtil; +import com.vmware.apputils.vim25.ServiceConnection; +import com.vmware.apputils.vim25.ServiceUtil; +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.SelectionSpec; +import com.vmware.vim25.ServiceContent; +import com.vmware.vim25.TaskInfo; +import com.vmware.vim25.TraversalSpec; +import com.vmware.vim25.VimPortType; + +public class VmwareContext { private static final Logger s_logger = Logger.getLogger(VmwareContext.class); private static int MAX_CONNECT_RETRY = 5; @@ -69,229 +69,229 @@ public class VmwareContext { private Map<String, Object> _stockMap = new HashMap<String, Object>(); private int _CHUNKSIZE = 1*1024*1024; // 1M - - 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) { - s_logger.error("Unexpected exception ", e); - } - } - - public VmwareContext(ExtendedAppUtil appUtil, String address) { - assert(appUtil != null) : "Invalid parameter in constructing VmwareContext object"; - - _appUtil = appUtil; - _serverAddress = address; - } - - public void registerStockObject(String name, Object obj) { - synchronized(_stockMap) { - _stockMap.put(name, obj); - } - } - - public void uregisterStockObject(String name) { - synchronized(_stockMap) { - _stockMap.remove(name); - } - } - - @SuppressWarnings("unchecked") - public <T> T getStockObject(String name) { - synchronized(_stockMap) { - return (T)_stockMap.get(name); - } - } - - public String getServerAddress() { - return _serverAddress; - } - - public ServiceConnection getServiceConnection() { - return _appUtil.getServiceConnection3(); - } - - public VimPortType getService() { - return getServiceConnection().getService(); - } - - public ServiceContent getServiceContent() { - return getServiceConnection().getServiceContent(); - } - - public ServiceUtil getServiceUtil() { - return _appUtil.getServiceUtil3(); - } - - public ManagedObjectReference getRootFolder() { - return getServiceContent().getRootFolder(); - } - - public ManagedObjectReference getHostMorByPath(String inventoryPath) throws Exception { - assert(inventoryPath != null); - - String[] tokens; - if(inventoryPath.startsWith("/")) - tokens = inventoryPath.substring(1).split("/"); - else - tokens = inventoryPath.split("/"); - - ManagedObjectReference mor = getRootFolder(); - for(int i=0; i < tokens.length;i++) { - String token = tokens[i]; - ObjectContent[] ocs; - if(mor.getType().equalsIgnoreCase("Datacenter")) { - PropertySpec pSpec = new PropertySpec(); - pSpec.setType("ManagedEntity"); - pSpec.setPathSet(new String[] { "name" }); - - TraversalSpec dcHostFolderTraversal = new TraversalSpec(); - dcHostFolderTraversal.setType("Datacenter"); - dcHostFolderTraversal.setPath("hostFolder"); - dcHostFolderTraversal.setName("dcHostFolderTraversal"); - - ObjectSpec oSpec = new ObjectSpec(); - oSpec.setObj(mor); - oSpec.setSkip(Boolean.TRUE); - oSpec.setSelectSet(new SelectionSpec[] { dcHostFolderTraversal }); - - PropertyFilterSpec pfSpec = new PropertyFilterSpec(); - pfSpec.setPropSet(new PropertySpec[] { pSpec }); - pfSpec.setObjectSet(new ObjectSpec[] { oSpec }); - ocs = getService().retrieveProperties( - getServiceContent().getPropertyCollector(), - new PropertyFilterSpec[] { pfSpec }); - - } else if(mor.getType().equalsIgnoreCase("Folder")) { - PropertySpec pSpec = new PropertySpec(); - pSpec.setType("ManagedEntity"); - pSpec.setPathSet(new String[] { "name" }); - - TraversalSpec folderChildrenTraversal = new TraversalSpec(); - folderChildrenTraversal.setType("Folder"); - folderChildrenTraversal.setPath("childEntity"); - folderChildrenTraversal.setName("folderChildrenTraversal"); - - ObjectSpec oSpec = new ObjectSpec(); - oSpec.setObj(mor); - oSpec.setSkip(Boolean.TRUE); - oSpec.setSelectSet(new SelectionSpec[] { folderChildrenTraversal }); - - PropertyFilterSpec pfSpec = new PropertyFilterSpec(); - pfSpec.setPropSet(new PropertySpec[] { pSpec }); - pfSpec.setObjectSet(new ObjectSpec[] { oSpec }); - - ocs = getService().retrieveProperties( - getServiceContent().getPropertyCollector(), - new PropertyFilterSpec[] { pfSpec }); - } else if(mor.getType().equalsIgnoreCase("ClusterComputeResource")) { - PropertySpec pSpec = new PropertySpec(); - pSpec.setType("ManagedEntity"); - pSpec.setPathSet(new String[] { "name" }); - - TraversalSpec clusterHostTraversal = new TraversalSpec(); - clusterHostTraversal.setType("ClusterComputeResource"); - clusterHostTraversal.setPath("host"); - clusterHostTraversal.setName("folderChildrenTraversal"); - - ObjectSpec oSpec = new ObjectSpec(); - oSpec.setObj(mor); - oSpec.setSkip(Boolean.TRUE); - oSpec.setSelectSet(new SelectionSpec[] { clusterHostTraversal }); - - PropertyFilterSpec pfSpec = new PropertyFilterSpec(); - pfSpec.setPropSet(new PropertySpec[] { pSpec }); - pfSpec.setObjectSet(new ObjectSpec[] { oSpec }); - - ocs = getService().retrieveProperties( - getServiceContent().getPropertyCollector(), - new PropertyFilterSpec[] { pfSpec }); - } else { - s_logger.error("Invalid inventory path, path element can only be datacenter and folder"); - return null; - } - - if(ocs != null && ocs.length > 0) { - boolean found = false; - for(ObjectContent oc : ocs) { - String name = oc.getPropSet()[0].getVal().toString(); - if(name.equalsIgnoreCase(token) || name.equalsIgnoreCase("host")) { - mor = oc.getObj(); - found = true; - if (name.equalsIgnoreCase("host")) - i--; - break; - } - } - if(!found) { - s_logger.error("Path element points to an un-existing inventory entity"); - return null; - } - } else { - s_logger.error("Path element points to an un-existing inventory entity"); - return null; - } - } - return mor; - } - - // path in format of <datacenter name>/<datastore name> - public ManagedObjectReference getDatastoreMorByPath(String inventoryPath) throws Exception { - assert(inventoryPath != null); - - String[] tokens; - if(inventoryPath.startsWith("/")) - tokens = inventoryPath.substring(1).split("/"); - else - tokens = inventoryPath.split("/"); - - if(tokens == null || tokens.length != 2) { - s_logger.error("Invalid datastore inventory path. path: " + inventoryPath); - return null; - } - - DatacenterMO dcMo = new DatacenterMO(this, tokens[0]); - if(dcMo.getMor() == null) { - s_logger.error("Unable to locate the datacenter specified in path: " + inventoryPath); - return null; - } - - return dcMo.findDatastore(tokens[1]); - } - - public void waitForTaskProgressDone(ManagedObjectReference morTask) throws Exception { - while(true) { - TaskInfo tinfo = (TaskInfo)getServiceUtil().getDynamicProperty(morTask, "info"); - Integer progress = tinfo.getProgress(); - if(progress == null) - break; - - if(progress.intValue() >= 100) - break; - - Thread.sleep(1000); - } - } - - public void getFile(String urlString, String localFileFullName) throws Exception { - HttpURLConnection conn = getHTTPConnection(urlString); - - InputStream in = conn.getInputStream(); - OutputStream out = new FileOutputStream(new File(localFileFullName)); - byte[] buf = new byte[_CHUNKSIZE]; - int len = 0; - while ((len = in.read(buf)) > 0) { - out.write(buf, 0, len); - } - in.close(); - out.close(); - } + + 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) { + s_logger.error("Unexpected exception ", e); + } + } + + public VmwareContext(ExtendedAppUtil appUtil, String address) { + assert(appUtil != null) : "Invalid parameter in constructing VmwareContext object"; + + _appUtil = appUtil; + _serverAddress = address; + } + + public void registerStockObject(String name, Object obj) { + synchronized(_stockMap) { + _stockMap.put(name, obj); + } + } + + public void uregisterStockObject(String name) { + synchronized(_stockMap) { + _stockMap.remove(name); + } + } + + @SuppressWarnings("unchecked") + public <T> T getStockObject(String name) { + synchronized(_stockMap) { + return (T)_stockMap.get(name); + } + } + + public String getServerAddress() { + return _serverAddress; + } + + public ServiceConnection getServiceConnection() { + return _appUtil.getServiceConnection3(); + } + + public VimPortType getService() { + return getServiceConnection().getService(); + } + + public ServiceContent getServiceContent() { + return getServiceConnection().getServiceContent(); + } + + public ServiceUtil getServiceUtil() { + return _appUtil.getServiceUtil3(); + } + + public ManagedObjectReference getRootFolder() { + return getServiceContent().getRootFolder(); + } + + public ManagedObjectReference getHostMorByPath(String inventoryPath) throws Exception { + assert(inventoryPath != null); + + String[] tokens; + if(inventoryPath.startsWith("/")) + tokens = inventoryPath.substring(1).split("/"); + else + tokens = inventoryPath.split("/"); + + ManagedObjectReference mor = getRootFolder(); + for(int i=0; i < tokens.length;i++) { + String token = tokens[i]; + ObjectContent[] ocs; + if(mor.getType().equalsIgnoreCase("Datacenter")) { + PropertySpec pSpec = new PropertySpec(); + pSpec.setType("ManagedEntity"); + pSpec.setPathSet(new String[] { "name" }); + + TraversalSpec dcHostFolderTraversal = new TraversalSpec(); + dcHostFolderTraversal.setType("Datacenter"); + dcHostFolderTraversal.setPath("hostFolder"); + dcHostFolderTraversal.setName("dcHostFolderTraversal"); + + ObjectSpec oSpec = new ObjectSpec(); + oSpec.setObj(mor); + oSpec.setSkip(Boolean.TRUE); + oSpec.setSelectSet(new SelectionSpec[] { dcHostFolderTraversal }); + + PropertyFilterSpec pfSpec = new PropertyFilterSpec(); + pfSpec.setPropSet(new PropertySpec[] { pSpec }); + pfSpec.setObjectSet(new ObjectSpec[] { oSpec }); + ocs = getService().retrieveProperties( + getServiceContent().getPropertyCollector(), + new PropertyFilterSpec[] { pfSpec }); + + } else if(mor.getType().equalsIgnoreCase("Folder")) { + PropertySpec pSpec = new PropertySpec(); + pSpec.setType("ManagedEntity"); + pSpec.setPathSet(new String[] { "name" }); + + TraversalSpec folderChildrenTraversal = new TraversalSpec(); + folderChildrenTraversal.setType("Folder"); + folderChildrenTraversal.setPath("childEntity"); + folderChildrenTraversal.setName("folderChildrenTraversal"); + + ObjectSpec oSpec = new ObjectSpec(); + oSpec.setObj(mor); + oSpec.setSkip(Boolean.TRUE); + oSpec.setSelectSet(new SelectionSpec[] { folderChildrenTraversal }); + + PropertyFilterSpec pfSpec = new PropertyFilterSpec(); + pfSpec.setPropSet(new PropertySpec[] { pSpec }); + pfSpec.setObjectSet(new ObjectSpec[] { oSpec }); + + ocs = getService().retrieveProperties( + getServiceContent().getPropertyCollector(), + new PropertyFilterSpec[] { pfSpec }); + } else if(mor.getType().equalsIgnoreCase("ClusterComputeResource")) { + PropertySpec pSpec = new PropertySpec(); + pSpec.setType("ManagedEntity"); + pSpec.setPathSet(new String[] { "name" }); + + TraversalSpec clusterHostTraversal = new TraversalSpec(); + clusterHostTraversal.setType("ClusterComputeResource"); + clusterHostTraversal.setPath("host"); + clusterHostTraversal.setName("folderChildrenTraversal"); + + ObjectSpec oSpec = new ObjectSpec(); + oSpec.setObj(mor); + oSpec.setSkip(Boolean.TRUE); + oSpec.setSelectSet(new SelectionSpec[] { clusterHostTraversal }); + + PropertyFilterSpec pfSpec = new PropertyFilterSpec(); + pfSpec.setPropSet(new PropertySpec[] { pSpec }); + pfSpec.setObjectSet(new ObjectSpec[] { oSpec }); + + ocs = getService().retrieveProperties( + getServiceContent().getPropertyCollector(), + new PropertyFilterSpec[] { pfSpec }); + } else { + s_logger.error("Invalid inventory path, path element can only be datacenter and folder"); + return null; + } + + if(ocs != null && ocs.length > 0) { + boolean found = false; + for(ObjectContent oc : ocs) { + String name = oc.getPropSet()[0].getVal().toString(); + if(name.equalsIgnoreCase(token) || name.equalsIgnoreCase("host")) { + mor = oc.getObj(); + found = true; + if (name.equalsIgnoreCase("host")) + i--; + break; + } + } + if(!found) { + s_logger.error("Path element points to an un-existing inventory entity"); + return null; + } + } else { + s_logger.error("Path element points to an un-existing inventory entity"); + return null; + } + } + return mor; + } + + // path in format of <datacenter name>/<datastore name> + public ManagedObjectReference getDatastoreMorByPath(String inventoryPath) throws Exception { + assert(inventoryPath != null); + + String[] tokens; + if(inventoryPath.startsWith("/")) + tokens = inventoryPath.substring(1).split("/"); + else + tokens = inventoryPath.split("/"); + + if(tokens == null || tokens.length != 2) { + s_logger.error("Invalid datastore inventory path. path: " + inventoryPath); + return null; + } + + DatacenterMO dcMo = new DatacenterMO(this, tokens[0]); + if(dcMo.getMor() == null) { + s_logger.error("Unable to locate the datacenter specified in path: " + inventoryPath); + return null; + } + + return dcMo.findDatastore(tokens[1]); + } + + public void waitForTaskProgressDone(ManagedObjectReference morTask) throws Exception { + while(true) { + TaskInfo tinfo = (TaskInfo)getServiceUtil().getDynamicProperty(morTask, "info"); + Integer progress = tinfo.getProgress(); + if(progress == null) + break; + + if(progress.intValue() >= 100) + break; + + Thread.sleep(1000); + } + } + + public void getFile(String urlString, String localFileFullName) throws Exception { + HttpURLConnection conn = getHTTPConnection(urlString); + + InputStream in = conn.getInputStream(); + OutputStream out = new FileOutputStream(new File(localFileFullName)); + byte[] buf = new byte[_CHUNKSIZE]; + int len = 0; + while ((len = in.read(buf)) > 0) { + out.write(buf, 0, len); + } + in.close(); + out.close(); + } public void uploadFile(String urlString, String localFileFullName) throws Exception { uploadFile(urlString, new File(localFileFullName));
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/3ae274a4/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareHelper.java ---------------------------------------------------------------------- diff --git a/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareHelper.java b/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareHelper.java index 746b714..47ff8e2 100644 --- a/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareHelper.java +++ b/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareHelper.java @@ -15,7 +15,7 @@ // specific language governing permissions and limitations // under the License. -package com.cloud.hypervisor.vmware.util; +package com.cloud.hypervisor.vmware.util; import java.io.BufferedWriter; import java.io.ByteArrayOutputStream; @@ -108,9 +108,9 @@ public class VmwareHelper { nic.setAddressType("Manual"); nic.setConnectable(connectInfo); nic.setMacAddress(macAddress); - nic.setUnitNumber(deviceNumber); - nic.setKey(-contextNumber); - return nic; + nic.setUnitNumber(deviceNumber); + nic.setKey(-contextNumber); + return nic; } public static VirtualDevice prepareDvNicDevice(VirtualMachineMO vmMo, ManagedObjectReference morNetwork, VirtualEthernetCardType deviceType, @@ -160,93 +160,93 @@ public class VmwareHelper { nic.setKey(-contextNumber); return nic; } - - // vmdkDatastorePath: [datastore name] vmdkFilePath - public static VirtualDevice prepareDiskDevice(VirtualMachineMO vmMo, int controllerKey, String vmdkDatastorePath, - int sizeInMb, ManagedObjectReference morDs, int deviceNumber, int contextNumber) throws Exception { - - VirtualDisk disk = new VirtualDisk(); - - VirtualDiskFlatVer2BackingInfo backingInfo = new VirtualDiskFlatVer2BackingInfo(); - backingInfo.setDiskMode(VirtualDiskMode.persistent.toString()); - backingInfo.setThinProvisioned(true); - backingInfo.setEagerlyScrub(false); - backingInfo.setDatastore(morDs); - backingInfo.setFileName(vmdkDatastorePath); - disk.setBacking(backingInfo); + + // vmdkDatastorePath: [datastore name] vmdkFilePath + public static VirtualDevice prepareDiskDevice(VirtualMachineMO vmMo, int controllerKey, String vmdkDatastorePath, + int sizeInMb, ManagedObjectReference morDs, int deviceNumber, int contextNumber) throws Exception { + + VirtualDisk disk = new VirtualDisk(); + + VirtualDiskFlatVer2BackingInfo backingInfo = new VirtualDiskFlatVer2BackingInfo(); + backingInfo.setDiskMode(VirtualDiskMode.persistent.toString()); + backingInfo.setThinProvisioned(true); + backingInfo.setEagerlyScrub(false); + backingInfo.setDatastore(morDs); + backingInfo.setFileName(vmdkDatastorePath); + disk.setBacking(backingInfo); if(controllerKey < 0) controllerKey = vmMo.getIDEDeviceControllerKey(); if(deviceNumber < 0) deviceNumber = vmMo.getNextDeviceNumber(controllerKey); disk.setControllerKey(controllerKey); - - disk.setKey(-contextNumber); - disk.setUnitNumber(deviceNumber); - disk.setCapacityInKB(sizeInMb*1024); - - VirtualDeviceConnectInfo connectInfo = new VirtualDeviceConnectInfo(); - connectInfo.setConnected(true); - connectInfo.setStartConnected(true); - disk.setConnectable(connectInfo); - - return disk; + + disk.setKey(-contextNumber); + disk.setUnitNumber(deviceNumber); + disk.setCapacityInKB(sizeInMb*1024); + + VirtualDeviceConnectInfo connectInfo = new VirtualDeviceConnectInfo(); + connectInfo.setConnected(true); + connectInfo.setStartConnected(true); + disk.setConnectable(connectInfo); + + return disk; } - // vmdkDatastorePath: [datastore name] vmdkFilePath, create delta disk based on disk from template - public static VirtualDevice prepareDiskDevice(VirtualMachineMO vmMo, int controllerKey, String vmdkDatastorePath, - int sizeInMb, ManagedObjectReference morDs, VirtualDisk templateDisk, int deviceNumber, int contextNumber) throws Exception { - - assert(templateDisk != null); - VirtualDeviceBackingInfo parentBacking = templateDisk.getBacking(); - assert(parentBacking != null); - - // TODO Not sure if we need to check if the disk in template and the new disk needs to share the - // same datastore - VirtualDisk disk = new VirtualDisk(); - if(parentBacking instanceof VirtualDiskFlatVer1BackingInfo) { - VirtualDiskFlatVer1BackingInfo backingInfo = new VirtualDiskFlatVer1BackingInfo(); - backingInfo.setDiskMode(((VirtualDiskFlatVer1BackingInfo)parentBacking).getDiskMode()); - backingInfo.setDatastore(morDs); - backingInfo.setFileName(vmdkDatastorePath); - backingInfo.setParent((VirtualDiskFlatVer1BackingInfo)parentBacking); - disk.setBacking(backingInfo); - } else if(parentBacking instanceof VirtualDiskFlatVer2BackingInfo) { - VirtualDiskFlatVer2BackingInfo backingInfo = new VirtualDiskFlatVer2BackingInfo(); - backingInfo.setDiskMode(((VirtualDiskFlatVer2BackingInfo)parentBacking).getDiskMode()); - backingInfo.setDatastore(morDs); - backingInfo.setFileName(vmdkDatastorePath); - backingInfo.setParent((VirtualDiskFlatVer2BackingInfo)parentBacking); - disk.setBacking(backingInfo); - } else if(parentBacking instanceof VirtualDiskRawDiskMappingVer1BackingInfo) { - VirtualDiskRawDiskMappingVer1BackingInfo backingInfo = new VirtualDiskRawDiskMappingVer1BackingInfo(); - backingInfo.setDiskMode(((VirtualDiskRawDiskMappingVer1BackingInfo)parentBacking).getDiskMode()); - backingInfo.setDatastore(morDs); - backingInfo.setFileName(vmdkDatastorePath); - backingInfo.setParent((VirtualDiskRawDiskMappingVer1BackingInfo)parentBacking); - disk.setBacking(backingInfo); - } else if(parentBacking instanceof VirtualDiskSparseVer1BackingInfo) { - VirtualDiskSparseVer1BackingInfo backingInfo = new VirtualDiskSparseVer1BackingInfo(); - backingInfo.setDiskMode(((VirtualDiskSparseVer1BackingInfo)parentBacking).getDiskMode()); - backingInfo.setDatastore(morDs); - backingInfo.setFileName(vmdkDatastorePath); - backingInfo.setParent((VirtualDiskSparseVer1BackingInfo)parentBacking); - disk.setBacking(backingInfo); - } else if(parentBacking instanceof VirtualDiskSparseVer2BackingInfo) { - VirtualDiskSparseVer2BackingInfo backingInfo = new VirtualDiskSparseVer2BackingInfo(); - backingInfo.setDiskMode(((VirtualDiskSparseVer2BackingInfo)parentBacking).getDiskMode()); - backingInfo.setDatastore(morDs); - backingInfo.setFileName(vmdkDatastorePath); - backingInfo.setParent((VirtualDiskSparseVer2BackingInfo)parentBacking); - disk.setBacking(backingInfo); - } else { - throw new Exception("Unsupported disk backing: " + parentBacking.getClass().getCanonicalName()); - } - - if(controllerKey < 0) - controllerKey = vmMo.getIDEDeviceControllerKey(); - disk.setControllerKey(controllerKey); - if(deviceNumber < 0) + // vmdkDatastorePath: [datastore name] vmdkFilePath, create delta disk based on disk from template + public static VirtualDevice prepareDiskDevice(VirtualMachineMO vmMo, int controllerKey, String vmdkDatastorePath, + int sizeInMb, ManagedObjectReference morDs, VirtualDisk templateDisk, int deviceNumber, int contextNumber) throws Exception { + + assert(templateDisk != null); + VirtualDeviceBackingInfo parentBacking = templateDisk.getBacking(); + assert(parentBacking != null); + + // TODO Not sure if we need to check if the disk in template and the new disk needs to share the + // same datastore + VirtualDisk disk = new VirtualDisk(); + if(parentBacking instanceof VirtualDiskFlatVer1BackingInfo) { + VirtualDiskFlatVer1BackingInfo backingInfo = new VirtualDiskFlatVer1BackingInfo(); + backingInfo.setDiskMode(((VirtualDiskFlatVer1BackingInfo)parentBacking).getDiskMode()); + backingInfo.setDatastore(morDs); + backingInfo.setFileName(vmdkDatastorePath); + backingInfo.setParent((VirtualDiskFlatVer1BackingInfo)parentBacking); + disk.setBacking(backingInfo); + } else if(parentBacking instanceof VirtualDiskFlatVer2BackingInfo) { + VirtualDiskFlatVer2BackingInfo backingInfo = new VirtualDiskFlatVer2BackingInfo(); + backingInfo.setDiskMode(((VirtualDiskFlatVer2BackingInfo)parentBacking).getDiskMode()); + backingInfo.setDatastore(morDs); + backingInfo.setFileName(vmdkDatastorePath); + backingInfo.setParent((VirtualDiskFlatVer2BackingInfo)parentBacking); + disk.setBacking(backingInfo); + } else if(parentBacking instanceof VirtualDiskRawDiskMappingVer1BackingInfo) { + VirtualDiskRawDiskMappingVer1BackingInfo backingInfo = new VirtualDiskRawDiskMappingVer1BackingInfo(); + backingInfo.setDiskMode(((VirtualDiskRawDiskMappingVer1BackingInfo)parentBacking).getDiskMode()); + backingInfo.setDatastore(morDs); + backingInfo.setFileName(vmdkDatastorePath); + backingInfo.setParent((VirtualDiskRawDiskMappingVer1BackingInfo)parentBacking); + disk.setBacking(backingInfo); + } else if(parentBacking instanceof VirtualDiskSparseVer1BackingInfo) { + VirtualDiskSparseVer1BackingInfo backingInfo = new VirtualDiskSparseVer1BackingInfo(); + backingInfo.setDiskMode(((VirtualDiskSparseVer1BackingInfo)parentBacking).getDiskMode()); + backingInfo.setDatastore(morDs); + backingInfo.setFileName(vmdkDatastorePath); + backingInfo.setParent((VirtualDiskSparseVer1BackingInfo)parentBacking); + disk.setBacking(backingInfo); + } else if(parentBacking instanceof VirtualDiskSparseVer2BackingInfo) { + VirtualDiskSparseVer2BackingInfo backingInfo = new VirtualDiskSparseVer2BackingInfo(); + backingInfo.setDiskMode(((VirtualDiskSparseVer2BackingInfo)parentBacking).getDiskMode()); + backingInfo.setDatastore(morDs); + backingInfo.setFileName(vmdkDatastorePath); + backingInfo.setParent((VirtualDiskSparseVer2BackingInfo)parentBacking); + disk.setBacking(backingInfo); + } else { + throw new Exception("Unsupported disk backing: " + parentBacking.getClass().getCanonicalName()); + } + + if(controllerKey < 0) + controllerKey = vmMo.getIDEDeviceControllerKey(); + disk.setControllerKey(controllerKey); + if(deviceNumber < 0) deviceNumber = vmMo.getNextDeviceNumber(controllerKey); disk.setKey(-contextNumber); @@ -285,19 +285,19 @@ public class VmwareHelper { if(controllerKey < 0) controllerKey = vmMo.getIDEDeviceControllerKey(); - if(deviceNumber < 0) - deviceNumber = vmMo.getNextDeviceNumber(controllerKey); - - disk.setControllerKey(controllerKey); - disk.setKey(-contextNumber); - disk.setUnitNumber(deviceNumber); - - VirtualDeviceConnectInfo connectInfo = new VirtualDeviceConnectInfo(); - connectInfo.setConnected(true); - connectInfo.setStartConnected(true); - disk.setConnectable(connectInfo); - - return disk; + if(deviceNumber < 0) + deviceNumber = vmMo.getNextDeviceNumber(controllerKey); + + disk.setControllerKey(controllerKey); + disk.setKey(-contextNumber); + disk.setUnitNumber(deviceNumber); + + VirtualDeviceConnectInfo connectInfo = new VirtualDeviceConnectInfo(); + connectInfo.setConnected(true); + connectInfo.setStartConnected(true); + disk.setConnectable(connectInfo); + + return disk; } public static VirtualDevice prepareDiskDevice(VirtualMachineMO vmMo, int controllerKey, @@ -339,23 +339,23 @@ public class VmwareHelper { return disk; } - - private static void setParentBackingInfo(VirtualDiskFlatVer2BackingInfo backingInfo, - ManagedObjectReference morDs, String[] parentDatastorePathList) { - - VirtualDiskFlatVer2BackingInfo parentBacking = new VirtualDiskFlatVer2BackingInfo(); - parentBacking.setDatastore(morDs); - parentBacking.setDiskMode(VirtualDiskMode.persistent.toString()); - - if(parentDatastorePathList.length > 1) { - String[] nextDatastorePathList = new String[parentDatastorePathList.length -1]; - for(int i = 0; i < parentDatastorePathList.length -1; i++) - nextDatastorePathList[i] = parentDatastorePathList[i + 1]; - setParentBackingInfo(parentBacking, morDs, nextDatastorePathList); - } - parentBacking.setFileName(parentDatastorePathList[0]); - - backingInfo.setParent(parentBacking); + + private static void setParentBackingInfo(VirtualDiskFlatVer2BackingInfo backingInfo, + ManagedObjectReference morDs, String[] parentDatastorePathList) { + + VirtualDiskFlatVer2BackingInfo parentBacking = new VirtualDiskFlatVer2BackingInfo(); + parentBacking.setDatastore(morDs); + parentBacking.setDiskMode(VirtualDiskMode.persistent.toString()); + + if(parentDatastorePathList.length > 1) { + String[] nextDatastorePathList = new String[parentDatastorePathList.length -1]; + for(int i = 0; i < parentDatastorePathList.length -1; i++) + nextDatastorePathList[i] = parentDatastorePathList[i + 1]; + setParentBackingInfo(parentBacking, morDs, nextDatastorePathList); + } + parentBacking.setFileName(parentDatastorePathList[0]); + + backingInfo.setParent(parentBacking); } private static void setParentBackingInfo(VirtualDiskFlatVer2BackingInfo backingInfo, @@ -375,14 +375,14 @@ public class VmwareHelper { backingInfo.setParent(parentBacking); } - - public static Pair<VirtualDevice, Boolean> prepareIsoDevice(VirtualMachineMO vmMo, String isoDatastorePath, ManagedObjectReference morDs, - boolean connect, boolean connectAtBoot, int deviceNumber, int contextNumber) throws Exception { - - boolean newCdRom = false; - VirtualCdrom cdRom = (VirtualCdrom )vmMo.getIsoDevice(); - if(cdRom == null) { - newCdRom = true; + + public static Pair<VirtualDevice, Boolean> prepareIsoDevice(VirtualMachineMO vmMo, String isoDatastorePath, ManagedObjectReference morDs, + boolean connect, boolean connectAtBoot, int deviceNumber, int contextNumber) throws Exception { + + boolean newCdRom = false; + VirtualCdrom cdRom = (VirtualCdrom )vmMo.getIsoDevice(); + if(cdRom == null) { + newCdRom = true; cdRom = new VirtualCdrom(); assert(vmMo.getIDEDeviceControllerKey() >= 0);
