diff --git a/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java b/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java index 290130010fd..dbcb830e4e2 100644 --- a/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java +++ b/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java @@ -940,13 +940,14 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv String secondaryStorageUrl = cmd.getSecondaryStorageURL(); StoragePool primaryPool = null; Connect conn; + StoragePool secondaryStoragePool = null; try { conn = LibvirtConnection.getConnection(); primaryPool = _storageResource.getStoragePool(conn, pool.getUuid()); LibvirtStoragePoolDef primary = _storageResource.getStoragePoolDef(conn, primaryPool); String primaryMountPath = primary.getTargetPath(); - StoragePool secondaryStoragePool = _storageResource.getStoragePoolbyURI(conn, new URI(secondaryStorageUrl)); + secondaryStoragePool = _storageResource.getStoragePoolbyURI(conn, new URI(secondaryStorageUrl)); LibvirtStoragePoolDef spd = _storageResource.getStoragePoolDef(conn, secondaryStoragePool); String ssPmountPath = spd.getTargetPath(); @@ -955,10 +956,10 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv if (copyToSecondary) { StorageVol volume = _storageResource.getVolume(conn, primaryPool, volumePath); String volumeDestPath = ssPmountPath + File.separator + "volumes/" + cmd.getVolumeId() + File.separator; - _storageResource.copyVolume(volumePath, volumeDestPath, volumeName, _cmdsTimeout); + _storageResource.copyVolume(volumePath, volumeDestPath, volumeName + ".qcow2", _cmdsTimeout); return new CopyVolumeAnswer(cmd, true, null, null, volumeName); } else { - volumePath = ssPmountPath + File.separator + "volumes/" + cmd.getVolumeId() + File.separator + volumePath; + volumePath = ssPmountPath + File.separator + "volumes/" + cmd.getVolumeId() + File.separator + volumePath + ".qcow2"; _storageResource.copyVolume(volumePath, primaryMountPath, volumeName, _cmdsTimeout); return new CopyVolumeAnswer(cmd, true, null, null, primaryMountPath + File.separator + volumeName); } diff --git a/agent/src/com/cloud/agent/resource/computing/LibvirtStorageResource.java b/agent/src/com/cloud/agent/resource/computing/LibvirtStorageResource.java index 4143d01548c..2388abda8c4 100644 --- a/agent/src/com/cloud/agent/resource/computing/LibvirtStorageResource.java +++ b/agent/src/com/cloud/agent/resource/computing/LibvirtStorageResource.java @@ -391,12 +391,15 @@ public class LibvirtStorageResource { if (!_storageLayer.exists(srcPath)) { throw new InternalErrorException("volume:" + srcPath + " is not exits"); } - String result = Script.runSimpleBashScript("cp " + srcPath + " " + destPath + File.separator + volumeName, timeout); + destPath = destPath + File.separator + volumeName; + String result = Script.runSimpleBashScript("qemu-img convert " + srcPath + " " + destPath, timeout); if (result != null) { return false; } else { - return true; + result = Script.runSimpleBashScript("chmod 777 " + destPath); + return true; } + } public LibvirtStoragePoolDef getStoragePoolDef(Connect conn, StoragePool pool) throws LibvirtException { diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index 527af610ff6..3bb389bf4c9 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -4375,7 +4375,7 @@ public class ManagementServerImpl implements ManagementServer { _uploadMonitor.extractVolume(uploadJob, sserver, volume, url, zoneId, volumeLocalPath, cmd.getStartEventId(), job.getId(), _asyncMgr); return uploadJob.getId(); } else { // Volume is copied now make it visible under apache and create a URL. - _uploadMonitor.createVolumeDownloadURL(volumeId, volumeLocalPath, Upload.Type.VOLUME, zoneId, uploadJob.getId()); + _uploadMonitor.createVolumeDownloadURL(volumeId, volumeLocalPath, Upload.Type.VOLUME, zoneId, uploadJob.getId(), getFormatForPool(srcPool)); return uploadJob.getId(); } } diff --git a/server/src/com/cloud/storage/upload/UploadMonitor.java b/server/src/com/cloud/storage/upload/UploadMonitor.java index 57144b9f346..8dbd51ee3af 100755 --- a/server/src/com/cloud/storage/upload/UploadMonitor.java +++ b/server/src/com/cloud/storage/upload/UploadMonitor.java @@ -56,6 +56,6 @@ public interface UploadMonitor extends Manager{ VMTemplateHostVO vmTemplateHost, Long dataCenterId, long eventId); void createVolumeDownloadURL(Long entityId, String path, Type type, - Long dataCenterId, Long uploadId); + Long dataCenterId, Long uploadId, String volType); } \ No newline at end of file diff --git a/server/src/com/cloud/storage/upload/UploadMonitorImpl.java b/server/src/com/cloud/storage/upload/UploadMonitorImpl.java index 5eabeced5e8..ac252af8359 100755 --- a/server/src/com/cloud/storage/upload/UploadMonitorImpl.java +++ b/server/src/com/cloud/storage/upload/UploadMonitorImpl.java @@ -259,7 +259,7 @@ public class UploadMonitorImpl implements UploadMonitor { } @Override - public void createVolumeDownloadURL(Long entityId, String path, Type type, Long dataCenterId, Long uploadId) { + public void createVolumeDownloadURL(Long entityId, String path, Type type, Long dataCenterId, Long uploadId, String volType) { String errorString = ""; boolean success = false; @@ -282,7 +282,7 @@ public class UploadMonitorImpl implements UploadMonitor { throw new CloudRuntimeException(errorString); } // Create Symlink at ssvm - String uuid = UUID.randomUUID().toString() + path.substring(path.length() - 4) ; // last 4 characters of the path specify the format like .vhd + String uuid = UUID.randomUUID().toString() + "." + volType ; HostVO secStorage = ApiDBUtils.findHostById(ApiDBUtils.findUploadById(uploadId).getHostId()); HostVO ssvm = _agentMgr.getSSAgent(secStorage); if( ssvm == null ) {