1
0
Fork 0
mirror of https://github.com/fog/fog.git synced 2022-11-09 13:51:43 -05:00

disks fully refactor to use the vcloud classes

This commit is contained in:
Rodrigo Estebanez 2013-07-09 16:55:06 +02:00
parent 7b909e3eee
commit bbe99349e5
5 changed files with 120 additions and 106 deletions

View file

@ -1,26 +1,26 @@
# 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}]}
# {"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
#
@ -59,17 +59,17 @@ module Fog
class Disks
def initialize(items=[])
@items = items['disks']
@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}"
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
raise "Hard disk size can't be reduced" if item[:capacity].to_i > new_size.to_i
item[:capacity] = new_size
end
end
end
@ -79,26 +79,26 @@ module Fog
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
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['element_name'] =~ /#{disk_number}$/ }
@items.delete_if {|item| item[:resource_type] == 17 && item[:name] =~ /#{disk_number}$/ }
end
def disks
{ 'disks' => @items }
{ :disks => @items }
end
def generate_xml
output = ""
output << header
@items.each do |item|
output << case item['resource_type']
output << case item[:resource_type]
when 6
scsi_controller(item)
when 17
@ -123,33 +123,33 @@ module Fog
def hard_disk_item(opts={})
"<vcloud:Item>
<rasd:AddressOnParent>#{opts['address_on_parent']}</rasd:AddressOnParent>
<rasd:Description>#{opts['description']}</rasd:Description>
<rasd:ElementName>#{opts['element_name']}</rasd:ElementName>
<rasd:HostResource vcloud:capacity=\"#{opts['capacity']}\" vcloud:busSubType=\"#{opts['bus_sub_type']}\" vcloud:busType=\"#{opts['bus_type']}\"></rasd:HostResource>
<rasd:InstanceID>#{opts['instance_id']}</rasd:InstanceID>
<rasd:Parent>#{opts['parent']}</rasd:Parent>
<rasd:AddressOnParent>#{opts[:address_on_parent]}</rasd:AddressOnParent>
<rasd:Description>#{opts[:description]}</rasd:Description>
<rasd:ElementName>#{opts[:name]}</rasd:ElementName>
<rasd:HostResource vcloud:capacity=\"#{opts[:capacity]}\" vcloud:busSubType=\"#{opts[:bus_sub_type]}\" vcloud:busType=\"#{opts[:bus_type]}\"></rasd:HostResource>
<rasd:InstanceID>#{opts[:id]}</rasd:InstanceID>
<rasd:Parent>#{opts[:parent]}</rasd:Parent>
<rasd:ResourceType>17</rasd:ResourceType>
</vcloud:Item>"
end
def ide_controller_item(opts={})
"<vcloud:Item>
<rasd:Address>#{opts['address']}</rasd:Address>
<rasd:Description>#{opts['description']}</rasd:Description>
<rasd:ElementName>#{opts['element_name']}</rasd:ElementName>
<rasd:InstanceID>#{opts['instance_id']}</rasd:InstanceID>
<rasd:Address>#{opts[:address]}</rasd:Address>
<rasd:Description>#{opts[:description]}</rasd:Description>
<rasd:ElementName>#{opts[:name]}</rasd:ElementName>
<rasd:InstanceID>#{opts[:id]}</rasd:InstanceID>
<rasd:ResourceType>5</rasd:ResourceType>
</vcloud:Item>"
end
def scsi_controller(opts={})
"<vcloud:Item>
<rasd:Address>#{opts['address']}</rasd:Address>
<rasd:Description>#{opts['description']}</rasd:Description>
<rasd:ElementName>#{opts['element_name']}</rasd:ElementName>
<rasd:InstanceID>#{opts['instance_id']}</rasd:InstanceID>
<rasd:ResourceSubType>#{opts['resource_sub_type']}</rasd:ResourceSubType>
<rasd:Address>#{opts[:address]}</rasd:Address>
<rasd:Description>#{opts[:description]}</rasd:Description>
<rasd:ElementName>#{opts[:name]}</rasd:ElementName>
<rasd:InstanceID>#{opts[:id]}</rasd:InstanceID>
<rasd:ResourceSubType>#{opts[:resource_sub_type]}</rasd:ResourceSubType>
<rasd:ResourceType>6</rasd:ResourceType>
</vcloud:Item>"
end
@ -157,11 +157,11 @@ module Fog
# 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
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["element_name"] =~ /#{last_number}$/ }
hard_disks.detect{|hard_disk| hard_disk[:name] =~ /#{last_number}$/ }
end
def increase_hard_disk_name(hard_disk_name)

View file

@ -4,17 +4,13 @@ module Fog
module Compute
class Vcloudng
class Disk < Fog::Model
class Disk < Fog::Model # there is no lazy_load in disks
identity :id
identity :id, :aliases => 'instance_id'
identity :vm_id
attribute :address
attribute :description
attribute :element_name
attribute :instance_id
attribute :name
attribute :resource_sub_type
attribute :resource_type
attribute :address_on_parent
@ -30,9 +26,9 @@ module Fog
attributes[:capacity] = new_capacity.to_i
if not_first_set && has_changed
data = Fog::Generators::Compute::Vcloudng::Disks.new(all_disks)
num_disk = element_name.scan(/\d+/).first.to_i
num_disk = name.scan(/\d+/).first.to_i
data.modify_hard_disk_size(num_disk, new_capacity)
response = service.put_vm_disks(vm_id, data.disks)
response = service.put_vm_disks(attributes[:vm].id, data.disks)
service.process_task(response.body)
end
end
@ -42,10 +38,10 @@ module Fog
end
def destroy
num_disk = element_name.scan(/\d+/).first.to_i
num_disk = name.scan(/\d+/).first.to_i
data = Fog::Generators::Compute::Vcloudng::Disks.new(all_disks)
data.delete_hard_disk(num_disk)
response = service.put_vm_disks(vm_id, data.disks)
response = service.put_vm_disks(attributes[:vm].id, data.disks)
service.process_task(response.body)
end

View file

@ -5,45 +5,63 @@ module Fog
module Compute
class Vcloudng
class Disks < Fog::Collection
class Disks < Collection
model Fog::Compute::Vcloudng::Disk
attribute :vm_id
attribute :vm
def index
disks.map{ |disk| new(disk.merge(all_disks: @disks, vm_id: vm_id))}
end
def all
index
end
def get(instance_id)
disk = disks.detect{ |disk| disk['InstanceID'] == instance_id }
return nil unless disk
new(disk.merge(all_disks: @disks, vm_id: vm_id))
end
def get_by_name(disk_name)
disk = disks.detect{ |disk| disk['element_name'] == disk_name }
return nil unless disk
new(disk.merge(all_disks: @disks, vm_id: vm_id))
end
# def index
# disks.map{ |disk| new(disk.merge(all_disks: @disks, vm_id: vm_id))}
# end
#
# def all
# index
# end
#
# def get(instance_id)
# disk = disks.detect{ |disk| disk['InstanceID'] == instance_id }
# return nil unless disk
# new(disk.merge(all_disks: @disks, vm_id: vm_id))
# end
#
# def get_by_name(disk_name)
# disk = disks.detect{ |disk| disk['element_name'] == disk_name }
# return nil unless disk
# new(disk.merge(all_disks: @disks, vm_id: vm_id))
# end
def create(size)
disks unless @disks
item_list unless @disks
data = Fog::Generators::Compute::Vcloudng::Disks.new(@disks)
puts data
puts data.disks
data.add_hard_disk(size)
response = service.put_vm_disks(vm_id, data.disks)
response = service.put_vm_disks(vm.id, data.disks)
service.process_task(response.body)
end
private
def disks
@disks = service.get_vm_disks(vm_id).body
@disks['disks']
def get_by_id(item_id)
item = item_list.detect{ |i| i[:id] == item_id}
item.merge!(all_disks: @disks, vm: vm) if item
item
end
def item_list
@disks = service.get_vm_disks(vm.id).body
items = @disks[:disks]
items.each do |disk|
disk[:all_disks] = @disks
disk[:vm] = vm
end
items
end
# private
# def disks
# @disks = service.get_vm_disks(vm_id).body
# @disks['disks']
# end
end
end

View file

@ -28,7 +28,7 @@ module Fog
def tags
requires :id
service.tags(:vm_id => id)
service.tags(:vm => self)
end
def customization
@ -43,7 +43,7 @@ module Fog
def disks
requires :id
service.disks(:vm_id => id)
service.disks(:vm => self)
end
#def reload

View file

@ -9,7 +9,7 @@ module Fog
def reset
@disk = {}
@response = { 'disks' => [] }
@response = { :disks => [] }
@host_resource = nil
end
@ -24,28 +24,28 @@ module Fog
def end_element(name)
case name
when 'Address'
@disk['address'] = value.to_i
@disk[:address] = value.to_i
when 'AddressOnParent'
@disk['address_on_parent'] = value.to_i
@disk[:address_on_parent] = value.to_i
when 'Description'
@disk['description'] = value
@disk[:description] = value
when 'ElementName'
@disk['element_name'] = value
@disk[:name] = value
when 'InstanceID'
@disk['instance_id'] = value.to_i
@disk[:id] = value.to_i
when 'ResourceSubType'
@disk['resource_sub_type'] = value
@disk[:resource_sub_type] = value
when 'Parent'
@disk['parent'] = value.to_i
@disk[:parent] = value.to_i
when 'ResourceType'
@disk['resource_type'] = value.to_i
@disk[:resource_type] = value.to_i
when 'Item'
if @host_resource
@disk['capacity'] = @host_resource['capacity'].to_i
@disk['bus_sub_type'] = @host_resource['busSubType']
@disk['bus_type'] = @host_resource['busType'].to_i
@disk[:capacity] = @host_resource[:capacity].to_i
@disk[:bus_sub_type] = @host_resource[:busSubType]
@disk[:bus_type] = @host_resource[:busType].to_i
end
@response['disks'] << @disk
@response[:disks] << @disk
@host_resource = nil
@disk = {}
end