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

Reply via email to