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:
parent
bfee27823b
commit
7466813970
@ -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)
|
||||
|
||||
|
@ -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)]}
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user