1
0
mirror of https://github.com/OpenNebula/one.git synced 2025-03-22 18:50:08 +03:00

L #3264: Linting for refactored vCenter driver

This commit is contained in:
Tino Vazquez 2019-05-30 18:17:42 +02:00
parent bfee27823b
commit 7466813970
No known key found for this signature in database
GPG Key ID: 2FE9C32E94AEABBE
7 changed files with 258 additions and 250 deletions

View File

@ -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)

View File

@ -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)]}

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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