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

F #2652 [vCenter] some comments and definitions

This commit is contained in:
sergio semedi 2018-12-18 09:31:06 +01:00 committed by Tino Vázquez
parent 3b248a27ad
commit 2a3480e655

View File

@ -65,37 +65,58 @@ end # class VirtualMachineFolder
class VirtualMachine < VCenterDriver::Template
############################################################################
# Resource Classes
############################################################################
# Resource base class
#
# @param id [Integer] The OpenNebula resource id
# @param one_res [XMLElement] The OpenNebula representation of the object
# @param vc_res [vCenter_class_specific] vCenter representation of the objecct
class Resource
def initialize(id, one_res, vc_res)
@id = id
@one_res = one_res
@vc_res = vc_res
end
def id
raise_if_no_one
@id
end
def one_item
raise_if_no_one
@one_res
end
def vc_item
raise_if_no_exists
@vc_res
end
def one?
return true if @one_res
false
!@one_res.nil?
end
def exists?
return true if @vc_res
!@vc_res.nil?
end
false
def raise_if_no_one
if !one?
raise 'OpenNebula device does not exist at the moment'
end
end
def raise_if_no_exists
if !exists?
raise 'vCenter device does not exist at the moment'
end
end
def no_exists?
@ -115,6 +136,7 @@ class VirtualMachine < VCenterDriver::Template
end
def managed?
raise_if_no_one
if @one_res
!(@one_res['OPENNEBULA_MANAGED'] &&
@one_res['OPENNEBULA_MANAGED'].downcase == "no")
@ -129,20 +151,22 @@ class VirtualMachine < VCenterDriver::Template
super(id, one_res, vc_res)
end
# Create the OpenNebula nic representation
# Allow as to create the class without vCenter representation
# example: attached nics not synced with vCenter
def self.one_nic(id, one_res)
@error_message = "vCenter device does not exist at the moment"
self.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)
@error_message = "one nic does not exist at the moment"
self.new(nil, nil, vc_res)
end
def key
raise @error_message unless exists?
raise_if_no_exists
@vc_res.key
end
@ -157,63 +181,70 @@ class VirtualMachine < VCenterDriver::Template
super(id, one_res, vc_res)
end
# Create the OpenNebula disk representation
# Allow as to create the class without vCenter representation
# example: attached disks not synced with vCenter
def self.one_disk(id, one_res)
@error_message = "vCenter device does not exist at the moment"
self.new(id, one_res, nil)
end
# Create the vCenter disk representation
# Allow as to create the class without OpenNebula representation
# example: detached disks that not exists in OpenNebula
def self.vc_disk(vc_res)
@error_message = "one disk does not exist at the moment"
self.new(nil, nil, vc_res)
end
def storpod?
raise_if_no_one
@one_res["VCENTER_DS_REF"].start_with?('group-')
end
def device
raise @error_message unless exists?
raise_if_no_exists
@vc_res[:device]
end
def node
raise @error_message unless exists?
raise_if_no_exists
@vc_res[:tag]
end
def path
raise @error_message unless exists?
raise_if_no_exists
@vc_res[:path_wo_ds]
end
def ds
raise @error_message unless exists?
raise_if_no_exists
@vc_res[:datastore]
end
def image_ds_ref
raise_if_no_one
@one_res['VCENTER_DS_REF']
end
def key
raise @error_message unless exists?
raise_if_no_exists
@vc_res[:key]
end
def prefix
raise @error_message unless exists?
raise_if_no_exists
@vc_res[:prefix]
end
def type
raise @error_message unless exists?
raise_if_no_exists
@vc_res[:type]
end
@ -223,13 +254,14 @@ class VirtualMachine < VCenterDriver::Template
end
def is_cd?
raise @error_message unless exists?
raise_if_no_exists
@vc_res[:type] == 'CDROM'
end
def config(action)
raise @error_message unless exists?
raise_if_no_exists
config = {}
if action == :delete
@ -250,19 +282,25 @@ class VirtualMachine < VCenterDriver::Template
end
def persistent?
raise_if_no_one
@one_res['PERSISTENT'] == 'YES'
end
def volatile?
raise_if_no_one
@one_res["TYPE"] && @one_res["TYPE"].downcase == "fs"
end
def cloned?
raise_if_no_one
@one_res['SOURCE'] != @vc_res[:path_wo_ds]
end
def connected?
raise @error_message unless @vc_res
raise_if_no_exists
@vc_res[:device].connectable.connected
end
@ -303,7 +341,7 @@ class VirtualMachine < VCenterDriver::Template
def destroy()
return if is_cd?
raise "This device does not exist in vCetenter" unless exists?
raise_if_no_exists
ds = VCenterDriver::Datastore.new(self.ds)
img_path = self.path
@ -323,6 +361,10 @@ class VirtualMachine < VCenterDriver::Template
end
end
############################################################################
# Virtual Machine main Class
############################################################################
VM_PREFIX_DEFAULT = "one-$i-"
POLL_ATTRIBUTE = OpenNebula::VirtualMachine::Driver::POLL_ATTRIBUTE
@ -847,6 +889,14 @@ class VirtualMachine < VCenterDriver::Template
clone_parameters
end
############################################################################
# VirtualMachine Resource model methods
############################################################################
#
#gets the representation of the nics
#
#@return [Hash(String => self.Nic)
def nics
if !@nics[:macs].empty?
return @nics.reject{|k| k == :macs}
@ -855,12 +905,21 @@ class VirtualMachine < VCenterDriver::Template
info_nics
end
#gets the representation of the disks
#
#@return [Hash(String => self.Disk)
def disks
return @disks unless @disks.empty?
info_disks
end
#iterate over the nics model
#
#@param condition[Symbol] selects nics that matches certain condition
#see Self.Nic|Resource class to see some methods: :exits?, :one?...
#
#@return yield the nic
def nics_each(condition)
res = []
nics.each do |id, nic|
@ -874,6 +933,12 @@ class VirtualMachine < VCenterDriver::Template
res
end
#iterate over the disks model
#
#@param condition[Symbol] selects disks that matches certain condition
#see Self.Disk|Resource class to see some methods: :exits?, :one?...
#
#@return yield the disk
def disks_each(condition)
res = []
disks.each do |id, disk|
@ -897,16 +962,26 @@ class VirtualMachine < VCenterDriver::Template
one_item['USER_TEMPLATE/VCENTER_TEMPLATE_REF']
end
# Queries to OpenNebula the machine disks xml representation
def get_one_disks
one_item.info
one_item.retrieve_xmlelements("TEMPLATE/DISK")
end
# Queries to OpenNebula the machine nics xml representation
def get_one_nics
one_item.info
one_item.retrieve_xmlelements("TEMPLATE/NIC")
end
# perform a query to vCenter asking for the OpenNebula disk
#
# @param one_disk [XMLelement] The OpenNebula object representation of the disk
# @param keys [Hash (String => String)] Hashmap with the unmanaged keys
# @param vc_disks [Array (vcenter_disks)] Array of the machine real disks
# see get_vcenter_disks method
#
# @return [vCenter_disk] the proper disk
def query_disk(one_disk, keys, vc_disks)
index = one_disk['DISK_ID']
cloned = one_disk["CLONE"].nil? || one_disk["CLONE"] == "YES"
@ -925,12 +1000,22 @@ class VirtualMachine < VCenterDriver::Template
query.first
end
# perform a query to vCenter asking for the OpenNebula nic
#
# @param vc_disks [String] The mac of the nic
# @param vc_disks [Array (vcenter_nic)] Array of the machine real nics
#
# @return [vCenter_nic] the proper nic
def query_nic(mac, vc_nics)
nic = vc_nics.select{|dev| dev.macAddress == mac }.first
vc_nics.delete(nic) if nic
end
# Refresh VcenterDriver machine nics model, does not perform
# any sync operation!
#
# @return [Hash ("String" => self.Nic)] Model representation of nics
def info_nics
@nics = {macs: {}}
@ -955,6 +1040,10 @@ class VirtualMachine < VCenterDriver::Template
@nics.reject{|k| k == :macs}
end
# Refresh VcenterDriver machine disks model, does not perform any
# sync operation!
#
# @return [Hash ("String" => self.Disk)] Model representation of disks
def info_disks
@disks = {}
@ -981,6 +1070,11 @@ class VirtualMachine < VCenterDriver::Template
@disks
end
# Queries for a certain nic
#
# @param index [String| Integer] the id of the nic or the mac
# @param opts [hash (symbol=>boolean)]
# :sync : allow you to ignore local class memory
def nic(index, opts = {})
index = index.to_s
is_mac = index.match(/^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$/)
@ -1012,6 +1106,11 @@ class VirtualMachine < VCenterDriver::Template
end
end
# Queries for a certain nic
#
# @param index [String | Integer] the id of the disk
# @param opts [hash (symbol=>boolean)]
# :sync : allow you to ignore local class memory
def disk(index, opts = {})
index = index.to_s
@ -1180,6 +1279,12 @@ class VirtualMachine < VCenterDriver::Template
extra_config
end
# set the boot order of the machine
#
# @param index [String | boot_info] boot information stored in
# the template of the virtual machine. example: disk0, nic0
#
# @return [Array (vCenterbootClass)] An array with the vCenter classes
def set_boot_order(boot_info)
convert = ->(device_str){
spl = device_str.scan(/^(nic|disk)(\d+$)/).flatten
@ -1200,10 +1305,20 @@ class VirtualMachine < VCenterDriver::Template
RbVmomi::VIM.VirtualMachineBootOptions({bootOrder: boot_order})
end
# sync OpenNebula nic model with vCenter
#
# @param option [symbol] if :all is provided the method will try to sync
# all the nics (detached and not existing ones) otherwishe it will only sync
# the nics that are not existing
#
# @param execute [boolean] indicates if the reconfigure operation is going to
# be executed
def sync_nics(option = :none, execute = true)
device_change = []
if option == :all
# detached? condition indicates that the nic exists in OpeNebula but not
# in vCenter
nics_each(:detached?) do |nic|
device_change << {
:operation => :remove,
@ -1212,6 +1327,7 @@ class VirtualMachine < VCenterDriver::Template
end
end
# no_exits? condition indicates that the nic does not exist in vCenter
nics_each(:no_exists?) do |nic|
device_change << calculate_add_nic_spec(nic.one_item)
end
@ -1226,7 +1342,6 @@ class VirtualMachine < VCenterDriver::Template
info_nics
end
# TODO
# Synchronize the OpenNebula VM representation with vCenter VM
def sync(deploy = {})
extraconfig = []
@ -1652,6 +1767,8 @@ class VirtualMachine < VCenterDriver::Template
end
end
# try to get specs for new attached disks
# using disk_each method with :no_exists? condition
def attach_disks_specs()
attach_disk_array = []
attach_spod_array = []
@ -1677,6 +1794,8 @@ class VirtualMachine < VCenterDriver::Template
return attach_disk_array, attach_spod_array, attach_spod_disk_info
end
# try to get specs for detached disks
# using disk_each method with :dechaded? condition
def detach_disks_specs()
detach_disk_array = []
extra_config = []
@ -1700,7 +1819,14 @@ class VirtualMachine < VCenterDriver::Template
return detach_disk_array, extra_config
end
# TODO
# sync OpenNebula disk model with vCenter
#
# @param option [symbol] if :all is provided the method will try to sync
# all the disks (detached and not existing ones) otherwishe it will only sync
# the disks that are not existing
#
# @param execute [boolean] indicates if the reconfigure operation is going to
# be executed
def sync_disks(option = :nil, execute = true)
info_disks
@ -1731,11 +1857,10 @@ class VirtualMachine < VCenterDriver::Template
info_disks
end
# TODO position? and disk size for volatile?
# TO DEPRECATE: build new attach using new tm
# Attach DISK to VM (hotplug)
def attach_disk
# TODO position? and disk size for volatile?
spec_hash = {}
disk = nil
device_change = []