40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
# File 'lib/fog/vcloud/requests/compute/configure_vm_disks.rb', line 40
def generate_configure_vm_disks_request(href, disk_data)
xmlns = {
"xmlns:rasd" => "http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData",
"xmlns" => "http://www.vmware.com/vcloud/v1"
}
xml = Nokogiri::XML(request( :uri => href).body)
real_disks = xml.xpath("//rasd:ResourceType[ .='17']/..", xmlns)
real_disk_numbers = real_disks.map { |disk| disk.at('.//rasd:AddressOnParent', xmlns).content }
disk_numbers = disk_data.map { |vdisk| vdisk[:"rasd:AddressOnParent"].to_s }
if disk_data.length < real_disks.length
remove_disk_numbers = real_disk_numbers - disk_numbers
remove_disk_numbers.each do |number|
if result = xml.at("//rasd:ResourceType[ .='17']/../rasd:AddressOnParent[.='#{number}']/..", xmlns)
result.remove
end
end
elsif disk_data.length > real_disks.length
add_disk_numbers = disk_numbers - real_disk_numbers
add_disk_numbers.each do |number|
new_disk = real_disks.first.dup
new_disk.at('.//rasd:AddressOnParent', xmlns).content = number.to_i new_disk.at('.//rasd:HostResource', xmlns)["vcloud:capacity"] = disk_data.detect { |disk| disk[:'rasd:AddressOnParent'].to_s == number.to_s }[:'rasd:HostResource'][:vcloud_capacity].to_s
new_disk.at('.//rasd:HostResource', xmlns)["xmlns:vcloud"] = xmlns['xmlns']
new_disk.at('.//rasd:InstanceID', xmlns).content = (2000 + number.to_i).to_s
new_disk.at('.//rasd:ElementName', xmlns).content = "Hard disk #{number.to_i + 1}"
real_disks.first.parent << new_disk
end
end
xml.to_s
end
|