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.
This commit is contained in:
Devdeep Singh 2014-01-03 16:43:21 +05:30
parent 77878299fb
commit e59420c514
4 changed files with 39 additions and 12 deletions

View File

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

View File

@ -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

View File

@ -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<ClusterVO> xenClusters = s_clusterDao.listByDcHyType(dcId, HypervisorType.XenServer.toString());
if (xenClusters.isEmpty()) {
type = HypervisorType.Hyperv;
}
}
return type;
}
public static List<UserStatisticsVO> listUserStatsBy(Long accountId) {

View File

@ -111,7 +111,7 @@ public class VolumeJoinDaoImpl extends GenericDaoBase<VolumeJoinVO, Long> 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<VolumeJoinVO, Long> 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();