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();