lib/MiqVm/miq_azure_vm.rb
require 'MiqVm/MiqVm'
require 'disk/modules/AzureBlobDisk'
require 'disk/modules/AzureManagedDisk'
require 'disk/modules/miq_disk_cache'
class MiqAzureVm < MiqVm
def initialize(azure_handle, args)
@azure_handle = azure_handle
@uri = nil
@disk_name = nil
@resource_group = args[:resource_group]
@managed_image = args[:managed_image]
raise ArgumentError, "MiqAzureVm: missing required arg :name" unless (@name = args[:name])
if args[:image_uri]
@uri = args[:image_uri]
elsif args[:managed_image]
@disk_name = args[:managed_image]
elsif args[:resource_group] && args[:name]
vm_obj = vm_svc.get(@name, @resource_group)
os_disk = vm_obj.properties.storage_profile.os_disk
if vm_obj.managed_disk?
#
# Use the Smartstate SNAPSHOT Added by the Provider
#
raise ArgumentError, "MiqAzureVm: missing required arg :snapshot for Managed Disk" unless (@disk_name = args[:snapshot])
else
#
# Non-Managed Disk Snapshot handling
#
@uri = os_disk.vhd.uri
@uri << "?snapshot=#{args[:snapshot]}" if args[:snapshot]
end
else
raise ArgumentError, "MiqAzureVm: missing required args: :image_uri or :resource_group"
end
super(getCfg)
end
def getCfg
cfg_hash = {}
cfg_hash['displayname'] = @name
file_name = @uri ? @uri : @disk_name
$log.debug("MiqAzureVm#getCfg: disk = #{file_name}")
tag = "scsi0:0"
cfg_hash["#{tag}.present"] = "true"
cfg_hash["#{tag}.devicetype"] = "disk"
cfg_hash["#{tag}.filename"] = file_name
cfg_hash
end
def openDisks(diskFiles)
p_volumes = []
$log.debug("openDisks: #{diskFiles.size} disk files supplied.")
#
# Build a list of the VM's physical volumes.
#
diskFiles.each do |dtag, df|
$log.debug "openDisks: processing disk file (#{dtag}): #{df}"
d_info = open_disks_info(dtag, df)
begin
if @uri
d = MiqDiskCache.new(AzureBlobDisk.new(sa_svc, @uri, d_info), 100, 128)
elsif @managed_image
d = MiqDiskCache.new(AzureManagedDisk.new(disk_svc, @disk_name, d_info), 200, 512)
else
d = MiqDiskCache.new(AzureManagedDisk.new(snap_svc, @disk_name, d_info), 200, 512)
end
rescue => err
$log.error("#{err}: Couldn't open disk file: #{df}")
$log.debug err.backtrace.join("\n")
@diskInitErrors[df] = err.to_s
next
end
@wholeDisks << d
p = d.getPartitions
if p.empty?
#
# If the disk has no partitions, the whole disk can be a single volume.
#
p_volumes << d
else
#
# If the disk is partitioned, the partitions are physical volumes,
# but not the whild disk.
#
p_volumes.concat(p)
end
end
p_volumes
end # def openDisks
def open_disks_info(disk_tag, disk_file)
disk_info = OpenStruct.new
disk_info.fileName = disk_file
disk_info.hardwareId = disk_tag
disk_format = @vmConfig.getHash["#{disk_tag}.format"]
disk_info.format = disk_format unless disk_format.blank?
disk_info.rawDisk = true
disk_info.resource_group = @resource_group
disk_info
end
def vm_svc
@vm_svc ||= Azure::Armrest::VirtualMachineService.new(@azure_handle)
end
def sa_svc
@sa_svc ||= Azure::Armrest::StorageAccountService.new(@azure_handle)
end
def snap_svc
@snap_svc ||= Azure::Armrest::Storage::SnapshotService.new(@azure_handle)
end
def disk_svc
@disk_svc ||= Azure::Armrest::Storage::DiskService.new(@azure_handle)
end
end