From 15877c3ee88eb1bf6e3356bd8adefb239150c490 Mon Sep 17 00:00:00 2001 From: Javi Fontan Date: Fri, 9 Jan 2015 12:33:54 +0100 Subject: [PATCH] bug #3464: deeps search the tree of snapshots Also the delete method does not remove children so the snapshots in that tree can be accessed when the parent is deleted. (cherry picked from commit d62783a7f8d50ba48fd2931b19cd59e3380659e8) --- src/vmm_mad/remotes/vcenter/vcenter_driver.rb | 34 +++++++++++++++---- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/src/vmm_mad/remotes/vcenter/vcenter_driver.rb b/src/vmm_mad/remotes/vcenter/vcenter_driver.rb index 91990c6c44..e758a692ff 100644 --- a/src/vmm_mad/remotes/vcenter/vcenter_driver.rb +++ b/src/vmm_mad/remotes/vcenter/vcenter_driver.rb @@ -702,6 +702,24 @@ class VCenterVm return snapshot_name end + ############################################################################ + # Find VM snapshot + # @param list root list of VM snapshots + # @param snaphot_name name of the snapshot + ############################################################################ + def self.find_snapshot(list, snapshot_name) + list.each do |i| + if i.name == snapshot_name + return i.snapshot + elsif !i.childSnapshotList.empty? + snap = find_snapshot(i.childSnapshotList, snapshot_name) + return snap if snap + end + end + + nil + end + ############################################################################ # Delete VM snapshot # @param deploy_id vcenter identifier of the VM @@ -714,13 +732,14 @@ class VCenterVm vm = connection.find_vm_template(deploy_id) - snapshot = vm.snapshot.rootSnapshotList.find {|s| - s.name == snapshot_name - }.snapshot + list = vm.snapshot.rootSnapshotList + + snapshot = find_snapshot(list, snapshot_name) + return nil if !snapshot delete_snapshot_hash = { :_this => snapshot, - :removeChildren => true + :removeChildren => false } snapshot.RemoveSnapshot_Task(delete_snapshot_hash).wait_for_completion @@ -738,9 +757,10 @@ class VCenterVm vm = connection.find_vm_template(deploy_id) - snapshot = vm.snapshot.rootSnapshotList.find {|s| - s.name == snapshot_name - }.snapshot + list = vm.snapshot.rootSnapshotList + + snapshot = find_snapshot(list, snapshot_name) + return nil if !snapshot revert_snapshot_hash = { :_this => snapshot