# This is the data structure it accepts, this is the output of get_vm_disks # # {"disks"=> # [{"address"=>0, # "description"=>"SCSI Controller", # "element_name"=>"SCSI Controller 0", # "instance_id"=>2, # "resource_sub_type"=>"VirtualSCSI", # "resource_type"=>6}, # {"address_on_parent"=>0, # "description"=>"Hard disk", # "element_name"=>"Hard disk 1", # "instance_id"=>2000, # "parent"=>2, # "resource_type"=>17, # "capacity"=>16384, # "bus_sub_type"=>"VirtualSCSI", # "bus_type"=>6}, # {"address"=>0, # "description"=>"IDE Controller", # "element_name"=>"IDE Controller 0", # "instance_id"=>3, # "resource_type"=>5}]} # This is what it generates # # # # 0 # SCSI Controller # SCSI Controller 0 # 2 # VirtualSCSI # 6 # # 0 # Hard disk # Hard disk 1 # # 2000 # 2 # 17 # # 0 # IDE Controller # IDE Controller 0 # 3 # 5 # # module Fog module Generators module Compute module Vcloudng class Disks def initialize(items=[]) @items = items['disks'] end def modify_hard_disk_size(disk_number, new_size) found = false @items.each do |item| if item['resource_type'] == 17 if item['element_name'] == "Hard disk #{disk_number}" found = true raise "Hard disk size can't be reduced" if item['capacity'].to_i > new_size.to_i item['capacity'] = new_size end end end raise "Hard disk #{disk_number} not found" unless found true end def add_hard_disk(size) new_hard_disk = last_hard_disk.dup new_hard_disk['capacity'] = size new_hard_disk['element_name'] = increase_hard_disk_name(new_hard_disk['element_name']) new_hard_disk['address_on_parent'] += 1 new_hard_disk['instance_id'] += 1 @items << new_hard_disk end def delete_hard_disk(disk_number) @items.delete_if {|item| item['resource_type'] == 17 && item['element_name'] =~ /#{disk_number}$/ } end def disks { 'disks' => @items } end def generate_xml output = "" output << header @items.each do |item| output << case item['resource_type'] when 6 scsi_controller(item) when 17 hard_disk_item(item) when 5 ide_controller_item(item) end end output << tail output end def header '' end def tail '' end def hard_disk_item(opts={}) " #{opts['address_on_parent']} #{opts['description']} #{opts['element_name']} #{opts['instance_id']} #{opts['parent']} 17 " end def ide_controller_item(opts={}) " #{opts['address']} #{opts['description']} #{opts['element_name']} #{opts['instance_id']} 5 " end def scsi_controller(opts={}) " #{opts['address']} #{opts['description']} #{opts['element_name']} #{opts['instance_id']} #{opts['resource_sub_type']} 6 " end # helpers def last_hard_disk hard_disks = @items.select{|item| item['resource_type'] == 17} element_names = hard_disks.map{|item| item['element_name'] } only_numbers = element_names.map{|b| b.scan(/\d+/).first.to_i} # extract numbers last_number = only_numbers.sort.last # get the last number hard_disks.detect{|hard_disk| hard_disk["element_name"] =~ /#{last_number}$/ } end def increase_hard_disk_name(hard_disk_name) hard_disk_name.gsub(/(\d+)$/) { $1.to_i + 1 } end end end end end end