diff --git a/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java b/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java index 4d9ceb4bfee..4a99e892251 100644 --- a/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java +++ b/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java @@ -996,15 +996,19 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv String volumeName = UUID.randomUUID().toString(); if (copyToSecondary) { + String destVolumeName = volumeName + ".qcow2"; KVMPhysicalDisk volume = primaryPool.getPhysicalDisk(cmd.getVolumePath()); String volumeDestPath = "/volumes/" + cmd.getVolumeId() + File.separator; + secondaryStoragePool = _storagePoolMgr.getStoragePoolByURI(secondaryStorageUrl); + secondaryStoragePool.createFolder(volumeDestPath); + secondaryStoragePool.delete(); secondaryStoragePool = _storagePoolMgr.getStoragePoolByURI(secondaryStorageUrl + volumeDestPath); - _storagePoolMgr.copyPhysicalDisk(volume, volumeName, secondaryStoragePool); + _storagePoolMgr.copyPhysicalDisk(volume, destVolumeName, secondaryStoragePool); return new CopyVolumeAnswer(cmd, true, null, null, volumeName); } else { - volumePath = "/volumes/" + cmd.getVolumeId() + File.separator + volumePath; + volumePath = "/volumes/" + cmd.getVolumeId() + File.separator; secondaryStoragePool = _storagePoolMgr.getStoragePoolByURI(secondaryStorageUrl + volumePath); - KVMPhysicalDisk volume = secondaryStoragePool.getPhysicalDisk(cmd.getVolumePath()); + KVMPhysicalDisk volume = secondaryStoragePool.getPhysicalDisk(cmd.getVolumePath() + ".qcow2"); _storagePoolMgr.copyPhysicalDisk(volume, volumeName, primaryPool); return new CopyVolumeAnswer(cmd, true, null, null, volumeName); } diff --git a/agent/src/com/cloud/agent/resource/computing/LibvirtStorageVolumeDef.java b/agent/src/com/cloud/agent/resource/computing/LibvirtStorageVolumeDef.java index 7fc6a0df993..11b697dd0cb 100644 --- a/agent/src/com/cloud/agent/resource/computing/LibvirtStorageVolumeDef.java +++ b/agent/src/com/cloud/agent/resource/computing/LibvirtStorageVolumeDef.java @@ -71,6 +71,9 @@ public class LibvirtStorageVolumeDef { } storageVolBuilder.append("\n"); storageVolBuilder.append("\n"); + storageVolBuilder.append(""); + storageVolBuilder.append("0744"); + storageVolBuilder.append(""); storageVolBuilder.append("\n"); if (_backingPath != null) { storageVolBuilder.append("\n"); diff --git a/agent/src/com/cloud/agent/storage/KVMStoragePool.java b/agent/src/com/cloud/agent/storage/KVMStoragePool.java index 7bdbb2a6a9a..36a088f1610 100644 --- a/agent/src/com/cloud/agent/storage/KVMStoragePool.java +++ b/agent/src/com/cloud/agent/storage/KVMStoragePool.java @@ -20,4 +20,5 @@ public interface KVMStoragePool { public StoragePoolType getType(); public boolean delete(); PhysicalDiskFormat getDefaultFormat(); + public boolean createFolder(String path); } diff --git a/agent/src/com/cloud/agent/storage/KVMStoragePoolManager.java b/agent/src/com/cloud/agent/storage/KVMStoragePoolManager.java index 6e10ce8eed3..99e62d9aaf2 100644 --- a/agent/src/com/cloud/agent/storage/KVMStoragePoolManager.java +++ b/agent/src/com/cloud/agent/storage/KVMStoragePoolManager.java @@ -74,6 +74,4 @@ public class KVMStoragePoolManager { public KVMPhysicalDisk getPhysicalDiskFromUrl(String url) { return this._storageAdaptor.getPhysicalDiskFromURI(url); } - - } diff --git a/agent/src/com/cloud/agent/storage/LibvirtStorageAdaptor.java b/agent/src/com/cloud/agent/storage/LibvirtStorageAdaptor.java index e729220be3b..5d6bde44f74 100644 --- a/agent/src/com/cloud/agent/storage/LibvirtStorageAdaptor.java +++ b/agent/src/com/cloud/agent/storage/LibvirtStorageAdaptor.java @@ -60,6 +60,15 @@ public class LibvirtStorageAdaptor implements StorageAdaptor { _manageSnapshotPath = Script.findScript("scripts/storage/qcow2/", "managesnapshot.sh"); } + @Override + public boolean createFolder(String uuid, String path) { + String mountPoint = _mountPoint + File.separator + uuid; + File f = new File(mountPoint + path); + if (!f.exists()) { + f.mkdirs(); + } + return true; + } public StorageVol getVolume(StoragePool pool, String volName) { StorageVol vol = null; @@ -590,7 +599,6 @@ public class LibvirtStorageAdaptor implements StorageAdaptor { String destPath = newDisk.getPath(); Script.runSimpleBashScript("qemu-img convert -f " + disk.getFormat() + " -O " + newDisk.getFormat() + " " + sourcePath + " " + destPath); - return newDisk; } @@ -658,5 +666,7 @@ public class LibvirtStorageAdaptor implements StorageAdaptor { return true; } + + } diff --git a/agent/src/com/cloud/agent/storage/LibvirtStoragePool.java b/agent/src/com/cloud/agent/storage/LibvirtStoragePool.java index cefd93d69aa..7c9cb302959 100644 --- a/agent/src/com/cloud/agent/storage/LibvirtStoragePool.java +++ b/agent/src/com/cloud/agent/storage/LibvirtStoragePool.java @@ -134,4 +134,9 @@ public class LibvirtStoragePool implements KVMStoragePool { public boolean delete() { return this._storageAdaptor.deleteStoragePool(this); } + + @Override + public boolean createFolder(String path) { + return this._storageAdaptor.createFolder(this.uuid, path); + } } diff --git a/agent/src/com/cloud/agent/storage/StorageAdaptor.java b/agent/src/com/cloud/agent/storage/StorageAdaptor.java index c966c6ad1b5..f99717a6480 100644 --- a/agent/src/com/cloud/agent/storage/StorageAdaptor.java +++ b/agent/src/com/cloud/agent/storage/StorageAdaptor.java @@ -2,6 +2,8 @@ package com.cloud.agent.storage; import java.util.List; +import org.libvirt.StoragePool; + import com.cloud.agent.storage.KVMPhysicalDisk.PhysicalDiskFormat; import com.cloud.storage.Storage.StoragePoolType; @@ -22,5 +24,6 @@ public interface StorageAdaptor { public KVMPhysicalDisk getPhysicalDiskFromURI(String uri); public boolean refresh(KVMStoragePool pool); public boolean deleteStoragePool(KVMStoragePool pool); + public boolean createFolder(String uuid, String path); }