diff --git a/src/tm_mad/vcenter/resize b/src/tm_mad/vcenter/resize index 3c30a2062f..7a90d1b025 100755 --- a/src/tm_mad/vcenter/resize +++ b/src/tm_mad/vcenter/resize @@ -65,7 +65,7 @@ begin end disk = vm.disk(disk_id) - disk.set_size(new_size) + disk.change_size(new_size) vm.resize_disk(disk) 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 43a6bcdc3a..412da3012f 100644 --- a/src/vmm_mad/remotes/lib/vcenter_driver/virtual_machine.rb +++ b/src/vmm_mad/remotes/lib/vcenter_driver/virtual_machine.rb @@ -18,7 +18,7 @@ module VCenterDriver class VirtualMachine < VCenterDriver::Template # Supported access to VirtualMachineDevice classes: - # Example: + # Example: # Disk # VirtualMachineDevice::Disk # VCenterDriver::VirtualMachine::Disk @@ -1117,7 +1117,7 @@ module VCenterDriver name = name.gsub('\'', '') file_content = Base64.encode64(File.read(path)) file_content.prepend("#{name}\n") - + [ { :key => "guestinfo.opennebula.file.#{id}", :value => file_content } @@ -1870,10 +1870,10 @@ module VCenterDriver def resize_disk(disk) if !disk.exists? - size = disk.get_size + size = disk.size sync_disks disk = disk(disk.id) - disk.set_size(size) + disk.change_size(size) end spec = {deviceChange: [disk.config(:resize)]} diff --git a/src/vmm_mad/remotes/lib/vcenter_driver/virtual_machine_device/vm_device.rb b/src/vmm_mad/remotes/lib/vcenter_driver/virtual_machine_device/vm_device.rb index f9e51ea707..735ae63470 100644 --- a/src/vmm_mad/remotes/lib/vcenter_driver/virtual_machine_device/vm_device.rb +++ b/src/vmm_mad/remotes/lib/vcenter_driver/virtual_machine_device/vm_device.rb @@ -68,10 +68,11 @@ module VirtualMachineDevice def managed? raise_if_no_exists_in_one - if @one_res - !(@one_res['OPENNEBULA_MANAGED'] && - @one_res['OPENNEBULA_MANAGED'].downcase == 'no') - end + + return unless @one_res + + !(@one_res['OPENNEBULA_MANAGED'] && + @one_res['OPENNEBULA_MANAGED'].downcase == 'no') end end diff --git a/src/vmm_mad/remotes/lib/vcenter_driver/virtual_machine_device/vm_disk.rb b/src/vmm_mad/remotes/lib/vcenter_driver/virtual_machine_device/vm_disk.rb index 4756c58764..46c25c52d4 100644 --- a/src/vmm_mad/remotes/lib/vcenter_driver/virtual_machine_device/vm_disk.rb +++ b/src/vmm_mad/remotes/lib/vcenter_driver/virtual_machine_device/vm_disk.rb @@ -20,22 +20,24 @@ module VirtualMachineDevice # Disk class class Disk < Device + attr_reader :size + def initialize(id, one_res, vc_res) super(id, one_res, vc_res) end # Create the OpenNebula disk representation - # Allow as to create the class without vCenter representation + # Allow us to create the class without vCenter representation # example: attached disks not synced with vCenter def self.one_disk(id, one_res) - self.new(id, one_res, nil) + new(id, one_res, nil) end # Create the vCenter disk representation - # Allow as to create the class without OpenNebula representation + # Allow us to create the class without OpenNebula representation # example: detached disks that not exists in OpenNebula def self.vc_disk(vc_res) - self.new(nil, nil, vc_res) + new(nil, nil, vc_res) end def storpod? @@ -87,7 +89,7 @@ module VirtualMachineDevice path.split('/').last end - def is_cd? + def cd? raise_if_no_exists_in_vcenter @vc_res[:type] == 'CDROM' end @@ -140,25 +142,21 @@ module VirtualMachineDevice @vc_res[:device].connectable.connected end - def get_size - @size if @size - end - def boot_dev - if is_cd? + if cd? RbVmomi::VIM.VirtualMachineBootOptionsBootableCdromDevice() else RbVmomi::VIM.VirtualMachineBootOptionsBootableDiskDevice( - deviceKey: device.key + :deviceKey => device.key ) end end - def set_size(size) + def change_size(size) size = size.to_i if @one_res['ORIGINAL_SIZE'] && - @one_res['ORIGINAL_SIZE'].to_i >= size + @one_res['ORIGINAL_SIZE'].to_i >= size raise "'disk-resize' cannot decrease the disk's size" end @@ -169,11 +167,11 @@ module VirtualMachineDevice def new_size return @size * 1024 if @size - if @one_res['ORIGINAL_SIZE'] - osize = @one_res['ORIGINAL_SIZE'].to_i - nsize = @one_res['SIZE'].to_i - new_size = nsize > osize ? nsize * 1024 : nil - end + return unless @one_res['ORIGINAL_SIZE'] + + osize = @one_res['ORIGINAL_SIZE'].to_i + nsize = @one_res['SIZE'].to_i + nsize > osize ? nsize * 1024 : nil end def destroy @@ -182,7 +180,7 @@ module VirtualMachineDevice raise_if_no_exists_in_vcenter ds = VCenterDriver::Datastore.new(self.ds) - img_path = self.path + img_path = path begin img_dir = File.dirname(img_path) @@ -196,7 +194,7 @@ module VirtualMachineDevice search_task.wait_for_completion ds.delete_virtual_disk(img_path) ds.rm_directory(img_dir) if ds.dir_empty?(img_dir) - rescue Exception => e + rescue StandardError => e if !e.message.start_with?('FileNotFound') # Ignore FileNotFound raise e.message diff --git a/src/vmm_mad/remotes/lib/vcenter_driver/virtual_machine_device/vm_nic.rb b/src/vmm_mad/remotes/lib/vcenter_driver/virtual_machine_device/vm_nic.rb index 28ba02f49a..8e975c5683 100644 --- a/src/vmm_mad/remotes/lib/vcenter_driver/virtual_machine_device/vm_nic.rb +++ b/src/vmm_mad/remotes/lib/vcenter_driver/virtual_machine_device/vm_nic.rb @@ -28,14 +28,14 @@ module VirtualMachineDevice # Allow as to create the class without vCenter representation # example: attached nics not synced with vCenter def self.one_nic(id, one_res) - self.new(id, one_res, nil) + new(id, one_res, nil) end # Create the vCenter nic representation # Allow as to create the class without OpenNebula representation # example: detached nics that not exists in OpenNebula def self.vc_nic(vc_res) - self.new(nil, nil, vc_res) + new(nil, nil, vc_res) end def key @@ -46,7 +46,7 @@ module VirtualMachineDevice def boot_dev RbVmomi::VIM .VirtualMachineBootOptionsBootableEthernetDevice( - deviceKey: key + :deviceKey => key ) end diff --git a/src/vmm_mad/remotes/lib/vcenter_driver/virtual_machine_monitor/vm_monitor.rb b/src/vmm_mad/remotes/lib/vcenter_driver/virtual_machine_monitor/vm_monitor.rb index c98cc2a6f0..dfe7a98a48 100644 --- a/src/vmm_mad/remotes/lib/vcenter_driver/virtual_machine_monitor/vm_monitor.rb +++ b/src/vmm_mad/remotes/lib/vcenter_driver/virtual_machine_monitor/vm_monitor.rb @@ -37,9 +37,12 @@ module VirtualMachineMonitor end # monitor function used when VMM poll action is called + # rubocop:disable Naming/VariableName def monitor_poll_vm reset_monitor + return unless get_vm_id + @state = state_to_c(self['summary.runtime.powerState']) if @state != OpenNebula::VirtualMachine::Driver::VM_STATE[:active] @@ -79,146 +82,144 @@ module VirtualMachineMonitor refresh_rate = provider.refreshRate - if get_vm_id - stats = {} + stats = {} - if one_item['MONITORING/LAST_MON'] && - one_item['MONITORING/LAST_MON'].to_i != 0 - # Real time data stores max 1 hour. 1 minute has 3 samples - interval = (Time.now.to_i - - one_item['MONITORING/LAST_MON'].to_i) + if one_item['MONITORING/LAST_MON'] && + one_item['MONITORING/LAST_MON'].to_i != 0 + # Real time data stores max 1 hour. 1 minute has 3 samples + interval = (Time.now.to_i - + one_item['MONITORING/LAST_MON'].to_i) - # If last poll was more than hour ago get 3 minutes, - # else calculate how many samples since last poll - if interval > 3600 - samples = 9 - else - samples = (interval / refresh_rate) + 1 - end - samples > 0 ? max_samples = samples : max_samples = 1 - - stats = pm.retrieve_stats( - [@item], - ['net.transmitted', 'net.bytesRx', 'net.bytesTx', - 'net.received', 'virtualDisk.numberReadAveraged', - 'virtualDisk.numberWriteAveraged', 'virtualDisk.read', - 'virtualDisk.write'], - interval => refresh_rate, max_samples => max_samples - ) rescue {} + # If last poll was more than hour ago get 3 minutes, + # else calculate how many samples since last poll + if interval > 3600 + samples = 9 else - # First poll, get at least latest 3 minutes = 9 samples - stats = pm.retrieve_stats( - [@item], - ['net.transmitted', 'net.bytesRx', 'net.bytesTx', - 'net.received', 'virtualDisk.numberReadAveraged', - 'virtualDisk.numberWriteAveraged', 'virtualDisk.read', - 'virtualDisk.write'], - interval => refresh_rate, max_samples => 9 - ) rescue {} + samples = (interval / refresh_rate) + 1 end + samples > 0 ? max_samples = samples : max_samples = 1 - if !stats.empty? && !stats.first[1][:metrics].empty? - metrics = stats.first[1][:metrics] - - nettx_kbpersec = 0 - if metrics['net.transmitted'] - metrics['net.transmitted'].each do |sample| - nettx_kbpersec += sample if sample > 0 - end - end - - netrx_kbpersec = 0 - if metrics['net.bytesRx'] - metrics['net.bytesRx'].each do |sample| - netrx_kbpersec += sample if sample > 0 - end - end - - read_kbpersec = 0 - if metrics['virtualDisk.read'] - metrics['virtualDisk.read'].each do |sample| - read_kbpersec += sample if sample > 0 - end - end - - read_iops = 0 - if metrics['virtualDisk.numberReadAveraged'] - metrics['virtualDisk.numberReadAveraged'].each do |sample| - read_iops += sample if sample > 0 - end - end - - write_kbpersec = 0 - if metrics['virtualDisk.write'] - metrics['virtualDisk.write'].each do |sample| - write_kbpersec += sample if sample > 0 - end - end - - write_iops = 0 - if metrics['virtualDisk.numberWriteAveraged'] - metrics['virtualDisk.numberWriteAveraged'].each do |sample| - write_iops += sample if sample > 0 - end - end - else - nettx_kbpersec = 0 - netrx_kbpersec = 0 - read_kbpersec = 0 - read_iops = 0 - write_kbpersec = 0 - write_iops = 0 - end - - # Accumulate values if present - if @one_item && @one_item['MONITORING/NETTX'] - previous_nettx = @one_item['MONITORING/NETTX'].to_i - else - previous_nettx = 0 - end - - if @one_item && @one_item['MONITORING/NETRX'] - previous_netrx = @one_item['MONITORING/NETRX'].to_i - else - previous_netrx = 0 - end - - if @one_item && @one_item['MONITORING/DISKRDIOPS'] - previous_diskrdiops = @one_item['MONITORING/DISKRDIOPS'].to_i - else - previous_diskrdiops = 0 - end - - if @one_item && @one_item['MONITORING/DISKWRIOPS'] - previous_diskwriops = @one_item['MONITORING/DISKWRIOPS'].to_i - else - previous_diskwriops = 0 - end - - if @one_item && @one_item['MONITORING/DISKRDBYTES'] - previous_diskrdbytes = @one_item['MONITORING/DISKRDBYTES'].to_i - else - previous_diskrdbytes = 0 - end - - if @one_item && @one_item['MONITORING/DISKWRBYTES'] - previous_diskwrbytes = @one_item['MONITORING/DISKWRBYTES'].to_i - else - previous_diskwrbytes = 0 - end - - @monitor[:nettx] = previous_nettx + - (nettx_kbpersec * 1024 * refresh_rate).to_i - @monitor[:netrx] = previous_netrx + - (netrx_kbpersec * 1024 * refresh_rate).to_i - - @monitor[:diskrdiops] = previous_diskrdiops + read_iops - @monitor[:diskwriops] = previous_diskwriops + write_iops - @monitor[:diskrdbytes] = previous_diskrdbytes + - (read_kbpersec * 1024 * refresh_rate).to_i - @monitor[:diskwrbytes] = previous_diskwrbytes + - (write_kbpersec * 1024 * refresh_rate).to_i + stats = pm.retrieve_stats( + [@item], + ['net.transmitted', 'net.bytesRx', 'net.bytesTx', + 'net.received', 'virtualDisk.numberReadAveraged', + 'virtualDisk.numberWriteAveraged', 'virtualDisk.read', + 'virtualDisk.write'], + interval => refresh_rate, max_samples => max_samples + ) rescue {} + else + # First poll, get at least latest 3 minutes = 9 samples + stats = pm.retrieve_stats( + [@item], + ['net.transmitted', 'net.bytesRx', 'net.bytesTx', + 'net.received', 'virtualDisk.numberReadAveraged', + 'virtualDisk.numberWriteAveraged', 'virtualDisk.read', + 'virtualDisk.write'], + interval => refresh_rate, max_samples => 9 + ) rescue {} end + + if !stats.empty? && !stats.first[1][:metrics].empty? + metrics = stats.first[1][:metrics] + + nettx_kbpersec = 0 + if metrics['net.transmitted'] + metrics['net.transmitted'].each do |sample| + nettx_kbpersec += sample if sample > 0 + end + end + + netrx_kbpersec = 0 + if metrics['net.bytesRx'] + metrics['net.bytesRx'].each do |sample| + netrx_kbpersec += sample if sample > 0 + end + end + + read_kbpersec = 0 + if metrics['virtualDisk.read'] + metrics['virtualDisk.read'].each do |sample| + read_kbpersec += sample if sample > 0 + end + end + + read_iops = 0 + if metrics['virtualDisk.numberReadAveraged'] + metrics['virtualDisk.numberReadAveraged'].each do |sample| + read_iops += sample if sample > 0 + end + end + + write_kbpersec = 0 + if metrics['virtualDisk.write'] + metrics['virtualDisk.write'].each do |sample| + write_kbpersec += sample if sample > 0 + end + end + + write_iops = 0 + if metrics['virtualDisk.numberWriteAveraged'] + metrics['virtualDisk.numberWriteAveraged'].each do |sample| + write_iops += sample if sample > 0 + end + end + else + nettx_kbpersec = 0 + netrx_kbpersec = 0 + read_kbpersec = 0 + read_iops = 0 + write_kbpersec = 0 + write_iops = 0 + end + + # Accumulate values if present + if @one_item && @one_item['MONITORING/NETTX'] + previous_nettx = @one_item['MONITORING/NETTX'].to_i + else + previous_nettx = 0 + end + + if @one_item && @one_item['MONITORING/NETRX'] + previous_netrx = @one_item['MONITORING/NETRX'].to_i + else + previous_netrx = 0 + end + + if @one_item && @one_item['MONITORING/DISKRDIOPS'] + previous_diskrdiops = @one_item['MONITORING/DISKRDIOPS'].to_i + else + previous_diskrdiops = 0 + end + + if @one_item && @one_item['MONITORING/DISKWRIOPS'] + previous_diskwriops = @one_item['MONITORING/DISKWRIOPS'].to_i + else + previous_diskwriops = 0 + end + + if @one_item && @one_item['MONITORING/DISKRDBYTES'] + previous_diskrdbytes = @one_item['MONITORING/DISKRDBYTES'].to_i + else + previous_diskrdbytes = 0 + end + + if @one_item && @one_item['MONITORING/DISKWRBYTES'] + previous_diskwrbytes = @one_item['MONITORING/DISKWRBYTES'].to_i + else + previous_diskwrbytes = 0 + end + + @monitor[:nettx] = previous_nettx + + (nettx_kbpersec * 1024 * refresh_rate).to_i + @monitor[:netrx] = previous_netrx + + (netrx_kbpersec * 1024 * refresh_rate).to_i + + @monitor[:diskrdiops] = previous_diskrdiops + read_iops + @monitor[:diskwriops] = previous_diskwriops + write_iops + @monitor[:diskrdbytes] = previous_diskrdbytes + + (read_kbpersec * 1024 * refresh_rate).to_i + @monitor[:diskwrbytes] = previous_diskwrbytes + + (write_kbpersec * 1024 * refresh_rate).to_i end # monitor function used when poll action is called for all vms @@ -359,6 +360,7 @@ module VirtualMachineMonitor @monitor[:diskwrbytes] = previous_diskwrbytes + (write_kbpersec * 1024 * refresh_rate).to_i end + # rubocop:enable Naming/VariableName # Generates a OpenNebula IM Driver valid string with the monitor info def info diff --git a/src/vmm_mad/remotes/lib/vcenter_driver/vmm_importer.rb b/src/vmm_mad/remotes/lib/vcenter_driver/vmm_importer.rb index 965c9f6070..7363a03c14 100644 --- a/src/vmm_mad/remotes/lib/vcenter_driver/vmm_importer.rb +++ b/src/vmm_mad/remotes/lib/vcenter_driver/vmm_importer.rb @@ -1,106 +1,113 @@ module VCenterDriver -class VmmImporter < VCenterDriver::VcImporter - def initialize(one_client, vi_client) - super(one_client, vi_client) - @one_class = OpenNebula::VirtualMachine - @defaults = {} - end + # Functionality to import vCenter VMs into OpenNebula + class VmmImporter < VCenterDriver::VcImporter - def list(key, list) - @list = {key => list} - end + def initialize(one_client, vi_client) + super(one_client, vi_client) + @one_class = OpenNebula::VirtualMachine + @defaults = {} + end - def request_vnc(vc_vm) - one_vm = vc_vm.one_item - vnc_port = one_vm["TEMPLATE/GRAPHICS/PORT"] - elapsed_seconds = 0 + def list(key, list) + @list = { key => list } + end - # Let's update the info to gather VNC port - until vnc_port || elapsed_seconds > 30 - sleep(1) - one_vm.info - vnc_port = one_vm["TEMPLATE/GRAPHICS/PORT"] - elapsed_seconds += 1 - end + def request_vnc(vc_vm) + one_vm = vc_vm.one_item + vnc_port = one_vm['TEMPLATE/GRAPHICS/PORT'] + elapsed_seconds = 0 - if vnc_port - extraconfig = [] - extraconfig += vc_vm.extraconfig_vnc - spec_hash = { :extraConfig => extraconfig } - spec = RbVmomi::VIM.VirtualMachineConfigSpec(spec_hash) - vc_vm.item.ReconfigVM_Task(:spec => spec).wait_for_completion - end - end + # Let's update the info to gather VNC port + until vnc_port || elapsed_seconds > 30 + sleep(1) + one_vm.info + vnc_port = one_vm['TEMPLATE/GRAPHICS/PORT'] + elapsed_seconds += 1 + end - def build - xml = OpenNebula::VirtualMachine.build_xml - vm = OpenNebula::VirtualMachine.new(xml, @one_client) - end + return unless vnc_port - def import(selected) - vm_ref = selected["DEPLOY_ID"] || selected[:wild]["DEPLOY_ID"] - vm = selected[:one_item] || build - template = selected[:template] || Base64.decode64(selected['IMPORT_TEMPLATE']) - host_id = selected[:host] || @list.keys[0] + extraconfig = [] + extraconfig += vc_vm.extraconfig_vnc + spec_hash = { :extraConfig => extraconfig } + spec = RbVmomi::VIM.VirtualMachineConfigSpec(spec_hash) + vc_vm.item.ReconfigVM_Task(:spec => spec).wait_for_completion + end - vc_uuid = @vi_client.vim.serviceContent.about.instanceUuid - vc_name = @vi_client.vim.host - dpool, ipool, npool, hpool = create_pools + def build + xml = OpenNebula::VirtualMachine.build_xml + OpenNebula::VirtualMachine.new(xml, @one_client) + end - vc_vm = VCenterDriver::VirtualMachine.new_without_id(@vi_client, vm_ref) - vname = vc_vm['name'] + def import(selected) + import_tmplt = selected['IMPORT_TEMPLATE'] + import_tmplt = Base64.decode64(import_template) if import_tmplt + vm_ref = selected['DEPLOY_ID'] || selected[:wild]['DEPLOY_ID'] + vm = selected[:one_item] || build + template = selected[:template] || import_tmplt + host_id = selected[:host] || @list.keys[0] - type = {:object => "VM", :id => vname} - error, template_disks = vc_vm.import_vcenter_disks(vc_uuid, dpool, ipool, type) - raise error if !error.empty? + vc_uuid = @vi_client.vim.serviceContent.about.instanceUuid + vc_name = @vi_client.vim.host + dpool, ipool, npool, hpool = create_pools - template << template_disks + vc_vm = VCenterDriver::VirtualMachine.new_without_id(@vi_client, + vm_ref) + vname = vc_vm['name'] - # Create images or get nics information for template - error, template_nics, ar_ids = vc_vm - .import_vcenter_nics(vc_uuid, - npool, - hpool, - vc_name, - vm_ref, - vc_vm) - opts = {uuid: vc_uuid, npool: npool, error: error } - Raction.delete_ars(ar_ids, opts) if !error.empty? + type = { :object => 'VM', :id => vname } + error, template_disks = vc_vm.import_vcenter_disks(vc_uuid, dpool, + ipool, type) + raise error unless error.empty? - template << template_nics - template << "VCENTER_ESX_HOST = #{vc_vm["runtime.host.name"].to_s}\n" + template << template_disks - # Get DS_ID for the deployment, the wild VM needs a System DS - dc_ref = vc_vm.get_dc.item._ref - ds_ref = template.match(/^VCENTER_DS_REF *= *"(.*)" *$/)[1] + # Create images or get nics information for template + error, template_nics, ar_ids = vc_vm + .import_vcenter_nics(vc_uuid, + npool, + hpool, + vc_name, + vm_ref, + vc_vm) + opts = { :uuid => vc_uuid, :npool => npool, :error => error } + Raction.delete_ars(ar_ids, opts) unless error.empty? - ds_one = dpool.select do |e| - e["TEMPLATE/TYPE"] == "SYSTEM_DS" && - e["TEMPLATE/VCENTER_DS_REF"] == ds_ref && - e["TEMPLATE/VCENTER_DC_REF"] == dc_ref && - e["TEMPLATE/VCENTER_INSTANCE_ID"] == vc_uuid - end.first - opts[:error] = "ds with ref #{ds_ref} is not imported, aborting" - Raction.delete_ars(ar_ids, opts) if !ds_one + template << template_nics + template << "VCENTER_ESX_HOST = #{vc_vm['runtime.host.name']}\n" - rc = vm.allocate(template) - if OpenNebula.is_error?(rc) - Raction.delete_ars(ar_ids, opts.merge({error: rc.message})) - end + # Get DS_ID for the deployment, the wild VM needs a System DS + dc_ref = vc_vm.get_dc.item._ref + ds_ref = template.match(/^VCENTER_DS_REF *= *"(.*)" *$/)[1] - rc = vm.deploy(host_id, false, ds_one.id) - if OpenNebula.is_error?(rc) - Raction.delete_ars(ar_ids, opts.merge({error: rc.message})) - end + ds_one = dpool.select do |e| + e['TEMPLATE/TYPE'] == 'SYSTEM_DS' && + e['TEMPLATE/VCENTER_DS_REF'] == ds_ref && + e['TEMPLATE/VCENTER_DC_REF'] == dc_ref && + e['TEMPLATE/VCENTER_INSTANCE_ID'] == vc_uuid + end.first + opts[:error] = "ds with ref #{ds_ref} is not imported, aborting" + Raction.delete_ars(ar_ids, opts) unless ds_one - # Set reference to template disks and nics in VM template - vc_vm.one_item = vm + rc = vm.allocate(template) + if OpenNebula.is_error?(rc) + Raction.delete_ars(ar_ids, opts.merge(:error => rc.message)) + end - request_vnc(vc_vm) + rc = vm.deploy(host_id, false, ds_one.id) + if OpenNebula.is_error?(rc) + Raction.delete_ars(ar_ids, opts.merge(:error => rc.message)) + end - return vm.id - end -end # class VmmImporter + # Set reference to template disks and nics in VM template + vc_vm.one_item = vm -end # module VCenterDriver + request_vnc(vc_vm) + + vm.id + end + + end + +end