From 82630a617b8c1c8f671a0a17b8801ee015aacc8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavel=20Czern=C3=BD?= Date: Wed, 4 Sep 2024 13:16:02 +0200 Subject: [PATCH] B #6505: Fix volatile disk backup (#3212) * F #6505: Fix volatile disk backup and restore * F #6578: Skip backup of CDROM (cherry picked from commit c8c66b1d8fbdf7ba319d32f03387fc09f316af3a) --- src/tm_mad/lib/backup.rb | 20 +++++++++++++++++--- src/tm_mad/lib/backup_qcow2.rb | 13 ++++++++----- src/vm/VirtualMachineDisk.cc | 4 +++- 3 files changed, 28 insertions(+), 9 deletions(-) diff --git a/src/tm_mad/lib/backup.rb b/src/tm_mad/lib/backup.rb index 0e9700d53b..f1983f78e7 100644 --- a/src/tm_mad/lib/backup.rb +++ b/src/tm_mad/lib/backup.rb @@ -174,9 +174,9 @@ module TransferManager DISK_LIST = ['ALLOW_ORPHANS', 'CLONE', 'CLONE_TARGET', 'CLUSTER_ID', 'DATASTORE', 'DATASTORE_ID', 'DISK_SNAPSHOT_TOTAL_SIZE', 'DISK_TYPE', 'DRIVER', - 'IMAGE', 'IMAGE_ID', 'IMAGE_STATE', 'IMAGE_UID', 'IMAGE_UNAME', + 'IMAGE', 'IMAGE_STATE', 'IMAGE_UID', 'IMAGE_UNAME', 'LN_TARGET', 'OPENNEBULA_MANAGED', 'ORIGINAL_SIZE', 'PERSISTENT', - 'READONLY', 'SAVE', 'SIZE', 'SOURCE', 'TARGET', 'TM_MAD', 'TYPE', 'FORMAT'] + 'READONLY', 'SAVE', 'SOURCE', 'TARGET', 'TM_MAD', 'FORMAT'] NIC_LIST = ['AR_ID', 'BRIDGE', 'BRIDGE_TYPE', 'CLUSTER_ID', 'NAME', 'NETWORK_ID', 'NIC_ID', 'TARGET', 'VLAN_ID', 'VN_MAD', 'VLAN_TAGGED_ID', 'PHYDEV'] @@ -334,11 +334,25 @@ module TransferManager disks.each do |d| id = d['DISK_ID'] + type = d['TYPE'].upcase next unless id - next unless bck_disks[id] d.delete('DISK_ID') + if type == 'FS' + # Volatile disk + d.delete('IMAGE_ID') + + # If not included in backup, keep TYPE and SIZE to create new volatile disk + next unless bck_disks[id] + end + + d.delete('TYPE') + d.delete('SIZE') + + # CDROM keeps original image_id + next if type == 'CDROM' + d['IMAGE_ID'] = bck_disks[id][:image_id].to_s end diff --git a/src/tm_mad/lib/backup_qcow2.rb b/src/tm_mad/lib/backup_qcow2.rb index dc1e57a57b..997df6889d 100755 --- a/src/tm_mad/lib/backup_qcow2.rb +++ b/src/tm_mad/lib/backup_qcow2.rb @@ -726,7 +726,7 @@ class KVMDomain @vm.elements.each 'TEMPLATE/DISK' do |d| did = d.elements['DISK_ID'].text tgt = d.elements['TARGET'].text - per = d.elements['SAVE'].text.casecmp('YES') == 0 + per = d.elements['SAVE'].nil? ? false : d.elements['SAVE'].text.casecmp('YES') == 0 ssh = d.elements['TM_MAD'].text.casecmp('SSH') == 0 next unless disks.include? did @@ -798,10 +798,13 @@ class KVMDomain @vm.elements.each 'TEMPLATE/DISK' do |d| did = d.elements['DISK_ID'].text tgt = d.elements['TARGET'].text - per = d.elements['SAVE'].text.casecmp('YES') == 0 + per = d.elements['SAVE'].nil? ? false : d.elements['SAVE'].text.casecmp('YES') == 0 ssh = d.elements['TM_MAD'].text.casecmp('SSH') == 0 - next unless disks.include? did + unless disks.include? did + dspec << "#{tgt},snapshot=no" + next + end disk_path = "#{@vm_dir}/disk.#{did}" disk_opts = { @@ -941,7 +944,7 @@ class KVMDomain @vm.elements.each 'TEMPLATE/DISK' do |d| did = d.elements['DISK_ID'].text - per = d.elements['SAVE'].text.casecmp('YES') == 0 + per = d.elements['SAVE'].nil? ? false : d.elements['SAVE'].text.casecmp('YES') == 0 ssh = d.elements['TM_MAD'].text.casecmp('SSH') == 0 next unless disks.include? did @@ -1028,7 +1031,7 @@ class KVMDomain @vm.elements.each 'TEMPLATE/DISK' do |d| did = d.elements['DISK_ID'].text - per = d.elements['SAVE'].text.casecmp('YES') == 0 + per = d.elements['SAVE'].nil? ? false : d.elements['SAVE'].text.casecmp('YES') == 0 ssh = d.elements['TM_MAD'].text.casecmp('SSH') == 0 next unless disks.include? did diff --git a/src/vm/VirtualMachineDisk.cc b/src/vm/VirtualMachineDisk.cc index fbb1b9ddaf..fd422f7761 100644 --- a/src/vm/VirtualMachineDisk.cc +++ b/src/vm/VirtualMachineDisk.cc @@ -1632,7 +1632,9 @@ void VirtualMachineDisks::backup_disk_ids(bool do_volatile, std::vector& id one_util::toupper(type); - if ((type == "SWAP") || ((type == "FS") && !do_volatile)) + if ((type == "SWAP") || + (type == "CDROM") || + ((type == "FS") && !do_volatile)) { continue; }