module Fog
module Generators
module Compute
module VcloudDirector
# This is the data structure it accepts, this is the output of
# #get_vm_disks:
#
# {:disks=>
# [{:address=>0,
# :description=>"SCSI Controller",
# :name=>"SCSI Controller 0",
# :id=>2,
# :resource_sub_type=>"VirtualSCSI",
# :resource_type=>6},
# {:address_on_parent=>0,
# :description=>"Hard disk",
# :name=>"Hard disk 1",
# :id=>2000,
# :parent=>2,
# :resource_type=>17,
# :capacity=>16384,
# :bus_sub_type=>"VirtualSCSI",
# :bus_type=>6},
# {:address=>0,
# :description=>"IDE Controller",
# :name=>"IDE Controller 0",
# :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
#
#
#
# @see http://pubs.vmware.com/vcd-51/topic/com.vmware.vcloud.api.reference.doc_51/doc/types/RasdItemsListType.html
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[: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[:name] = increase_hard_disk_name(new_hard_disk[:name])
new_hard_disk[:address_on_parent] += 1
new_hard_disk[:id] += 1
@items << new_hard_disk
end
def delete_hard_disk(disk_number)
@items.delete_if {|item| item[:resource_type] == 17 && item[: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
END
end
def tail
<<-END
END
end
def hard_disk_item(opts={})
<<-END
#{opts[:address_on_parent]}
#{opts[:description]}
#{opts[:name]}
#{opts[:id]}
#{opts[:parent]}
17
END
end
def ide_controller_item(opts={})
<<-END
#{opts[:address]}
#{opts[:description]}
#{opts[:name]}
#{opts[:id]}
5
END
end
def scsi_controller(opts={})
<<-END
#{opts[:address]}
#{opts[:description]}
#{opts[:name]}
#{opts[:id]}
#{opts[:resource_sub_type]}
6
END
end
# helpers
def last_hard_disk
hard_disks = @items.select{|item| item[:resource_type] == 17}
names = hard_disks.map{|item| item[:name] }
only_numbers = 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[: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