Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id 55C6C200D5E for ; Sat, 23 Dec 2017 13:45:06 +0100 (CET) Received: by cust-asf.ponee.io (Postfix) id 5499F160C1C; Sat, 23 Dec 2017 12:45:06 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id 722E8160C0E for ; Sat, 23 Dec 2017 13:45:05 +0100 (CET) Received: (qmail 69007 invoked by uid 500); 23 Dec 2017 12:45:04 -0000 Mailing-List: contact issues-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 issues@cloudstack.apache.org Received: (qmail 68998 invoked by uid 500); 23 Dec 2017 12:45:04 -0000 Delivered-To: apmail-incubator-cloudstack-issues@incubator.apache.org Received: (qmail 68995 invoked by uid 99); 23 Dec 2017 12:45:04 -0000 Received: from pnap-us-west-generic-nat.apache.org (HELO spamd3-us-west.apache.org) (209.188.14.142) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 23 Dec 2017 12:45:04 +0000 Received: from localhost (localhost [127.0.0.1]) by spamd3-us-west.apache.org (ASF Mail Server at spamd3-us-west.apache.org) with ESMTP id 1ED31180A23 for ; Sat, 23 Dec 2017 12:45:04 +0000 (UTC) X-Virus-Scanned: Debian amavisd-new at spamd3-us-west.apache.org X-Spam-Flag: NO X-Spam-Score: -99.202 X-Spam-Level: X-Spam-Status: No, score=-99.202 tagged_above=-999 required=6.31 tests=[KAM_ASCII_DIVIDERS=0.8, RCVD_IN_DNSWL_NONE=-0.0001, RP_MATCHES_RCVD=-0.001, SPF_PASS=-0.001, USER_IN_WHITELIST=-100] autolearn=disabled Received: from mx1-lw-eu.apache.org ([10.40.0.8]) by localhost (spamd3-us-west.apache.org [10.40.0.10]) (amavisd-new, port 10024) with ESMTP id pCTD1ZePkiwM for ; Sat, 23 Dec 2017 12:45:02 +0000 (UTC) Received: from mailrelay1-us-west.apache.org (mailrelay1-us-west.apache.org [209.188.14.139]) by mx1-lw-eu.apache.org (ASF Mail Server at mx1-lw-eu.apache.org) with ESMTP id 5E1BB5F201 for ; Sat, 23 Dec 2017 12:45:01 +0000 (UTC) Received: from jira-lw-us.apache.org (unknown [207.244.88.139]) by mailrelay1-us-west.apache.org (ASF Mail Server at mailrelay1-us-west.apache.org) with ESMTP id 997D4E0E4C for ; Sat, 23 Dec 2017 12:45:00 +0000 (UTC) Received: from jira-lw-us.apache.org (localhost [127.0.0.1]) by jira-lw-us.apache.org (ASF Mail Server at jira-lw-us.apache.org) with ESMTP id 2E2BC240DA for ; Sat, 23 Dec 2017 12:45:00 +0000 (UTC) Date: Sat, 23 Dec 2017 12:45:00 +0000 (UTC) From: "ASF GitHub Bot (JIRA)" To: cloudstack-issues@incubator.apache.org Message-ID: In-Reply-To: References: Subject: [jira] [Commented] (CLOUDSTACK-4757) Support OVA files with multiple disks for templates MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-JIRA-FingerPrint: 30527f35849b9dde25b450d4833f0394 archived-at: Sat, 23 Dec 2017 12:45:06 -0000 [ https://issues.apache.org/jira/browse/CLOUDSTACK-4757?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16302399#comment-16302399 ] ASF GitHub Bot commented on CLOUDSTACK-4757: -------------------------------------------- rafaelweingartner commented on a change in pull request #2146: CLOUDSTACK-4757: Support OVA files with multiple disks for templates URL: https://github.com/apache/cloudstack/pull/2146#discussion_r158581849 ########## File path: engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java ########## @@ -691,6 +723,151 @@ protected Void createTemplateCallback(AsyncCallbackDispatcher dataDiskTemplates = new ArrayList(); + ImageStoreEntity tmpltStore = (ImageStoreEntity)parentTemplate.getDataStore(); + dataDiskTemplates = tmpltStore.getDataDiskTemplates(parentTemplate); + s_logger.error("MDOVA createDataDiskTemplates Found " + dataDiskTemplates.size() + " Datadisk template(s) for template: " + parentTemplate.getId()); + int diskCount = 0; + VMTemplateVO templateVO = _templateDao.findById(parentTemplate.getId()); + DataStore imageStore = parentTemplate.getDataStore(); + Map details = new HashMap(); + for (DatadiskTO diskTemplate : dataDiskTemplates) { + if (!diskTemplate.isBootable()) { + createChildDataDiskTemplate(diskTemplate, templateVO, parentTemplate, imageStore, diskCount++); + if (!diskTemplate.isIso() && details.get(VmDetailConstants.DATA_DISK_CONTROLLER) == null){ + details.put(VmDetailConstants.DATA_DISK_CONTROLLER, getDiskControllerDetails(diskTemplate)); + details.put(VmDetailConstants.DATA_DISK_CONTROLLER + diskTemplate.getDiskId(), getDiskControllerDetails(diskTemplate)); + } + } else { + finalizeParentTemplate(diskTemplate, templateVO, parentTemplate, imageStore, diskCount++); + details.put(VmDetailConstants.ROOT_DISK_CONTROLLER, getDiskControllerDetails(diskTemplate)); + } + } + templateVO.setDetails(details); + _templateDao.saveDetails(templateVO); + return true; + } + + private boolean createChildDataDiskTemplate(DatadiskTO dataDiskTemplate, VMTemplateVO template, TemplateInfo parentTemplate, DataStore imageStore, int diskCount) { + // Make an entry in vm_template table + Storage.ImageFormat format = dataDiskTemplate.isIso() ? Storage.ImageFormat.ISO : template.getFormat(); + String suffix = dataDiskTemplate.isIso() ? "-IsoDiskTemplate-" : "-DataDiskTemplate-"; + TemplateType ttype = dataDiskTemplate.isIso() ? TemplateType.ISODISK : TemplateType.DATADISK; + final long templateId = _templateDao.getNextInSequence(Long.class, "id"); + long guestOsId = dataDiskTemplate.isIso() ? 1 : 0; + String templateName = dataDiskTemplate.isIso() ? dataDiskTemplate.getPath().substring(dataDiskTemplate.getPath().lastIndexOf(File.separator) + 1) : template.getName() + suffix + diskCount; + VMTemplateVO templateVO = new VMTemplateVO(templateId, templateName, format, false, false, false, ttype, template.getUrl(), + template.requiresHvm(), template.getBits(), template.getAccountId(), null, templateName, false, guestOsId, false, template.getHypervisorType(), null, + null, false, false); + if (dataDiskTemplate.isIso()){ + templateVO.setUniqueName(templateName); + } + templateVO.setParentTemplateId(template.getId()); + templateVO.setSize(dataDiskTemplate.getVirtualSize()); + templateVO = _templateDao.persist(templateVO); + // Make sync call to create Datadisk templates in image store + TemplateApiResult result = null; + TemplateInfo dataDiskTemplateInfo = imageFactory.getTemplate(templateVO.getId(), imageStore); + AsyncCallFuture future = createDatadiskTemplateAsync(parentTemplate, dataDiskTemplateInfo, dataDiskTemplate.getPath(), dataDiskTemplate.getDiskId(), + dataDiskTemplate.getFileSize(), dataDiskTemplate.isBootable()); + try { + result = future.get(); + if (result.isSuccess()) { + // Make an entry in template_zone_ref table + if (imageStore.getScope().getScopeType() == ScopeType.REGION) { + associateTemplateToZone(templateId, null); + } else if (imageStore.getScope().getScopeType() == ScopeType.ZONE) { + Long zoneId = ((ImageStoreEntity)imageStore).getDataCenterId(); + VMTemplateZoneVO templateZone = new VMTemplateZoneVO(zoneId, templateId, new Date()); + _vmTemplateZoneDao.persist(templateZone); + } + _resourceLimitMgr.incrementResourceCount(template.getAccountId(), ResourceType.secondary_storage, templateVO.getSize()); + } else { + s_logger.error("MDOVA createDataDiskTemplates Creation of Datadisk: " + templateVO.getId() + " failed: " + result.getResult()); + // Delete the Datadisk templates that were already created as they are now invalid + s_logger.debug("Since creation of Datadisk template: " + templateVO.getId() + " failed, delete other Datadisk templates that were created as part of parent" + + " template download"); + TemplateInfo parentTemplateInfo = imageFactory.getTemplate(templateVO.getParentTemplateId(), imageStore); + cleanupDatadiskTemplates(parentTemplateInfo); + } + return result.isSuccess(); + } catch (Exception e) { + s_logger.error("Creation of Datadisk: " + templateVO.getId() + " failed: " + result.getResult(), e); + return false; + } + } + + private boolean finalizeParentTemplate(DatadiskTO dataDiskTemplate, VMTemplateVO templateVO, TemplateInfo parentTemplate, DataStore imageStore, int diskCount) { + TemplateInfo templateInfo = imageFactory.getTemplate(templateVO.getId(), imageStore); + AsyncCallFuture templateFuture = createDatadiskTemplateAsync(parentTemplate, templateInfo, dataDiskTemplate.getPath(), dataDiskTemplate.getDiskId(), + dataDiskTemplate.getFileSize(), dataDiskTemplate.isBootable()); + TemplateApiResult result = null; + try { + result = templateFuture.get(); + if (!result.isSuccess()) { + s_logger.debug("Since creation of parent template: " + templateInfo.getId() + " failed, delete Datadisk templates that were created as part of parent" + + " template download"); + cleanupDatadiskTemplates(templateInfo); + } + return result.isSuccess(); + } catch (Exception e) { + s_logger.error("Creation of template: " + templateVO.getId() + " failed: " + result.getResult(), e); + return false; + } + } + + private String getDiskControllerDetails(DatadiskTO diskTemplate) { + String controller = diskTemplate.getDiskController() ; + String controlerSubType = diskTemplate.getDiskControllerSubType(); + if (controller != null) { Review comment: What about reducing the cyclomatic complexity here? These statement can be made flat here. ---------------------------------------------------------------- This is an automated message from the Apache Git Service. To respond to the message, please log on GitHub and use the URL above to go to the specific comment. For queries about this service, please contact Infrastructure at: users@infra.apache.org > Support OVA files with multiple disks for templates > --------------------------------------------------- > > Key: CLOUDSTACK-4757 > URL: https://issues.apache.org/jira/browse/CLOUDSTACK-4757 > Project: CloudStack > Issue Type: New Feature > Security Level: Public(Anyone can view this level - this is the default.) > Components: Storage Controller > Reporter: Likitha Shetty > Assignee: Nicolas Vazquez > Priority: Minor > Fix For: Future > > > CloudStack volumes and templates are one single virtual disk in case of XenServer/XCP and KVM hypervisors since the files used for templates and volumes are virtual disks (VHD, QCOW2). However, VMware volumes and templates are in OVA format, which are archives that can contain a complete VM including multiple VMDKs and other files such as ISOs. And currently, Cloudstack only supports Template creation based on OVA files containing a single disk. If a user creates a template from a OVA file containing more than 1 disk and launches an instance using this template, only the first disk is attached to the new instance and other disks are ignored. > Similarly with uploaded volumes, attaching an uploaded volume that contains multiple disks to a VM will result in only one VMDK to being attached to the VM. > This behavior needs to be improved in VMWare to support OVA files with multiple disks for both uploaded volumes and templates. i.e. If a user creates a template from a OVA file containing more than 1 disk and launches an instance using this template, the first disk should be attached to the new instance as the ROOT disk and volumes should be created based on other VMDK disks in the OVA file and should be attached to the instance. -- This message was sent by Atlassian JIRA (v6.4.14#64029)