From fc0f484c8ef02eb64c46f06705897b8330b62a99 Mon Sep 17 00:00:00 2001 From: mcabrerizo Date: Mon, 17 Apr 2017 17:02:13 +0200 Subject: [PATCH] F #4913: Add delete_file method using DeleteDatastoreFile_Task. Move some methods from Datastore class to Storage class --- .../remotes/lib/vcenter_driver/datastore.rb | 142 ++++++++++-------- 1 file changed, 82 insertions(+), 60 deletions(-) diff --git a/src/vmm_mad/remotes/lib/vcenter_driver/datastore.rb b/src/vmm_mad/remotes/lib/vcenter_driver/datastore.rb index 4583f9caa1..6dc63256ef 100644 --- a/src/vmm_mad/remotes/lib/vcenter_driver/datastore.rb +++ b/src/vmm_mad/remotes/lib/vcenter_driver/datastore.rb @@ -183,6 +183,71 @@ class Storage return one_tmp end + def create_virtual_disk(img_name, size, adapter_type, disk_type) + leading_dirs = img_name.split('/')[0..-2] + if !leading_dirs.empty? + create_directory(leading_dirs.join('/')) + end + + ds_name = self['name'] + + vmdk_spec = RbVmomi::VIM::FileBackedVirtualDiskSpec( + :adapterType => adapter_type, + :capacityKb => size.to_i*1024, + :diskType => disk_type + ) + + get_vdm.CreateVirtualDisk_Task( + :datacenter => get_dc.item, + :name => "[#{ds_name}] #{img_name}.vmdk", + :spec => vmdk_spec + ).wait_for_completion + + "#{img_name}.vmdk" + end + + def create_directory(directory) + ds_name = self['name'] + + return if self.class == VCenterDriver::StoragePod + + directory_name = "[#{ds_name}] #{directory}" + + create_directory_params = { + :name => directory_name, + :datacenter => get_dc.item, + :createParentDirectories => true + } + + begin + get_fm.MakeDirectory(create_directory_params) + rescue RbVmomi::VIM::FileAlreadyExists => e + # Do nothing if directory already exists + end + end + + def get_fm + self['_connection.serviceContent.fileManager'] + end + + def get_vdm + self['_connection.serviceContent.virtualDiskManager'] + end + + def get_dc + item = @item + + while !item.instance_of? RbVmomi::VIM::Datacenter + item = item.parent + if item.nil? + raise "Could not find the parent Datacenter" + end + end + + Datacenter.new(item) + end + + end # class Storage @@ -217,29 +282,6 @@ class Datastore < Storage @one_item = {} end - def create_virtual_disk(img_name, size, adapter_type, disk_type) - leading_dirs = img_name.split('/')[0..-2] - if !leading_dirs.empty? - create_directory(leading_dirs.join('/')) - end - - ds_name = self['name'] - - vmdk_spec = RbVmomi::VIM::FileBackedVirtualDiskSpec( - :adapterType => adapter_type, - :capacityKb => size.to_i*1024, - :diskType => disk_type - ) - - get_vdm.CreateVirtualDisk_Task( - :datacenter => get_dc.item, - :name => "[#{ds_name}] #{img_name}.vmdk", - :spec => vmdk_spec - ).wait_for_completion - - "#{img_name}.vmdk" - end - def delete_virtual_disk(img_name) ds_name = self['name'] @@ -256,6 +298,23 @@ class Datastore < Storage end end + def delete_file(img_name) + + ds_name = self['name'] + + begin + get_fm.DeleteDatastoreFile_Task( + :name => "[#{ds_name}] #{img_name}", + :datacenter => get_dc.item + ).wait_for_completion + rescue Exception => e + # Ignore if file not found + if !e.message.start_with?('ManagedObjectNotFound') + raise e + end + end + end + # Copy a VirtualDisk def copy_virtual_disk(src_path, target_ds, target_path, new_size=nil) source_ds_name = self['name'] @@ -292,22 +351,6 @@ class Datastore < Storage target_path end - def create_directory(directory) - ds_name = self['name'] - - create_directory_params = { - :name => "[#{ds_name}] #{directory}", - :datacenter => get_dc.item, - :createParentDirectories => true - } - - begin - get_fm.MakeDirectory(create_directory_params) - rescue RbVmomi::VIM::FileAlreadyExists => e - # Do nothing if directory already exists - end - end - def rm_directory(directory) ds_name = self['name'] @@ -403,27 +446,6 @@ class Datastore < Storage return search_params end - def get_fm - self['_connection.serviceContent.fileManager'] - end - - def get_vdm - self['_connection.serviceContent.virtualDiskManager'] - end - - def get_dc - item = @item - - while !item.instance_of? RbVmomi::VIM::Datacenter - item = item.parent - if item.nil? - raise "Could not find the parent Datacenter" - end - end - - Datacenter.new(item) - end - def get_dc_path dc = get_dc p = dc.item.parent