Return-Path: X-Original-To: apmail-cloudstack-commits-archive@www.apache.org Delivered-To: apmail-cloudstack-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id BE6AB10B36 for ; Wed, 12 Mar 2014 06:29:24 +0000 (UTC) Received: (qmail 6942 invoked by uid 500); 12 Mar 2014 06:29:24 -0000 Delivered-To: apmail-cloudstack-commits-archive@cloudstack.apache.org Received: (qmail 6714 invoked by uid 500); 12 Mar 2014 06:29:22 -0000 Mailing-List: contact commits-help@cloudstack.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@cloudstack.apache.org Delivered-To: mailing list commits@cloudstack.apache.org Received: (qmail 6628 invoked by uid 99); 12 Mar 2014 06:29:19 -0000 Received: from tyr.zones.apache.org (HELO tyr.zones.apache.org) (140.211.11.114) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 12 Mar 2014 06:29:19 +0000 Received: by tyr.zones.apache.org (Postfix, from userid 65534) id 7DCB79415ED; Wed, 12 Mar 2014 06:29:18 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: sateesh@apache.org To: commits@cloudstack.apache.org Message-Id: <17d33425cd71418fa2f3a98a65632164@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: git commit: updated refs/heads/ova-multiple-disks to 140f373 Date: Wed, 12 Mar 2014 06:29:18 +0000 (UTC) Repository: cloudstack Updated Branches: refs/heads/ova-multiple-disks 637b94cfe -> 140f37357 Read OVF template to extract volumes and meta data. Signed-off-by: Sateesh Chodapuneedi Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/140f3735 Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/140f3735 Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/140f3735 Branch: refs/heads/ova-multiple-disks Commit: 140f3735734ed750b3665b6dd0750bf6d26cea4d Parents: 637b94c Author: Sateesh Chodapuneedi Authored: Wed Mar 12 11:56:56 2014 +0530 Committer: Sateesh Chodapuneedi Committed: Wed Mar 12 11:56:56 2014 +0530 ---------------------------------------------------------------------- .../vmware/mo/HypervisorHostHelper.java | 81 ++++++++++++++++++++ 1 file changed, 81 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cloudstack/blob/140f3735/vmware-base/src/com/cloud/hypervisor/vmware/mo/HypervisorHostHelper.java ---------------------------------------------------------------------- diff --git a/vmware-base/src/com/cloud/hypervisor/vmware/mo/HypervisorHostHelper.java b/vmware-base/src/com/cloud/hypervisor/vmware/mo/HypervisorHostHelper.java index 38b68b3..8e2254e 100755 --- a/vmware-base/src/com/cloud/hypervisor/vmware/mo/HypervisorHostHelper.java +++ b/vmware-base/src/com/cloud/hypervisor/vmware/mo/HypervisorHostHelper.java @@ -24,6 +24,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; +import java.util.UUID; import org.apache.log4j.Logger; @@ -56,12 +57,15 @@ import com.vmware.vim25.VMwareDVSConfigSpec; import com.vmware.vim25.VMwareDVSPortSetting; import com.vmware.vim25.VMwareDVSPvlanConfigSpec; import com.vmware.vim25.VMwareDVSPvlanMapEntry; +import com.vmware.vim25.VirtualDevice; import com.vmware.vim25.VirtualDeviceConfigSpec; import com.vmware.vim25.VirtualDeviceConfigSpecOperation; +import com.vmware.vim25.VirtualDisk; import com.vmware.vim25.VirtualLsiLogicController; import com.vmware.vim25.VirtualMachineConfigSpec; import com.vmware.vim25.VirtualMachineFileInfo; import com.vmware.vim25.VirtualMachineGuestOsIdentifier; +import com.vmware.vim25.VirtualMachineImportSpec; import com.vmware.vim25.VirtualMachineVideoCard; import com.vmware.vim25.VirtualSCSISharing; import com.vmware.vim25.VmwareDistributedVirtualSwitchPvlanSpec; @@ -74,6 +78,7 @@ import com.cloud.hypervisor.vmware.util.VmwareHelper; import com.cloud.network.Networks.BroadcastDomainType; import com.cloud.utils.ActionDelegate; import com.cloud.utils.Pair; +import com.cloud.utils.Ternary; import com.cloud.utils.cisco.n1kv.vsm.NetconfHelper; import com.cloud.utils.cisco.n1kv.vsm.PolicyMap; import com.cloud.utils.cisco.n1kv.vsm.PortProfile; @@ -92,6 +97,7 @@ public class HypervisorHostHelper { // make vmware-base loosely coupled with cloud-specific stuff, duplicate VLAN.UNTAGGED constant here private static final String UNTAGGED_VLAN_NAME = "untagged"; + private static final String VMDK_PACK_DIR = "ova"; public static VirtualMachineMO findVmFromObjectContent(VmwareContext context, ObjectContent[] ocs, String name, String instanceNameCustomField) { @@ -1174,6 +1180,81 @@ public class HypervisorHostHelper { return false; } + public static List> readOVF(VmwareHypervisorHost host, String ovfFilePath, DatastoreMO dsMo, ManagedObjectReference morRp, + ManagedObjectReference morHost) throws Exception { + + assert (morRp != null); + + String importEntityName = UUID.randomUUID().toString(); + OvfCreateImportSpecParams importSpecParams = new OvfCreateImportSpecParams(); + importSpecParams.setHostSystem(morHost); + importSpecParams.setLocale("US"); + importSpecParams.setEntityName(importEntityName); + importSpecParams.setDeploymentOption(""); + + String ovfDescriptor = HttpNfcLeaseMO.readOvfContent(ovfFilePath); + VmwareContext context = host.getContext(); + OvfCreateImportSpecResult ovfImportResult = + context.getService().createImportSpec(context.getServiceContent().getOvfManager(), ovfDescriptor, morRp, dsMo.getMor(), importSpecParams); + + if (ovfImportResult == null) { + String msg = "createImportSpec() failed. ovfFilePath: " + ovfFilePath; + s_logger.error(msg); + throw new Exception(msg); + } + + if(!ovfImportResult.getError().isEmpty()) { + for (LocalizedMethodFault fault : ovfImportResult.getError()) { + s_logger.error("createImportSpec error: " + fault.getLocalizedMessage()); + } + throw new CloudException("Failed to create an import spec from " + ovfFilePath + ". Check log for details."); + } + + if (!ovfImportResult.getWarning().isEmpty()) { + for (LocalizedMethodFault fault : ovfImportResult.getError()) { + s_logger.warn("createImportSpec warning: " + fault.getLocalizedMessage()); + } + } + + VirtualMachineImportSpec importSpec = new VirtualMachineImportSpec(); + importSpec = (VirtualMachineImportSpec)ovfImportResult.getImportSpec(); + if (importSpec == null) { + String msg = "createImportSpec() failed to create import specification for OVF template at " + ovfFilePath; + s_logger.error(msg); + throw new Exception(msg); + } + + File ovfFile = new File(ovfFilePath); + int diskCount = 0; + long sizeKb = 0; + List> ovfVolumeInfos = new ArrayList>(); + Ternary ovfVolumeInfo = null; + List files = new ArrayList(); + String absFile = null; + + for (OvfFileItem ovfFileItem : ovfImportResult.getFileItem()) { + absFile = ovfFile.getParent() + File.separator + ovfFileItem.getPath(); + files.add(absFile); + } + + boolean lookForFirstDisk = true; + Boolean osDisk = true; + List deviceConfigList = importSpec.getConfigSpec().getDeviceChange(); + for (VirtualDeviceConfigSpec deviceSpec : deviceConfigList) { + VirtualDevice device = deviceSpec.getDevice(); + if (device instanceof VirtualDisk) { + sizeKb = ((VirtualDisk)device).getCapacityInKB(); + if (lookForFirstDisk && diskCount == 0) { + osDisk = true; + diskCount++; + } + ovfVolumeInfo = new Ternary(files.get(diskCount), sizeKb, osDisk); + ovfVolumeInfos.add(ovfVolumeInfo); + } + } + return ovfVolumeInfos; + } + public static VirtualMachineMO createWorkerVM(VmwareHypervisorHost hyperHost, DatastoreMO dsMo, String vmName) throws Exception { // Allow worker VM to float within cluster so that we will have better chance to