diff --git a/src/datastore_mad/remotes/vcenter/clone b/src/datastore_mad/remotes/vcenter/clone index c71f10c5bf..2efc36bb14 100755 --- a/src/datastore_mad/remotes/vcenter/clone +++ b/src/datastore_mad/remotes/vcenter/clone @@ -35,10 +35,12 @@ id = ARGV[1] drv_action = OpenNebula::XMLElement.new drv_action.initialize_xml(Base64.decode64(drv_action_enc), 'DS_DRIVER_ACTION_DATA') -target_ds_ref = drv_action["/DS_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/VCENTER_DS_REF"] -ds_image_dir = drv_action["/DS_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/VCENTER_DS_IMAGE_DIR"] || "one" -src_path = drv_action["/DS_DRIVER_ACTION_DATA/IMAGE/PATH"] -src_img_id = drv_action["/DS_DRIVER_ACTION_DATA/IMAGE/CLONING_ID"] +target_ds_ref = drv_action["/DS_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/VCENTER_DS_REF"] +ds_image_dir = drv_action["/DS_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/VCENTER_DS_IMAGE_DIR"] || "one" +src_path_escaped = drv_action["/DS_DRIVER_ACTION_DATA/IMAGE/PATH"] +src_img_id = drv_action["/DS_DRIVER_ACTION_DATA/IMAGE/CLONING_ID"] + +src_path = VCenterDriver::FileHelper.unescape_path(src_path_escaped) check_valid src_img_id, "cloning id" check_valid src_path, "image path" diff --git a/src/datastore_mad/remotes/vcenter/cp b/src/datastore_mad/remotes/vcenter/cp index e567540f4c..d3103a7ec8 100755 --- a/src/datastore_mad/remotes/vcenter/cp +++ b/src/datastore_mad/remotes/vcenter/cp @@ -50,7 +50,9 @@ check_valid img_path, "img_path" # if image is already in a vCenter datastore return the path if img_path.start_with? "vcenter://" - puts img_path.sub("vcenter://","") + img_path = img_path.sub("vcenter://", "") + img_path = VCenterDriver::FileHelper.escape_path(img_path) + puts img_path exit(0) end diff --git a/src/tm_mad/vcenter/clone b/src/tm_mad/vcenter/clone index ce4d1c6690..d80d8dff2a 100755 --- a/src/tm_mad/vcenter/clone +++ b/src/tm_mad/vcenter/clone @@ -50,7 +50,9 @@ check_valid source_ds_id, "source_ds_id" target_ds_id = dst.split("/")[-3] disk_id = dst.split(".")[-1] -src_path = src.split(":")[-1] +src_path_escaped = src.split(":")[-1] +src_path = VCenterDriver::FileHelper.unescape_path(src_path_escaped) + hostname = dst.split(":").first # Get host ID @@ -71,14 +73,18 @@ check_valid target_ds_ref, "target_ds" one_vm = VCenterDriver::VIHelper.one_item(OpenNebula::VirtualMachine, vm_id) # calculate target path -target_path = VCenterDriver::FileHelper.get_img_name_from_path(src_path, +target_path_escaped = VCenterDriver::FileHelper.get_img_name_from_path(src_path_escaped, vm_id, disk_id) + +target_path = VCenterDriver::FileHelper.unescape_path(target_path_escaped) + begin vi_client = VCenterDriver::VIClient.new_from_host(host_id) # Find disk info - disk = one_vm.retrieve_xmlelements("TEMPLATE/DISK[SOURCE=\"#{src_path}\"]").first rescue nil + disk = one_vm.retrieve_xmlelements("TEMPLATE/DISK[SOURCE=\"#{src_path_escaped}\"]").first rescue nil + raise "Cannot find disk element in vm template" if !disk new_size = nil @@ -102,20 +108,24 @@ begin # Let's check if the disk is really unmanaged if one_vm["TEMPLATE/CLONING_TEMPLATE_ID"] - # In this case we're not cloning the disk, althought the disk + # In this case we're not cloning the disk, although the disk # is unmanaged, the disk is treated as persistent until the # vm is terminated. That way the disk added to the new vcenter # template is the one that OpenNebula created when the OpenNebula # VM template was created - unmanaged_disk = true + unmanaged_disk = true else # What's the moref of the template linked to this VM? template_ref = one_vm["USER_TEMPLATE/VCENTER_TEMPLATE_REF"] # What's the ID of the image and the source - image_id = disk["IMAGE_ID"] - one_image = VCenterDriver::VIHelper.one_item(OpenNebula::Image, image_id) - one_source = one_image["SOURCE"] + image_id = disk["IMAGE_ID"] + one_image = VCenterDriver::VIHelper.one_item(OpenNebula::Image, image_id) + + one_source_escaped = one_image["SOURCE"] + one_source = VCenterDriver::FileHelper.unescape_path(one_source_escaped) + + # TODO: review this with disk clone # Let's inspect the disks inside the template # if we found that the image source of the disk matches one of diff --git a/src/tm_mad/vcenter/cpds b/src/tm_mad/vcenter/cpds index a72d11befb..f2d5238af0 100755 --- a/src/tm_mad/vcenter/cpds +++ b/src/tm_mad/vcenter/cpds @@ -89,7 +89,9 @@ begin source_ds_ref = disk_hash[:datastore]._ref else # Get image source path - src_path = VCenterDriver::FileHelper.get_img_name(disk, vmid, vm['name']) + src_path_escaped = VCenterDriver::FileHelper.get_img_name(disk, vmid, vm['name']) + src_path = VCenterDriver::FileHelper.unescape_path(src_path_escaped) + source_ds = VCenterDriver::VIHelper.one_item(OpenNebula::Datastore, source_ds_id) source_ds_ref = source_ds['TEMPLATE/VCENTER_DS_REF'] ##source_ds_ref = disk["VCENTER_DS_REF"] diff --git a/src/vmm_mad/remotes/lib/vcenter_driver/file_helper.rb b/src/vmm_mad/remotes/lib/vcenter_driver/file_helper.rb index 9dd0e4aa50..10752c69dd 100644 --- a/src/vmm_mad/remotes/lib/vcenter_driver/file_helper.rb +++ b/src/vmm_mad/remotes/lib/vcenter_driver/file_helper.rb @@ -26,7 +26,9 @@ class FileHelper end end + # REMOVE: no need to change... def self.get_img_name_from_path(path, vm_id, disk_id) + # Note: This will probably fail if the basename contains '.' return "#{path.split(".").first}-#{vm_id}-#{disk_id}.vmdk" end @@ -133,6 +135,14 @@ class FileHelper end end + def self.escape_path(path) + return path.gsub(" ", "%20") + end + + def self.unescape_path(path) + return path.gsub("%20", " ") + end + end # class FileHelper -end # module VCenterDriver \ No newline at end of file +end # module VCenterDriver diff --git a/src/vmm_mad/remotes/lib/vcenter_driver/virtual_machine.rb b/src/vmm_mad/remotes/lib/vcenter_driver/virtual_machine.rb index 4db53301a6..38e966a1ed 100644 --- a/src/vmm_mad/remotes/lib/vcenter_driver/virtual_machine.rb +++ b/src/vmm_mad/remotes/lib/vcenter_driver/virtual_machine.rb @@ -1302,7 +1302,8 @@ class VirtualMachine < Template # Try to find index of disks in template disks unmanaged_disks.each do |unmanaged_disk| - index = template_disks_vector.index(unmanaged_disk["SOURCE"]) + unmanaged_disk_source = VCenterDriver::FileHelper.unescape_path(unmanaged_disk["SOURCE"]) + index = template_disks_vector.index(unmanaged_disk_source) if index reference = {} reference[:key] = "opennebula.disk.#{unmanaged_disk["DISK_ID"]}" @@ -1886,12 +1887,19 @@ class VirtualMachine < Template if unmanaged_keys.key?("opennebula.disk.#{disk["DISK_ID"]}") device_key = unmanaged_keys["opennebula.disk.#{disk["DISK_ID"]}"].to_i disk_hash = get_device_filename_and_ds_from_key(device_key, vc_disks) - onevm_disks_vector << disk_hash[:path_wo_ds] if disk_hash - next - end - img_name = VCenterDriver::FileHelper.get_img_name(disk, one_item['ID'], self['name'], instantiated_as_persistent?) - onevm_disks_vector << "#{img_name}" + if disk_hash + onevm_disks_vector << disk_hash[:path_wo_ds] + end + else + img_name_escaped = VCenterDriver::FileHelper.get_img_name( + disk, + one_item['ID'], + self['name'], + instantiated_as_persistent?) + img_name = VCenterDriver::FileHelper.unescape_path(img_name_escaped) + onevm_disks_vector << img_name + end end return onevm_disks_vector @@ -1936,6 +1944,7 @@ class VirtualMachine < Template def device_detach_disks(onevm_disks_vector, unmanaged_keys, vc_disks) detach_disk_array = [] extra_config = [] + ipool = VCenterDriver::VIHelper.one_pool(OpenNebula::ImagePool) if ipool.respond_to?(:message) raise "Could not get OpenNebula ImagePool: #{ipool.message}" @@ -1945,7 +1954,9 @@ class VirtualMachine < Template if !onevm_disks_vector.index(d[:path_wo_ds]) # If disk to be detached is not persistent detach and destroy it - persistent = VCenterDriver::VIHelper.find_persistent_image_by_source(d[:path_wo_ds], ipool) + source = VCenterDriver::FileHelper.escape_path(d[:path_wo_ds]) + persistent = VCenterDriver::VIHelper.find_persistent_image_by_source(source, ipool) + if !persistent detach_disk_array << { :fileOperation => :destroy, @@ -2069,8 +2080,11 @@ class VirtualMachine < Template vm.config.hardware.device.each do |disk| if is_disk_or_cdrom?(disk) # Let's try to find if disks is persistent - source = disk.backing.fileName.sub(/^\[(.*?)\] /, "") + source_unescaped = disk.backing.fileName.sub(/^\[(.*?)\] /, "") + source = VCenterDriver::FileHelper.escape_path(source_unescaped) + persistent = VCenterDriver::VIHelper.find_persistent_image_by_source(source, ipool) + if persistent spec_hash[:deviceChange] << { :operation => :remove, @@ -2134,22 +2148,24 @@ class VirtualMachine < Template # Get vcenter device representing DISK object (hotplug) def disk_attached_to_vm(disk, unmanaged_keys, vc_disks) - img_name = "" device_found = nil disk_id = disk["DISK_ID"] + unmanaged_key = unmanaged_keys["opennebula.disk.#{disk_id}"] + + img_name_escaped = VCenterDriver::FileHelper.get_img_name( + disk, + one_item['ID'], + self['name'], + instantiated_as_persistent?) + + img_name = VCenterDriver::FileHelper.unescape_path(img_name_escaped) vc_disks.each do |d| - # Check if we are dealing with the unmanaged disks present in the template when cloned + key_matches = (unmanaged_key && d[:key] == unmanaged_key.to_i) + path_matches = (d[:path_wo_ds] == img_name) - if unmanaged_keys.key?("opennebula.disk.#{disk_id}") && d[:key] == unmanaged_keys["opennebula.disk.#{disk_id}"].to_i - device_found = d - break - end - - # Alright let's see if we can find other devices only with the expected image name - img_name = VCenterDriver::FileHelper.get_img_name(disk, one_item['ID'], self['name'], instantiated_as_persistent?) - if d[:path_wo_ds] == "#{img_name}" + if key_matches || path_matches device_found = d break end @@ -2159,7 +2175,14 @@ class VirtualMachine < Template end def calculate_add_disk_spec(disk, position=0) - img_name = VCenterDriver::FileHelper.get_img_name(disk, one_item['ID'], self['name'],instantiated_as_persistent?) + img_name_escaped = VCenterDriver::FileHelper.get_img_name( + disk, + one_item['ID'], + self['name'], + instantiated_as_persistent?) + + img_name = VCenterDriver::FileHelper.unescape_path(img_name_escaped) + type = disk["TYPE"] size_kb = disk["SIZE"].to_i * 1024 diff --git a/src/vmm_mad/remotes/vcenter/attach_disk b/src/vmm_mad/remotes/vcenter/attach_disk index b7382cffa4..b43bd0b441 100755 --- a/src/vmm_mad/remotes/vcenter/attach_disk +++ b/src/vmm_mad/remotes/vcenter/attach_disk @@ -55,4 +55,4 @@ rescue Exception => e exit -1 ensure vi_client.close_connection if vi_client -end \ No newline at end of file +end