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:
parent
7b909e3eee
commit
bbe99349e5
5 changed files with 120 additions and 106 deletions
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue