This is an automated email from the ASF dual-hosted git repository.
nvazquez pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/cloudstack.git
The following commit(s) were added to refs/heads/main by this push:
new 81b7e6e750 Fix extract snapshot from vm snapshot on kvm (#6422)
81b7e6e750 is described below
commit 81b7e6e750a581375612b78fbf04ce94da573839
Author: Daniel Augusto Veronezi Salvador
<[email protected]>
AuthorDate: Tue May 31 14:30:36 2022 -0300
Fix extract snapshot from vm snapshot on kvm (#6422)
* Fix extract snapshot from VM snapshot on KVM
* Fix validation expression - does not need to escape the slash
Co-authored-by: GutoVeronezi <[email protected]>
---
.../kvm/storage/KVMStorageProcessor.java | 4 +-
scripts/storage/qcow2/managesnapshot.sh | 46 +++++++++++++++++++---
2 files changed, 42 insertions(+), 8 deletions(-)
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 f73307be13..e9f7a64a90 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
@@ -930,7 +930,7 @@ public class KVMStorageProcessor implements
StorageProcessor {
final String secondaryStoragePoolUrl = nfsImageStore.getUrl();
// NOTE: snapshot name is encoded in snapshot path
final int index = snapshot.getPath().lastIndexOf("/");
- final boolean isCreatedFromVmSnapshot = (index == -1) ? true: false;
// -1 means the snapshot is created from existing vm snapshot
+ final boolean isCreatedFromVmSnapshot = index == -1; // -1 means the
snapshot is created from existing vm snapshot
final String snapshotName = snapshot.getPath().substring(index + 1);
String descName = snapshotName;
@@ -1002,7 +1002,7 @@ public class KVMStorageProcessor implements
StorageProcessor {
}
} else {
final Script command = new Script(_manageSnapshotPath,
cmd.getWaitInMillSeconds(), s_logger);
- command.add("-b", snapshot.getPath());
+ command.add("-b", isCreatedFromVmSnapshot ?
snapshotDisk.getPath() : snapshot.getPath());
command.add(NAME_OPTION, snapshotName);
command.add("-p", snapshotDestPath);
if (isCreatedFromVmSnapshot) {
diff --git a/scripts/storage/qcow2/managesnapshot.sh
b/scripts/storage/qcow2/managesnapshot.sh
index b1bf73251a..2daa768347 100755
--- a/scripts/storage/qcow2/managesnapshot.sh
+++ b/scripts/storage/qcow2/managesnapshot.sh
@@ -226,14 +226,48 @@ backup_snapshot() {
return 2
fi
elif [ -f ${disk} ]; then
+ if [[ $disk == *"/snapshots/"* ]]; then
+ #Backup volume snapshot
+ cp "$disk" "${destPath}/${destName}"
+ ret_code=$?
- cp "$disk" "${destPath}/${destName}"
- ret_code=$?
+ if [ $ret_code -gt 0 ]
+ then
+ printf "Failed to backup $snapshotname for disk $disk to $destPath\n"
>&2
+ return 2
+ fi
+ else
+ # Backup VM snapshot
+ qemuimg_ret=$($qemu_img snapshot $forceShareFlag -l $disk 2>&1)
+ ret_code=$?
+ if [ $ret_code -gt 0 ] && [[ $qemuimg_ret == *"snapshot: invalid option
-- 'U'"* ]]; then
+ forceShareFlag=""
+ qemuimg_ret=$($qemu_img snapshot $forceShareFlag -l $disk)
+ ret_code=$?
+ fi
- if [ $ret_code -gt 0 ]
- then
- printf "Failed to backup $snapshotname for disk $disk to $destPath\n" >&2
- return 2
+ if [ $ret_code -gt 0 ] || [[ ! $qemuimg_ret == *"$snapshotname"* ]]; then
+ printf "there is no $snapshotname on disk $disk\n" >&2
+ return 1
+ fi
+
+ qemuimg_ret=$($qemu_img convert $forceShareFlag -f qcow2 -O qcow2 -l
snapshot.name=$snapshotname $disk $destPath/$destName 2>&1 > /dev/null)
+ ret_code=$?
+ if [ $ret_code -gt 0 ] && [[ $qemuimg_ret == *"convert: invalid option
-- 'U'"* ]]; then
+ forceShareFlag=""
+ qemuimg_ret=$($qemu_img convert $forceShareFlag -f qcow2 -O qcow2 -l
snapshot.name=$snapshotname $disk $destPath/$destName 2>&1 > /dev/null)
+ ret_code=$?
+ fi
+
+ if [ $ret_code -gt 0 ] && [[ $qemuimg_ret == *"convert: invalid option
-- 'l'"* ]]; then
+ $qemu_img convert $forceShareFlag -f qcow2 -O qcow2 -s $snapshotname
$disk $destPath/$destName >& /dev/null
+ ret_code=$?
+ fi
+
+ if [ $ret_code -gt 0 ]; then
+ printf "Failed to backup $snapshotname for disk $disk to $destPath\n"
>&2
+ return 2
+ fi
fi
else
printf "***Failed to backup snapshot $snapshotname, undefined type
$disk\n" >&2