CLOUDSTACK-4424: Download RBD volume created from snapshot

This failed due to a RAW -> QCOW2 conversion (again).

The current code still makes to much assumptions about everything always
being QCOW2 while that is not always true.
This commit is contained in:
Wido den Hollander 2013-08-23 11:21:26 +02:00 committed by Wido den Hollander
parent 658844ea99
commit fb9ceba93b
3 changed files with 32 additions and 21 deletions

View File

@ -27,7 +27,11 @@ public class KVMPhysicalDisk {
String rbdOpts;
rbdOpts = "rbd:" + image;
rbdOpts += ":mon_host=" + monHost + "\\\\:" + monPort;
rbdOpts += ":mon_host=" + monHost;
if (monPort != 6789) {
rbdOpts += "\\\\:" + monPort;
}
if (authUserName == null) {
rbdOpts += ":auth_supported=none";
} else {

View File

@ -375,6 +375,10 @@ public class KVMStorageProcessor implements StorageProcessor {
public Answer copyVolumeFromPrimaryToSecondary(CopyCommand cmd) {
DataTO srcData = cmd.getSrcTO();
DataTO destData = cmd.getDestTO();
VolumeObjectTO srcVol = (VolumeObjectTO) srcData;
VolumeObjectTO destVol = (VolumeObjectTO) destData;
ImageFormat srcFormat = srcVol.getFormat();
ImageFormat destFormat = destVol.getFormat();
DataStoreTO srcStore = srcData.getDataStore();
DataStoreTO destStore = destData.getDataStore();
PrimaryDataStoreTO primaryStore = (PrimaryDataStoreTO) srcStore;
@ -405,9 +409,9 @@ public class KVMStorageProcessor implements StorageProcessor {
String volumeName = UUID.randomUUID().toString();
String destVolumeName = volumeName + ".qcow2";
String destVolumeName = volumeName + "." + destFormat.getFileExtension();
KVMPhysicalDisk volume = primaryPool.getPhysicalDisk(srcVolumePath);
volume.setFormat(PhysicalDiskFormat.valueOf(srcFormat.toString()));
secondaryStoragePool = storagePoolMgr.getStoragePoolByURI(
secondaryStorageUrl);
secondaryStoragePool.createFolder(destVolumePath);
@ -418,6 +422,7 @@ public class KVMStorageProcessor implements StorageProcessor {
destVolumeName,secondaryStoragePool);
VolumeObjectTO newVol = new VolumeObjectTO();
newVol.setPath(destVolumePath + File.separator + destVolumeName);
newVol.setFormat(destFormat);
return new CopyCmdAnswer(newVol);
} catch (CloudRuntimeException e) {
return new CopyCmdAnswer(e.toString());
@ -661,7 +666,7 @@ public class KVMStorageProcessor implements StorageProcessor {
*
* These bindings will read the snapshot and write the contents to
* the secondary storage directly
*
*
* It will stop doing so if the amount of time spend is longer then
* cmds.timeout
*/

View File

@ -479,13 +479,13 @@ public class LibvirtStorageAdaptor implements StorageAdaptor {
// if anyone is, undefine the pool so we can define it as requested.
// This should be safe since a pool in use can't be removed, and no
// volumes are affected by unregistering the pool with libvirt.
s_logger.debug("Didn't find an existing storage pool " + name
s_logger.debug("Didn't find an existing storage pool " + name
+ " by UUID, checking for pools with duplicate paths");
try {
String[] poolnames = conn.listStoragePools();
for (String poolname : poolnames) {
s_logger.debug("Checking path of existing pool " + poolname
s_logger.debug("Checking path of existing pool " + poolname
+ " against pool we want to create");
StoragePool p = conn.storagePoolLookupByName(poolname);
LibvirtStoragePoolDef pdef = getStoragePoolDef(conn, p);
@ -503,7 +503,7 @@ public class LibvirtStorageAdaptor implements StorageAdaptor {
}
}
} catch (LibvirtException e) {
s_logger.error("Failure in attempting to see if an existing storage pool might "
s_logger.error("Failure in attempting to see if an existing storage pool might "
+ "be using the path of the pool to be created:" + e);
}
@ -546,14 +546,14 @@ public class LibvirtStorageAdaptor implements StorageAdaptor {
pool.setCapacity(sp.getInfo().capacity);
pool.setUsed(sp.getInfo().allocation);
pool.setAvailable(sp.getInfo().available);
return pool;
} catch (LibvirtException e) {
String error = e.toString();
if (error.contains("Storage source conflict")) {
throw new CloudRuntimeException("A pool matching this location already exists in libvirt, "
+ " but has a different UUID/Name. Cannot create new pool without first "
+ " removing it. Check for inactive pools via 'virsh pool-list --all'. "
+ " but has a different UUID/Name. Cannot create new pool without first "
+ " removing it. Check for inactive pools via 'virsh pool-list --all'. "
+ error);
} else {
throw new CloudRuntimeException(error);
@ -824,7 +824,7 @@ public class LibvirtStorageAdaptor implements StorageAdaptor {
if ((srcPool.getSourceHost().equals(destPool.getSourceHost())) && (srcPool.getSourceDir().equals(destPool.getSourceDir()))) {
/* We are on the same Ceph cluster, but we require RBD format 2 on the source image */
s_logger.debug("Trying to perform a RBD clone (layering) since we are operating in the same storage pool");
Rados r = new Rados(srcPool.getAuthUserName());
r.confSet("mon_host", srcPool.getSourceHost() + ":" + srcPool.getSourcePort());
r.confSet("key", srcPool.getAuthSecret());
@ -894,7 +894,7 @@ public class LibvirtStorageAdaptor implements StorageAdaptor {
sRbd.close(srcImage);
dRbd.close(destImage);
rSrc.ioCtxDestroy(sIO);
rDest.ioCtxDestroy(dIO);
}
@ -965,12 +965,21 @@ public class LibvirtStorageAdaptor implements StorageAdaptor {
for Secondary Storage
*/
KVMStoragePool srcPool = disk.getPool();
PhysicalDiskFormat sourceFormat = disk.getFormat();
String sourcePath = disk.getPath();
KVMPhysicalDisk newDisk;
if (destPool.getType() != StoragePoolType.RBD) {
if (disk.getFormat() == PhysicalDiskFormat.TAR) {
newDisk = destPool.createPhysicalDisk(name, PhysicalDiskFormat.DIR, disk.getVirtualSize());
} else {
newDisk = destPool.createPhysicalDisk(name, disk.getVirtualSize());
/* If the source device is on a RBD storage pool force the new disk to the same format (RAW) */
if (srcPool.getType() != StoragePoolType.RBD) {
newDisk = destPool.createPhysicalDisk(name, disk.getVirtualSize());
} else {
newDisk = destPool.createPhysicalDisk(name, sourceFormat, disk.getVirtualSize());
}
}
} else {
newDisk = new KVMPhysicalDisk(destPool.getSourceDir() + "/" + name, name, destPool);
@ -979,10 +988,7 @@ public class LibvirtStorageAdaptor implements StorageAdaptor {
newDisk.setVirtualSize(disk.getSize());
}
KVMStoragePool srcPool = disk.getPool();
String destPath = newDisk.getPath();
String sourcePath = disk.getPath();
PhysicalDiskFormat sourceFormat = disk.getFormat();
PhysicalDiskFormat destFormat = newDisk.getFormat();
QemuImg qemu = new QemuImg();
@ -1116,11 +1122,7 @@ public class LibvirtStorageAdaptor implements StorageAdaptor {
srcPool.getAuthSecret(),
sourcePath));
srcFile.setFormat(sourceFormat);
destFile = new QemuImgFile(KVMPhysicalDisk.RBDStringBuilder(destPool.getSourceHost(),
destPool.getSourcePort(),
destPool.getAuthUserName(),
destPool.getAuthSecret(),
destPath));
destFile = new QemuImgFile(destPath);
destFile.setFormat(destFormat);
try {