This is an automated email from the ASF dual-hosted git repository.
dahn pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cloudstack.git
The following commit(s) were added to refs/heads/master by this push:
new 4e90a8c Qemu 2.10 requires `-U` flag to read volume metadata (#4567)
4e90a8c is described below
commit 4e90a8c454f4d8ea6c35d9f92ada13325aeecf54
Author: Daniel Augusto Veronezi Salvador
<[email protected]>
AuthorDate: Thu Mar 18 07:54:01 2021 -0300
Qemu 2.10 requires `-U` flag to read volume metadata (#4567)
Co-authored-by: Daniel Augusto Veronezi Salvador <[email protected]>
---
.../command/user/snapshot/CreateSnapshotCmd.java | 6 ++++--
.../kvm/resource/LibvirtComputingResource.java | 4 ++--
...atePrivateTemplateFromVolumeCommandWrapper.java | 3 ++-
.../kvm/storage/IscsiAdmStorageAdaptor.java | 3 ++-
.../kvm/storage/KVMStorageProcessor.java | 4 ++--
.../kvm/storage/LibvirtStorageAdaptor.java | 16 +++++++-------
.../kvm/storage/ScaleIOStorageAdaptor.java | 9 ++++----
.../org/apache/cloudstack/utils/qemu/QemuImg.java | 25 ++++++++++++++++------
.../apache/cloudstack/utils/qemu/QemuImgTest.java | 17 ++++++++-------
scripts/storage/qcow2/resizevolume.sh | 18 +++++++++++++++-
10 files changed, 69 insertions(+), 36 deletions(-)
diff --git
a/api/src/main/java/org/apache/cloudstack/api/command/user/snapshot/CreateSnapshotCmd.java
b/api/src/main/java/org/apache/cloudstack/api/command/user/snapshot/CreateSnapshotCmd.java
index 72437c8..cf4c1d4 100644
---
a/api/src/main/java/org/apache/cloudstack/api/command/user/snapshot/CreateSnapshotCmd.java
+++
b/api/src/main/java/org/apache/cloudstack/api/command/user/snapshot/CreateSnapshotCmd.java
@@ -223,10 +223,12 @@ public class CreateSnapshotCmd extends BaseAsyncCreateCmd
{
response.setResponseName(getCommandName());
setResponseObject(response);
} else {
- throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR,
"Failed to create snapshot due to an internal error creating snapshot for
volume " + getVolumeUuid());
+ throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR,
String.format("Snapshot from volume [%s] was not found in database.",
getVolumeUuid()));
}
} catch (Exception e) {
- throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed
to create snapshot due to an internal error creating snapshot for volume " +
getVolumeUuid());
+ String errorMessage = "Failed to create snapshot due to an
internal error creating snapshot for volume " + getVolumeUuid();
+ s_logger.error(errorMessage, e);
+ throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR,
errorMessage);
}
}
diff --git
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
index e380ef1..1540cca 100644
---
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
+++
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
@@ -4311,8 +4311,8 @@ public class LibvirtComputingResource extends
ServerResourceBase implements Serv
String backingFileFmt = backingFileinfo.get(new
String("file_format"));
qemu.rebase(file, backingFile, backingFileFmt, false);
}
- } catch (QemuImgException e) {
- s_logger.error("Failed to set backing file format of " + volPath +
" due to : " + e.getMessage());
+ } catch (QemuImgException | LibvirtException e) {
+ s_logger.error("Failed to set backing file format of " + volPath +
" due to : " + e.getMessage(), e);
}
}
diff --git
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtCreatePrivateTemplateFromVolumeCommandWrapper.java
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtCreatePrivateTemplateFromVolumeCommandWrapper.java
index 4bdebe1..e621e5f 100644
---
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtCreatePrivateTemplateFromVolumeCommandWrapper.java
+++
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtCreatePrivateTemplateFromVolumeCommandWrapper.java
@@ -55,6 +55,7 @@ import com.cloud.storage.template.QCOW2Processor;
import com.cloud.storage.template.TemplateLocation;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.script.Script;
+import org.libvirt.LibvirtException;
@ResourceWrapper(handles = CreatePrivateTemplateFromVolumeCommand.class)
public final class LibvirtCreatePrivateTemplateFromVolumeCommandWrapper
extends CommandWrapper<CreatePrivateTemplateFromVolumeCommand, Answer,
LibvirtComputingResource> {
@@ -120,7 +121,7 @@ public final class
LibvirtCreatePrivateTemplateFromVolumeCommandWrapper extends
final QemuImg q = new QemuImg(0);
try {
q.convert(srcFile, destFile);
- } catch (final QemuImgException e) {
+ } catch (final QemuImgException | LibvirtException e) {
s_logger.error("Failed to create new template while
converting " + srcFile.getFileName() + " to " + destFile.getFileName() + " the
error was: " +
e.getMessage());
}
diff --git
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/IscsiAdmStorageAdaptor.java
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/IscsiAdmStorageAdaptor.java
index 7684789..fb89683 100644
---
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/IscsiAdmStorageAdaptor.java
+++
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/IscsiAdmStorageAdaptor.java
@@ -35,6 +35,7 @@ import com.cloud.utils.StringUtils;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.script.OutputInterpreter;
import com.cloud.utils.script.Script;
+import org.libvirt.LibvirtException;
@StorageAdaptorInfo(storagePoolType=StoragePoolType.Iscsi)
public class IscsiAdmStorageAdaptor implements StorageAdaptor {
@@ -420,7 +421,7 @@ public class IscsiAdmStorageAdaptor implements
StorageAdaptor {
try {
q.convert(srcFile, destFile);
- } catch (QemuImgException ex) {
+ } catch (QemuImgException | LibvirtException ex) {
String msg = "Failed to copy data from " + srcDisk.getPath() + "
to " +
destDisk.getPath() + ". The error was the following: " +
ex.getMessage();
diff --git
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/KVMStorageProcessor.java
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/KVMStorageProcessor.java
index 09dc8b1..8c997ea 100644
---
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/KVMStorageProcessor.java
+++
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/KVMStorageProcessor.java
@@ -621,7 +621,7 @@ public class KVMStorageProcessor implements
StorageProcessor {
final QemuImg q = new QemuImg(cmd.getWaitInMillSeconds());
try {
q.convert(srcFile, destFile);
- } catch (final QemuImgException e) {
+ } catch (final QemuImgException | LibvirtException e) {
final String message = "Failed to create new template
while converting " + srcFile.getFileName() + " to " + destFile.getFileName() +
" the error was: " +
e.getMessage();
@@ -977,7 +977,7 @@ public class KVMStorageProcessor implements
StorageProcessor {
} catch (final IOException e) {
s_logger.error("Failed to create " + snapshotDestPath + ".
The error was: " + e.getMessage());
return new CopyCmdAnswer(e.toString());
- } catch (final QemuImgException e) {
+ } catch (final QemuImgException | LibvirtException e) {
s_logger.error("Failed to backup the RBD snapshot from " +
rbdSnapshot +
" to " + snapshotFile + " the error was: " +
e.getMessage());
return new CopyCmdAnswer(e.toString());
diff --git
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java
index 630b988..c17cd44 100644
---
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java
+++
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java
@@ -810,7 +810,7 @@ public class LibvirtStorageAdaptor implements
StorageAdaptor {
Map<String, String> info = qemu.info(destFile);
virtualSize = Long.parseLong(info.get(new String("virtual_size")));
actualSize = new File(destFile.getFileName()).length();
- } catch (QemuImgException e) {
+ } catch (QemuImgException | LibvirtException e) {
s_logger.error("Failed to create " + volPath +
" due to a failed executing of qemu-img: " +
e.getMessage());
}
@@ -1015,7 +1015,7 @@ public class LibvirtStorageAdaptor implements
StorageAdaptor {
Map<String, String> options = new HashMap<String,
String>();
qemu.convert(sourceFile, destFile, options, null);
}
- } catch (QemuImgException e) {
+ } catch (QemuImgException | LibvirtException e) {
s_logger.error("Failed to create " + disk.getPath() +
" due to a failed executing of qemu-img: " +
e.getMessage());
}
@@ -1066,7 +1066,7 @@ public class LibvirtStorageAdaptor implements
StorageAdaptor {
srcFile = new QemuImgFile(template.getPath(),
template.getFormat());
try{
qemu.convert(srcFile, destFile);
- } catch (QemuImgException e) {
+ } catch (QemuImgException | LibvirtException e) {
s_logger.error("Failed to create " + disk.getPath() +
" due to a failed executing of qemu-img: " +
e.getMessage());
}
@@ -1300,12 +1300,12 @@ public class LibvirtStorageAdaptor implements
StorageAdaptor {
Long virtualSize = Long.parseLong(destInfo.get(new
String("virtual_size")));
newDisk.setVirtualSize(virtualSize);
newDisk.setSize(virtualSize);
- } catch (QemuImgException e) {
+ } catch (QemuImgException | LibvirtException e) {
s_logger.error("Failed to convert " +
srcFile.getFileName() + " to " + destFile.getFileName() + " the error was: " +
e.getMessage());
newDisk = null;
}
}
- } catch (QemuImgException e) {
+ } catch (QemuImgException | LibvirtException e) {
s_logger.error("Failed to fetch the information of file "
+ srcFile.getFileName() + " the error was: " + e.getMessage());
newDisk = null;
}
@@ -1349,7 +1349,7 @@ public class LibvirtStorageAdaptor implements
StorageAdaptor {
rbd.close(image);
r.ioCtxDestroy(io);
- } catch (QemuImgException e) {
+ } catch (QemuImgException | LibvirtException e) {
s_logger.error("Failed to convert from " +
srcFile.getFileName() + " to " + destFile.getFileName() + " the error was: " +
e.getMessage());
newDisk = null;
} catch (RadosException e) {
@@ -1373,7 +1373,7 @@ public class LibvirtStorageAdaptor implements
StorageAdaptor {
try {
qemu.convert(srcFile, destFile);
- } catch (QemuImgException e) {
+ } catch (QemuImgException | LibvirtException e) {
s_logger.error("Failed to convert " + srcFile.getFileName() +
" to " + destFile.getFileName() + " the error was: " + e.getMessage());
newDisk = null;
}
@@ -1410,7 +1410,7 @@ public class LibvirtStorageAdaptor implements
StorageAdaptor {
QemuImgFile srcFile = new QemuImgFile(snapshot.getPath(),
snapshot.getFormat());
qemu.convert(srcFile, destFile, snapshotName);
}
- } catch (QemuImgException e) {
+ } catch (QemuImgException | LibvirtException e) {
s_logger.error("Failed to create " + destPath +
" due to a failed executing of qemu-img: " +
e.getMessage());
}
diff --git
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ScaleIOStorageAdaptor.java
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ScaleIOStorageAdaptor.java
index 62eb544..1c2ba5a 100644
---
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ScaleIOStorageAdaptor.java
+++
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ScaleIOStorageAdaptor.java
@@ -38,6 +38,7 @@ import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.script.OutputInterpreter;
import com.cloud.utils.script.Script;
import com.google.common.base.Strings;
+import org.libvirt.LibvirtException;
@StorageAdaptorInfo(storagePoolType= Storage.StoragePoolType.PowerFlex)
public class ScaleIOStorageAdaptor implements StorageAdaptor {
@@ -270,8 +271,8 @@ public class ScaleIOStorageAdaptor implements
StorageAdaptor {
LOGGER.debug("Starting copy from source image " +
srcFile.getFileName() + " to PowerFlex volume: " + destDisk.getPath());
qemu.convert(srcFile, destFile);
LOGGER.debug("Succesfully converted source image " +
srcFile.getFileName() + " to PowerFlex volume: " + destDisk.getPath());
- } catch (QemuImgException e) {
- LOGGER.error("Failed to convert from " + srcFile.getFileName() + "
to " + destFile.getFileName() + " the error was: " + e.getMessage());
+ } catch (QemuImgException | LibvirtException e) {
+ LOGGER.error("Failed to convert from " + srcFile.getFileName() + "
to " + destFile.getFileName() + " the error was: " + e.getMessage(), e);
destDisk = null;
}
@@ -364,8 +365,8 @@ public class ScaleIOStorageAdaptor implements
StorageAdaptor {
QemuImg qemu = new QemuImg(timeout);
qemu.convert(srcFile, destFile);
LOGGER.debug("Succesfully converted source downloaded template " +
srcFile.getFileName() + " to PowerFlex template volume: " + destDisk.getPath());
- } catch (QemuImgException e) {
- LOGGER.error("Failed to convert from " + srcFile.getFileName() + "
to " + destFile.getFileName() + " the error was: " + e.getMessage());
+ } catch (QemuImgException | LibvirtException e) {
+ LOGGER.error("Failed to convert from " + srcFile.getFileName() + "
to " + destFile.getFileName() + " the error was: " + e.getMessage(), e);
destDisk = null;
} finally {
Script.runSimpleBashScript("rm -f " + srcTemplateFilePath);
diff --git
a/plugins/hypervisors/kvm/src/main/java/org/apache/cloudstack/utils/qemu/QemuImg.java
b/plugins/hypervisors/kvm/src/main/java/org/apache/cloudstack/utils/qemu/QemuImg.java
index 3006d25..44ef71a 100644
---
a/plugins/hypervisors/kvm/src/main/java/org/apache/cloudstack/utils/qemu/QemuImg.java
+++
b/plugins/hypervisors/kvm/src/main/java/org/apache/cloudstack/utils/qemu/QemuImg.java
@@ -20,12 +20,13 @@ import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
-import org.apache.commons.lang.StringUtils;
-import org.apache.commons.lang.NotImplementedException;
-
+import com.cloud.hypervisor.kvm.resource.LibvirtConnection;
import com.cloud.storage.Storage;
import com.cloud.utils.script.OutputInterpreter;
import com.cloud.utils.script.Script;
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang.NotImplementedException;
+import org.libvirt.LibvirtException;
public class QemuImg {
@@ -234,7 +235,7 @@ public class QemuImg {
* @return void
*/
public void convert(final QemuImgFile srcFile, final QemuImgFile destFile,
- final Map<String, String> options, final String
snapshotName) throws QemuImgException {
+ final Map<String, String> options, final String
snapshotName) throws QemuImgException, LibvirtException {
Script script = new Script(_qemuImgPath, timeout);
if (StringUtils.isNotBlank(snapshotName)) {
String qemuPath = Script.runSimpleBashScript(getQemuImgPathScript);
@@ -242,6 +243,11 @@ public class QemuImg {
}
script.add("convert");
+ Long version = LibvirtConnection.getConnection().getVersion();
+ if (version >= 2010000) {
+ script.add("-U");
+ }
+
// autodetect source format. Sometime int he future we may teach
KVMPhysicalDisk about more formats, then we can explicitly pass them if
necessary
//s.add("-f");
//s.add(srcFile.getFormat().toString());
@@ -292,7 +298,7 @@ public class QemuImg {
* The destination file
* @return void
*/
- public void convert(final QemuImgFile srcFile, final QemuImgFile destFile)
throws QemuImgException {
+ public void convert(final QemuImgFile srcFile, final QemuImgFile destFile)
throws QemuImgException, LibvirtException {
this.convert(srcFile, destFile, null, null);
}
@@ -311,7 +317,7 @@ public class QemuImg {
* The snapshot name
* @return void
*/
- public void convert(final QemuImgFile srcFile, final QemuImgFile destFile,
String snapshotName) throws QemuImgException {
+ public void convert(final QemuImgFile srcFile, final QemuImgFile destFile,
String snapshotName) throws QemuImgException, LibvirtException {
this.convert(srcFile, destFile, null, snapshotName);
}
@@ -343,10 +349,15 @@ public class QemuImg {
* A QemuImgFile object containing the file to get the
information from
* @return A HashMap with String key-value information as returned by
'qemu-img info'
*/
- public Map<String, String> info(final QemuImgFile file) throws
QemuImgException {
+ public Map<String, String> info(final QemuImgFile file) throws
QemuImgException, LibvirtException {
final Script s = new Script(_qemuImgPath);
s.add("info");
+ Long version = LibvirtConnection.getConnection().getVersion();
+ if (version >= 2010000) {
+ s.add("-U");
+ }
s.add(file.getFileName());
+
final OutputInterpreter.AllLinesParser parser = new
OutputInterpreter.AllLinesParser();
final String result = s.execute(parser);
if (result != null) {
diff --git
a/plugins/hypervisors/kvm/src/test/java/org/apache/cloudstack/utils/qemu/QemuImgTest.java
b/plugins/hypervisors/kvm/src/test/java/org/apache/cloudstack/utils/qemu/QemuImgTest.java
index e81890a..c58c430 100644
---
a/plugins/hypervisors/kvm/src/test/java/org/apache/cloudstack/utils/qemu/QemuImgTest.java
+++
b/plugins/hypervisors/kvm/src/test/java/org/apache/cloudstack/utils/qemu/QemuImgTest.java
@@ -30,13 +30,14 @@ import org.junit.Ignore;
import org.junit.Test;
import org.apache.cloudstack.utils.qemu.QemuImg.PhysicalDiskFormat;
+import org.libvirt.LibvirtException;
@Ignore
public class QemuImgTest {
@Test
- public void testCreateAndInfo() throws QemuImgException {
+ public void testCreateAndInfo() throws QemuImgException, LibvirtException {
String filename = "/tmp/" + UUID.randomUUID() + ".qcow2";
/* 10TB virtual_size */
@@ -63,7 +64,7 @@ public class QemuImgTest {
}
@Test
- public void testCreateAndInfoWithOptions() throws QemuImgException {
+ public void testCreateAndInfoWithOptions() throws QemuImgException,
LibvirtException {
String filename = "/tmp/" + UUID.randomUUID() + ".qcow2";
/* 10TB virtual_size */
@@ -118,7 +119,7 @@ public class QemuImgTest {
}
@Test
- public void testCreateAndResize() throws QemuImgException {
+ public void testCreateAndResize() throws QemuImgException,
LibvirtException {
String filename = "/tmp/" + UUID.randomUUID() + ".qcow2";
long startSize = 20480;
@@ -147,7 +148,7 @@ public class QemuImgTest {
}
@Test
- public void testCreateAndResizeDeltaPositive() throws QemuImgException {
+ public void testCreateAndResizeDeltaPositive() throws QemuImgException,
LibvirtException {
String filename = "/tmp/" + UUID.randomUUID() + ".qcow2";
long startSize = 20480;
@@ -175,7 +176,7 @@ public class QemuImgTest {
}
@Test
- public void testCreateAndResizeDeltaNegative() throws QemuImgException {
+ public void testCreateAndResizeDeltaNegative() throws QemuImgException,
LibvirtException {
String filename = "/tmp/" + UUID.randomUUID() + ".qcow2";
long startSize = 81920;
@@ -239,7 +240,7 @@ public class QemuImgTest {
}
@Test
- public void testCreateWithBackingFile() throws QemuImgException {
+ public void testCreateWithBackingFile() throws QemuImgException,
LibvirtException {
String firstFileName = "/tmp/" + UUID.randomUUID() + ".qcow2";
String secondFileName = "/tmp/" + UUID.randomUUID() + ".qcow2";
@@ -262,7 +263,7 @@ public class QemuImgTest {
}
@Test
- public void testConvertBasic() throws QemuImgException {
+ public void testConvertBasic() throws QemuImgException, LibvirtException {
long srcSize = 20480;
String srcFileName = "/tmp/" + UUID.randomUUID() + ".qcow2";
String destFileName = "/tmp/" + UUID.randomUUID() + ".qcow2";
@@ -287,7 +288,7 @@ public class QemuImgTest {
}
@Test
- public void testConvertAdvanced() throws QemuImgException {
+ public void testConvertAdvanced() throws QemuImgException,
LibvirtException {
long srcSize = 4019200;
String srcFileName = "/tmp/" + UUID.randomUUID() + ".qcow2";
String destFileName = "/tmp/" + UUID.randomUUID() + ".qcow2";
diff --git a/scripts/storage/qcow2/resizevolume.sh
b/scripts/storage/qcow2/resizevolume.sh
index 136abd1..a45f2e1 100755
--- a/scripts/storage/qcow2/resizevolume.sh
+++ b/scripts/storage/qcow2/resizevolume.sh
@@ -178,7 +178,23 @@ resizeqcow2() {
fi
##### end sanity #####
- actualsize=`qemu-img info $path | grep "virtual size" | sed -re
's/^.*\(([0-9]+).*$/\1/g'`
+ regex=".*version\s([0-9]+)\.([0-9]+).*"
+ content=$(qemu-img --version | grep version)
+
+ qemu_force_share_flag=""
+ if [[ $content =~ $regex ]]
+ then
+ version_first_element="${BASH_REMATCH[1]}"
+ version_second_element="${BASH_REMATCH[2]}"
+ if [[ ${version_first_element} -gt 2 ]] || [[ ${version_first_element}
-eq 2 && ${version_second_element} -ge 10 ]]
+ then
+ qemu_force_share_flag=" -U "
+ fi
+ else
+ echo "Could not retrieve qemu version. Skipping validation to add
--force-share flag."
+ fi
+
+ actualsize=`qemu-img info $qemu_force_share_flag $path | grep "virtual size"
| sed -re 's/^.*\(([0-9]+).*$/\1/g'`
if [ $actualsize -ne $currentsize ]
then