From e59420c5146387977530b4720e6ec7dd7a83703c Mon Sep 17 00:00:00 2001 From: Devdeep Singh Date: Fri, 3 Jan 2014 16:43:21 +0530 Subject: [PATCH] CLOUDSTACK-5691: Fix for attaching an uploaded volume to instance running on hyperv. There were multiple issues here. Upload volume was actually failing because the post download check for vhd on the cifs share was unsuccessful. Also the agent code wasn't parsing the volume path correctly. Fixed it too. --- .../HypervResource/CloudStackTypes.cs | 9 ++++++-- scripts/storage/secondary/createvolume.sh | 23 ++++++++++++++----- server/src/com/cloud/api/ApiDBUtils.java | 15 ++++++++++-- .../api/query/dao/VolumeJoinDaoImpl.java | 4 ++-- 4 files changed, 39 insertions(+), 12 deletions(-) diff --git a/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/CloudStackTypes.cs b/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/CloudStackTypes.cs index f8ca49e1927..020f761aa93 100644 --- a/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/CloudStackTypes.cs +++ b/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/CloudStackTypes.cs @@ -173,7 +173,12 @@ namespace HypervResource { fileName += @"\" + this.path; } - fileName = Utils.NormalizePath(fileName + @"\" + this.name); + + fileName = Utils.NormalizePath(fileName); + if (Directory.Exists(fileName)) + { + fileName = Utils.NormalizePath(fileName + @"\" + this.name); + } } else { @@ -182,7 +187,7 @@ namespace HypervResource throw new InvalidDataException(errMsg); } - if (this.format != null) + if (!Path.HasExtension(fileName) && this.format != null) { fileName = fileName + "." + this.format.ToLowerInvariant(); } diff --git a/scripts/storage/secondary/createvolume.sh b/scripts/storage/secondary/createvolume.sh index f11df1d7c67..8cbccc66e19 100755 --- a/scripts/storage/secondary/createvolume.sh +++ b/scripts/storage/secondary/createvolume.sh @@ -111,6 +111,14 @@ uncompress() { return 0 } +isCifs() { + #TO:DO incase of multiple zone where cifs and nfs exists, + #then check if the template file is from cifs using df -P filename + #Currently only cifs is supported in hyperv zone. + mount | grep "type cifs" > /dev/null + echo $? +} + create_from_file() { local tmpltfs=$1 local tmpltimg=$2 @@ -196,12 +204,15 @@ rollback_if_needed $tmpltfs $? "tar archives not supported\n" if [ ${tmpltname%.vhd} != ${tmpltname} ] then - if which vhd-util &>/dev/null - then - vhd-util check -n ${tmpltimg2} > /dev/null - rollback_if_needed $tmpltfs $? "vhd check of $tmpltimg2 failed\n" - vhd-util set -n ${tmpltimg2} -f "hidden" -v "0" > /dev/null - rollback_if_needed $tmpltfs $? "vhd remove $tmpltimg2 hidden failed\n" + if [ isCifs -ne 0 ] ; + then + if which vhd-util &>/dev/null + then + vhd-util check -n ${tmpltimg2} > /dev/null + rollback_if_needed $tmpltfs $? "vhd check of $tmpltimg2 failed\n" + vhd-util set -n ${tmpltimg2} -f "hidden" -v "0" > /dev/null + rollback_if_needed $tmpltfs $? "vhd remove $tmpltimg2 hidden failed\n" + fi fi fi diff --git a/server/src/com/cloud/api/ApiDBUtils.java b/server/src/com/cloud/api/ApiDBUtils.java index 8c59ce65370..3bdb2e6e032 100755 --- a/server/src/com/cloud/api/ApiDBUtils.java +++ b/server/src/com/cloud/api/ApiDBUtils.java @@ -1054,8 +1054,19 @@ public class ApiDBUtils { return s_volumeDao.getHypervisorType(volumeId); } - public static HypervisorType getHypervisorTypeFromFormat(ImageFormat format) { - return s_storageMgr.getHypervisorTypeFromFormat(format); + public static HypervisorType getHypervisorTypeFromFormat(long dcId, ImageFormat format){ + HypervisorType type = s_storageMgr.getHypervisorTypeFromFormat(format); + if (format == ImageFormat.VHD) { + // Xenserver and Hyperv both support vhd format. Additionally hyperv is only supported + // in a dc/zone if there aren't any other hypervisor types present in the zone). If the + // format type is VHD check is any xenserver clusters are present. If not, we assume it + // is a hyperv zone and update the type. + List xenClusters = s_clusterDao.listByDcHyType(dcId, HypervisorType.XenServer.toString()); + if (xenClusters.isEmpty()) { + type = HypervisorType.Hyperv; + } + } + return type; } public static List listUserStatsBy(Long accountId) { diff --git a/server/src/com/cloud/api/query/dao/VolumeJoinDaoImpl.java b/server/src/com/cloud/api/query/dao/VolumeJoinDaoImpl.java index a8631f781ed..3604883c4ea 100644 --- a/server/src/com/cloud/api/query/dao/VolumeJoinDaoImpl.java +++ b/server/src/com/cloud/api/query/dao/VolumeJoinDaoImpl.java @@ -111,7 +111,7 @@ public class VolumeJoinDaoImpl extends GenericDaoBase implem volResponse.setCreated(volume.getCreatedOnStore()); if (caller.getType() == Account.ACCOUNT_TYPE_ADMIN || caller.getType() == Account.ACCOUNT_TYPE_RESOURCE_DOMAIN_ADMIN) - volResponse.setHypervisor(ApiDBUtils.getHypervisorTypeFromFormat(volume.getFormat()).toString()); + volResponse.setHypervisor(ApiDBUtils.getHypervisorTypeFromFormat(volume.getDataCenterId(), volume.getFormat()).toString()); if (volume.getDownloadState() != Status.DOWNLOADED) { String volumeStatus = "Processing"; if (volume.getDownloadState() == VMTemplateHostVO.Status.DOWNLOAD_IN_PROGRESS) { @@ -175,7 +175,7 @@ public class VolumeJoinDaoImpl extends GenericDaoBase implem if (volume.getHypervisorType() != null) { volResponse.setHypervisor(volume.getHypervisorType().toString()); } else { - volResponse.setHypervisor(ApiDBUtils.getHypervisorTypeFromFormat(volume.getFormat()).toString()); + volResponse.setHypervisor(ApiDBUtils.getHypervisorTypeFromFormat(volume.getDataCenterId(), volume.getFormat()).toString()); } } Long poolId = volume.getPoolId();