ruby_vcloud_sdk 0.5.1 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +182 -3
- data/lib/ruby_vcloud_sdk/catalog.rb +18 -13
- data/lib/ruby_vcloud_sdk/client.rb +10 -1
- data/lib/ruby_vcloud_sdk/connection/connection.rb +1 -1
- data/lib/ruby_vcloud_sdk/disk.rb +1 -13
- data/lib/ruby_vcloud_sdk/infrastructure.rb +11 -1
- data/lib/ruby_vcloud_sdk/internal_disk.rb +12 -0
- data/lib/ruby_vcloud_sdk/network.rb +8 -3
- data/lib/ruby_vcloud_sdk/right_record.rb +12 -0
- data/lib/ruby_vcloud_sdk/vapp.rb +85 -0
- data/lib/ruby_vcloud_sdk/vdc.rb +61 -41
- data/lib/ruby_vcloud_sdk/vm.rb +233 -0
- data/lib/ruby_vcloud_sdk/xml/constants.rb +10 -0
- data/lib/ruby_vcloud_sdk/xml/wrapper.rb +10 -1
- data/lib/ruby_vcloud_sdk/xml/wrapper_classes/disk.rb +1 -1
- data/lib/ruby_vcloud_sdk/xml/wrapper_classes/ip_ranges.rb +16 -0
- data/lib/ruby_vcloud_sdk/xml/wrapper_classes/ip_scope.rb +4 -0
- data/lib/ruby_vcloud_sdk/xml/wrapper_classes/network_config_section.rb +4 -6
- data/lib/ruby_vcloud_sdk/xml/wrapper_classes/org_vdc_network.rb +0 -4
- data/lib/ruby_vcloud_sdk/xml/wrapper_classes/product_section.rb +35 -0
- data/lib/ruby_vcloud_sdk/xml/wrapper_classes/product_section_list.rb +14 -0
- data/lib/ruby_vcloud_sdk/xml/wrapper_classes/query_result_records.rb +4 -0
- data/lib/ruby_vcloud_sdk/xml/wrapper_classes/virtual_hardware_section.rb +6 -4
- data/lib/ruby_vcloud_sdk/xml/wrapper_classes/vm.rb +31 -47
- data/lib/ruby_vcloud_sdk/xml/wrapper_classes.rb +2 -0
- data/lib/ruby_vcloud_sdk/xml/xml_templates/NetworkConfig.xml +1 -6
- data/lib/ruby_vcloud_sdk/xml/xml_templates/ProductSectionList.xml +8 -1
- metadata +29 -13
- checksums.yaml +0 -7
data/lib/ruby_vcloud_sdk/vdc.rb
CHANGED
@@ -15,23 +15,15 @@ module VCloudSdk
|
|
15
15
|
include Infrastructure
|
16
16
|
|
17
17
|
extend Forwardable
|
18
|
-
def_delegators
|
18
|
+
def_delegators :entity_xml,
|
19
19
|
:name, :upload_link, :upload_media_link,
|
20
20
|
:instantiate_vapp_template_link
|
21
21
|
|
22
|
-
|
23
|
-
"scsi" => Xml::HARDWARE_TYPE[:SCSI_CONTROLLER]
|
24
|
-
}
|
22
|
+
public :find_network_by_name
|
25
23
|
|
26
|
-
|
27
|
-
"lsilogic" => Xml::BUS_SUB_TYPE[:LSILOGIC]
|
28
|
-
}
|
29
|
-
|
30
|
-
private_constant :BUS_TYPE, :BUS_SUB_TYPE
|
31
|
-
|
32
|
-
def initialize(session, vdc_xml_obj)
|
24
|
+
def initialize(session, link)
|
33
25
|
@session = session
|
34
|
-
@
|
26
|
+
@link = link
|
35
27
|
end
|
36
28
|
|
37
29
|
def storage_profiles
|
@@ -57,19 +49,19 @@ module VCloudSdk
|
|
57
49
|
end
|
58
50
|
|
59
51
|
def vapps
|
60
|
-
|
52
|
+
entity_xml.vapps.map do |vapp_link|
|
61
53
|
VCloudSdk::VApp.new(@session, vapp_link)
|
62
54
|
end
|
63
55
|
end
|
64
56
|
|
65
57
|
def list_vapps
|
66
|
-
|
58
|
+
entity_xml.vapps.map do |vapp_link|
|
67
59
|
vapp_link.name
|
68
60
|
end
|
69
61
|
end
|
70
62
|
|
71
63
|
def find_vapp_by_name(name)
|
72
|
-
|
64
|
+
entity_xml.vapps.each do |vapp_link|
|
73
65
|
if vapp_link.name == name
|
74
66
|
return VCloudSdk::VApp.new(@session, vapp_link)
|
75
67
|
end
|
@@ -79,8 +71,8 @@ module VCloudSdk
|
|
79
71
|
end
|
80
72
|
|
81
73
|
def resources
|
82
|
-
cpu = VCloudSdk::CPU.new(
|
83
|
-
memory = VCloudSdk::Memory.new(
|
74
|
+
cpu = VCloudSdk::CPU.new(entity_xml.available_cpu_cores)
|
75
|
+
memory = VCloudSdk::Memory.new(entity_xml.available_memory_mb)
|
84
76
|
VCloudSdk::Resources.new(cpu, memory)
|
85
77
|
end
|
86
78
|
|
@@ -96,19 +88,9 @@ module VCloudSdk
|
|
96
88
|
end
|
97
89
|
end
|
98
90
|
|
99
|
-
def find_network_by_name(name)
|
100
|
-
@session.org.networks.each do |network_link|
|
101
|
-
if network_link.name == name
|
102
|
-
return VCloudSdk::Network.new(@session, network_link)
|
103
|
-
end
|
104
|
-
end
|
105
|
-
|
106
|
-
fail ObjectNotFoundError, "Network '#{name}' is not found"
|
107
|
-
end
|
108
|
-
|
109
91
|
def edge_gateways
|
110
92
|
connection
|
111
|
-
.get(
|
93
|
+
.get(entity_xml.edge_gateways_link)
|
112
94
|
.edge_gateway_records
|
113
95
|
.map do |edge_gateway_link|
|
114
96
|
VCloudSdk::EdgeGateway.new(@session, edge_gateway_link.href)
|
@@ -116,19 +98,19 @@ module VCloudSdk
|
|
116
98
|
end
|
117
99
|
|
118
100
|
def disks
|
119
|
-
|
101
|
+
entity_xml.disks.map do |disk_link|
|
120
102
|
VCloudSdk::Disk.new(@session, disk_link)
|
121
103
|
end
|
122
104
|
end
|
123
105
|
|
124
106
|
def list_disks
|
125
|
-
|
107
|
+
entity_xml.disks.map do |disk_link|
|
126
108
|
disk_link.name
|
127
109
|
end
|
128
110
|
end
|
129
111
|
|
130
112
|
def find_disks_by_name(name)
|
131
|
-
disks =
|
113
|
+
disks = entity_xml
|
132
114
|
.disks
|
133
115
|
.select { |disk_link| disk_link.name == name }
|
134
116
|
.map { |disk_link| VCloudSdk::Disk.new(@session, disk_link.href) }
|
@@ -148,28 +130,28 @@ module VCloudSdk
|
|
148
130
|
|
149
131
|
def create_disk(
|
150
132
|
name,
|
151
|
-
|
133
|
+
capacity,
|
152
134
|
vm = nil,
|
153
135
|
bus_type = "scsi",
|
154
136
|
bus_sub_type = "lsilogic")
|
155
137
|
|
156
138
|
fail(CloudError,
|
157
|
-
"Invalid size in MB #{
|
139
|
+
"Invalid size in MB #{capacity}") if capacity <= 0
|
158
140
|
|
159
|
-
bus_type =
|
141
|
+
bus_type = Xml::BUS_TYPE_NAMES[bus_type.downcase]
|
160
142
|
fail(CloudError,
|
161
143
|
"Invalid bus type!") unless bus_type
|
162
144
|
|
163
|
-
bus_sub_type =
|
145
|
+
bus_sub_type = Xml::BUS_SUB_TYPE_NAMES[bus_sub_type.downcase]
|
164
146
|
fail(CloudError,
|
165
147
|
"Invalid bus sub type!") unless bus_sub_type
|
166
148
|
|
167
149
|
Config
|
168
150
|
.logger
|
169
|
-
.info "Creating independent disk #{name} of #{
|
151
|
+
.info "Creating independent disk #{name} of #{capacity}MB."
|
170
152
|
|
171
|
-
disk = connection.post(
|
172
|
-
disk_create_params(name,
|
153
|
+
disk = connection.post(entity_xml.add_disk_link,
|
154
|
+
disk_create_params(name, capacity, bus_type, bus_sub_type, vm),
|
173
155
|
Xml::MEDIA_TYPE[:DISK_CREATE_PARAMS])
|
174
156
|
|
175
157
|
wait_for_running_tasks(disk, "Disk #{name}")
|
@@ -177,10 +159,36 @@ module VCloudSdk
|
|
177
159
|
VCloudSdk::Disk.new(@session, disk.href)
|
178
160
|
end
|
179
161
|
|
162
|
+
def delete_disk_by_name(name)
|
163
|
+
disks = find_disks_by_name(name)
|
164
|
+
fail CloudError,
|
165
|
+
"#{disks.size} disks with name #{name} were found" if disks.size > 1
|
166
|
+
|
167
|
+
delete_single_disk(disks.first)
|
168
|
+
nil
|
169
|
+
end
|
170
|
+
|
171
|
+
def delete_all_disks_by_name(name)
|
172
|
+
disks = find_disks_by_name(name)
|
173
|
+
success = true
|
174
|
+
disks.each do |disk|
|
175
|
+
begin
|
176
|
+
delete_single_disk(disk)
|
177
|
+
rescue RuntimeError => e
|
178
|
+
success = false
|
179
|
+
Config.logger.error("Disk deletion failed with exception: #{e}")
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
fail CloudError,
|
184
|
+
"Failed to delete one or more of the disks with name '#{name}'. Check logs for details." unless success
|
185
|
+
nil
|
186
|
+
end
|
187
|
+
|
180
188
|
def storage_profile_xml_node(name)
|
181
189
|
return nil if name.nil?
|
182
190
|
|
183
|
-
storage_profile =
|
191
|
+
storage_profile = entity_xml.storage_profile(name)
|
184
192
|
unless storage_profile
|
185
193
|
fail ObjectNotFoundError,
|
186
194
|
"Storage profile '#{name}' does not exist"
|
@@ -197,14 +205,26 @@ module VCloudSdk
|
|
197
205
|
.org_vdc_storage_profile_records
|
198
206
|
end
|
199
207
|
|
200
|
-
def disk_create_params(name,
|
208
|
+
def disk_create_params(name, capacity, bus_type, bus_sub_type, vm)
|
201
209
|
Xml::WrapperFactory.create_instance("DiskCreateParams").tap do |params|
|
202
210
|
params.name = name
|
203
|
-
params.size_bytes =
|
211
|
+
params.size_bytes = capacity * 1024 * 1024 # VCD expects bytes
|
204
212
|
params.bus_type = bus_type
|
205
213
|
params.bus_sub_type = bus_sub_type
|
206
214
|
params.add_locality(connection.get(vm.href)) if vm # Use xml form of vm
|
207
215
|
end
|
208
216
|
end
|
217
|
+
|
218
|
+
def delete_single_disk(disk)
|
219
|
+
Config.logger.info "Deleting disk '#{disk.name}', link #{disk.href}"
|
220
|
+
fail CloudError,
|
221
|
+
"Disk '#{disk.name}', link #{disk.href} is attached to VM '#{disk.vm.name}'" if disk.attached?
|
222
|
+
|
223
|
+
entity_xml = connection.get(disk.href)
|
224
|
+
task = connection.delete(entity_xml.remove_link.href)
|
225
|
+
monitor_task(task)
|
226
|
+
|
227
|
+
Config.logger.info "Disk deleted successfully"
|
228
|
+
end
|
209
229
|
end
|
210
230
|
end
|
data/lib/ruby_vcloud_sdk/vm.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require "forwardable"
|
2
2
|
require_relative "infrastructure"
|
3
3
|
require_relative "powerable"
|
4
|
+
require_relative "internal_disk"
|
4
5
|
|
5
6
|
module VCloudSdk
|
6
7
|
class VM
|
@@ -19,6 +20,78 @@ module VCloudSdk
|
|
19
20
|
@link
|
20
21
|
end
|
21
22
|
|
23
|
+
# returns size of memory in megabytes
|
24
|
+
def memory
|
25
|
+
m = entity_xml
|
26
|
+
.hardware_section
|
27
|
+
.memory
|
28
|
+
allocation_units = m.get_rasd_content(Xml::RASD_TYPES[:ALLOCATION_UNITS])
|
29
|
+
bytes = eval_memory_allocation_units(allocation_units)
|
30
|
+
|
31
|
+
virtual_quantity = m.get_rasd_content(Xml::RASD_TYPES[:VIRTUAL_QUANTITY]).to_i
|
32
|
+
memory_mb = virtual_quantity * bytes / BYTES_PER_MEGABYTE
|
33
|
+
fail CloudError,
|
34
|
+
"Size of memory is less than 1 MB." if memory_mb == 0
|
35
|
+
memory_mb
|
36
|
+
end
|
37
|
+
|
38
|
+
# sets size of memory in megabytes
|
39
|
+
def memory=(size)
|
40
|
+
fail(CloudError,
|
41
|
+
"Invalid vm memory size #{size}MB") if size <= 0
|
42
|
+
|
43
|
+
Config
|
44
|
+
.logger
|
45
|
+
.info "Changing the vm memory to #{size}MB."
|
46
|
+
|
47
|
+
payload = entity_xml
|
48
|
+
payload.change_memory(size)
|
49
|
+
|
50
|
+
task = connection.post(payload.reconfigure_link.href,
|
51
|
+
payload,
|
52
|
+
Xml::MEDIA_TYPE[:VM])
|
53
|
+
monitor_task(task)
|
54
|
+
self
|
55
|
+
end
|
56
|
+
|
57
|
+
# returns number of virtual cpus of VM
|
58
|
+
def vcpu
|
59
|
+
cpus = entity_xml
|
60
|
+
.hardware_section
|
61
|
+
.cpu
|
62
|
+
.get_rasd_content(Xml::RASD_TYPES[:VIRTUAL_QUANTITY])
|
63
|
+
|
64
|
+
fail CloudError,
|
65
|
+
"Uable to retrieve number of virtual cpus of VM #{name}" if cpus.nil?
|
66
|
+
cpus.to_i
|
67
|
+
end
|
68
|
+
|
69
|
+
# sets number of virtual cpus of VM
|
70
|
+
def vcpu=(count)
|
71
|
+
fail(CloudError,
|
72
|
+
"Invalid virtual CPU count #{count}") if count <= 0
|
73
|
+
|
74
|
+
Config
|
75
|
+
.logger
|
76
|
+
.info "Changing the virtual CPU count to #{count}."
|
77
|
+
|
78
|
+
payload = entity_xml
|
79
|
+
payload.change_cpu_count(count)
|
80
|
+
|
81
|
+
task = connection.post(payload.reconfigure_link.href,
|
82
|
+
payload,
|
83
|
+
Xml::MEDIA_TYPE[:VM])
|
84
|
+
monitor_task(task)
|
85
|
+
self
|
86
|
+
end
|
87
|
+
|
88
|
+
def list_networks
|
89
|
+
entity_xml
|
90
|
+
.network_connection_section
|
91
|
+
.network_connections
|
92
|
+
.map { |network_connection| network_connection.network }
|
93
|
+
end
|
94
|
+
|
22
95
|
def independent_disks
|
23
96
|
hardware_section = entity_xml.hardware_section
|
24
97
|
disks = []
|
@@ -108,6 +181,115 @@ module VCloudSdk
|
|
108
181
|
monitor_task(task)
|
109
182
|
end
|
110
183
|
|
184
|
+
def add_nic(
|
185
|
+
network_name,
|
186
|
+
ip_addressing_mode = Xml::IP_ADDRESSING_MODE[:POOL],
|
187
|
+
ip = nil)
|
188
|
+
fail CloudError,
|
189
|
+
"Invalid IP_ADDRESSING_MODE '#{ip_addressing_mode}'" unless Xml::IP_ADDRESSING_MODE
|
190
|
+
.each_value
|
191
|
+
.any? { |m| m == ip_addressing_mode }
|
192
|
+
|
193
|
+
fail CloudError,
|
194
|
+
"IP is missing for MANUAL IP_ADDRESSING_MODE" if ip_addressing_mode == Xml::IP_ADDRESSING_MODE[:MANUAL] &&
|
195
|
+
ip.nil?
|
196
|
+
|
197
|
+
fail ObjectNotFoundError,
|
198
|
+
"Network #{network_name} is not added to parent VApp #{vapp.name}" unless vapp
|
199
|
+
.list_networks
|
200
|
+
.any? { |n| n == network_name }
|
201
|
+
|
202
|
+
payload = entity_xml
|
203
|
+
fail CloudError,
|
204
|
+
"VM #{name} is powered-on and cannot add NIC." if is_status?(payload, :POWERED_ON)
|
205
|
+
|
206
|
+
nic_index = list_networks.size # nic index begins with 0
|
207
|
+
|
208
|
+
Config.logger
|
209
|
+
.info("Adding NIC #{nic_index}, network #{network_name} using mode '#{ip_addressing_mode}' #{ip.nil? ? "" : "IP: #{ip}"}")
|
210
|
+
|
211
|
+
# Add NIC
|
212
|
+
payload
|
213
|
+
.hardware_section
|
214
|
+
.add_item(nic_params(payload.hardware_section,
|
215
|
+
nic_index,
|
216
|
+
network_name,
|
217
|
+
ip_addressing_mode,
|
218
|
+
ip))
|
219
|
+
|
220
|
+
# Connect NIC
|
221
|
+
payload
|
222
|
+
.network_connection_section
|
223
|
+
.add_item(network_connection_params(payload.network_connection_section,
|
224
|
+
nic_index,
|
225
|
+
network_name,
|
226
|
+
ip_addressing_mode,
|
227
|
+
ip))
|
228
|
+
|
229
|
+
task = connection.post(payload.reconfigure_link.href,
|
230
|
+
payload,
|
231
|
+
Xml::MEDIA_TYPE[:VM])
|
232
|
+
monitor_task(task)
|
233
|
+
end
|
234
|
+
|
235
|
+
def product_section_properties
|
236
|
+
product_section = entity_xml.product_section
|
237
|
+
return [] if product_section.nil?
|
238
|
+
|
239
|
+
product_section.properties
|
240
|
+
end
|
241
|
+
|
242
|
+
def product_section_properties=(properties)
|
243
|
+
Config.logger
|
244
|
+
.info("Updating VM #{name} production sections with properties: #{properties.pretty_inspect}")
|
245
|
+
task = connection.put(entity_xml.product_sections_link.href,
|
246
|
+
product_section_list_params(properties),
|
247
|
+
Xml::MEDIA_TYPE[:PRODUCT_SECTIONS])
|
248
|
+
monitor_task(task)
|
249
|
+
self
|
250
|
+
end
|
251
|
+
|
252
|
+
def internal_disks
|
253
|
+
hardware_section = entity_xml.hardware_section
|
254
|
+
internal_disks = []
|
255
|
+
hardware_section.hard_disks.each do |disk|
|
256
|
+
disk_link = disk.host_resource.attribute("disk")
|
257
|
+
if disk_link.nil?
|
258
|
+
internal_disks << VCloudSdk::InternalDisk.new(disk)
|
259
|
+
end
|
260
|
+
end
|
261
|
+
internal_disks
|
262
|
+
end
|
263
|
+
|
264
|
+
def create_internal_disk(
|
265
|
+
capacity,
|
266
|
+
bus_type = "scsi",
|
267
|
+
bus_sub_type = "lsilogic")
|
268
|
+
|
269
|
+
fail(CloudError,
|
270
|
+
"Invalid size in MB #{capacity}") if capacity <= 0
|
271
|
+
|
272
|
+
bus_type = Xml::BUS_TYPE_NAMES[bus_type.downcase]
|
273
|
+
fail(CloudError,
|
274
|
+
"Invalid bus type!") unless bus_type
|
275
|
+
|
276
|
+
bus_sub_type = Xml::BUS_SUB_TYPE_NAMES[bus_sub_type.downcase]
|
277
|
+
fail(CloudError,
|
278
|
+
"Invalid bus sub type!") unless bus_sub_type
|
279
|
+
|
280
|
+
Config
|
281
|
+
.logger
|
282
|
+
.info "Creating internal disk #{name} of #{capacity}MB."
|
283
|
+
|
284
|
+
payload = entity_xml
|
285
|
+
payload.add_hard_disk(capacity, bus_type, bus_sub_type)
|
286
|
+
|
287
|
+
task = connection.post(payload.reconfigure_link.href,
|
288
|
+
payload,
|
289
|
+
Xml::MEDIA_TYPE[:VM])
|
290
|
+
monitor_task(task)
|
291
|
+
end
|
292
|
+
|
111
293
|
private
|
112
294
|
|
113
295
|
def disk_attach_or_detach_params(disk)
|
@@ -128,5 +310,56 @@ module VCloudSdk
|
|
128
310
|
params.media_href = media.href
|
129
311
|
end
|
130
312
|
end
|
313
|
+
|
314
|
+
def eval_memory_allocation_units(allocation_units)
|
315
|
+
# allocation_units is in the form of "byte * modifier * base ^ exponent" such as "byte * 2^20"
|
316
|
+
# "modifier", "base" and "exponent" are positive integers and optional.
|
317
|
+
# "base" and "exponent" must be present together.
|
318
|
+
# Parsing logic: remove starting "byte" and first char "*" and replace power "^" with ruby-understandable "**"
|
319
|
+
bytes = allocation_units.sub(/byte\s*(\*)?/, "").sub(/\^/, "**")
|
320
|
+
return 1 if bytes.empty? # allocation_units is "byte" without "modifier", "base" or "exponent"
|
321
|
+
fail unless bytes =~ /(\d+\s*\*)?(\d+\s*\*\*\s*\d+)?/
|
322
|
+
eval bytes
|
323
|
+
rescue
|
324
|
+
raise ApiError,
|
325
|
+
"Unexpected form of AllocationUnits of memory: '#{allocation_units}'"
|
326
|
+
end
|
327
|
+
|
328
|
+
def nic_params(section, nic_index, network_name, addressing_mode, ip)
|
329
|
+
is_primary = section.nics.empty?
|
330
|
+
item = Xml::WrapperFactory
|
331
|
+
.create_instance("Item", nil, section.doc_namespaces)
|
332
|
+
|
333
|
+
Xml::NicItemWrapper
|
334
|
+
.new(item)
|
335
|
+
.tap do |params|
|
336
|
+
params.nic_index = nic_index
|
337
|
+
params.network = network_name
|
338
|
+
params.set_ip_addressing_mode(addressing_mode, ip)
|
339
|
+
params.is_primary = is_primary
|
340
|
+
end
|
341
|
+
end
|
342
|
+
|
343
|
+
def network_connection_params(section, nic_index, network_name, addressing_mode, ip)
|
344
|
+
Xml::WrapperFactory
|
345
|
+
.create_instance("NetworkConnection", nil, section.doc_namespaces)
|
346
|
+
.tap do |params|
|
347
|
+
params.network_connection_index = nic_index
|
348
|
+
params.network = network_name
|
349
|
+
params.ip_address_allocation_mode = addressing_mode
|
350
|
+
params.ip_address = ip unless ip.nil?
|
351
|
+
params.is_connected = true
|
352
|
+
end
|
353
|
+
end
|
354
|
+
|
355
|
+
def product_section_list_params(properties)
|
356
|
+
Xml::WrapperFactory.create_instance("ProductSectionList").tap do |params|
|
357
|
+
properties.each do |property|
|
358
|
+
params.add_property(property)
|
359
|
+
end
|
360
|
+
end
|
361
|
+
end
|
362
|
+
|
363
|
+
BYTES_PER_MEGABYTE = 1_048_576 # 1048576 = 1024 * 1024 = 2^20
|
131
364
|
end
|
132
365
|
end
|
@@ -26,6 +26,8 @@ module VCloudSdk
|
|
26
26
|
:CONNECTION => "Connection",
|
27
27
|
:PARENT => "Parent",
|
28
28
|
:ELEMENT_NAME => "ElementName",
|
29
|
+
:ALLOCATION_UNITS => "AllocationUnits",
|
30
|
+
:VIRTUAL_QUANTITY => "VirtualQuantity"
|
29
31
|
}
|
30
32
|
|
31
33
|
RESOURCE_SUB_TYPE = {
|
@@ -60,6 +62,14 @@ module VCloudSdk
|
|
60
62
|
:BUS_TYPE => "busType"
|
61
63
|
}
|
62
64
|
|
65
|
+
BUS_TYPE_NAMES = {
|
66
|
+
"scsi" => Xml::HARDWARE_TYPE[:SCSI_CONTROLLER]
|
67
|
+
}
|
68
|
+
|
69
|
+
BUS_SUB_TYPE_NAMES = {
|
70
|
+
"lsilogic" => Xml::BUS_SUB_TYPE[:LSILOGIC]
|
71
|
+
}
|
72
|
+
|
63
73
|
TASK_STATUS = {
|
64
74
|
:QUEUED => "queued",
|
65
75
|
:RUNNING => "running",
|
@@ -99,7 +99,7 @@ module VCloudSdk
|
|
99
99
|
end
|
100
100
|
|
101
101
|
def href_id
|
102
|
-
# Sample href: "https://10.
|
102
|
+
# Sample href: "https://10.147.0.0/api/org/a3783d64-0b9b-42d6-93cf-23bb08ec5520"
|
103
103
|
URI.parse(href).path.split('/')[-1]
|
104
104
|
end
|
105
105
|
|
@@ -316,6 +316,15 @@ module VCloudSdk
|
|
316
316
|
namespace_href)
|
317
317
|
node.namespace = ns
|
318
318
|
end
|
319
|
+
|
320
|
+
def ovf_namespace_prefix
|
321
|
+
return @ovf_namespace_prefix if @ovf_namespace_prefix
|
322
|
+
namespace = namespace_definitions.find { |ns| ns.href == OVF }
|
323
|
+
fail VCloudSdk::CloudError,
|
324
|
+
"Namespace of href '#{OVF}' is not found" if namespace.nil?
|
325
|
+
|
326
|
+
@ovf_namespace_prefix = namespace.prefix
|
327
|
+
end
|
319
328
|
end
|
320
329
|
end
|
321
330
|
end
|
@@ -4,6 +4,22 @@ module VCloudSdk
|
|
4
4
|
def ranges
|
5
5
|
get_nodes(:IpRange)
|
6
6
|
end
|
7
|
+
|
8
|
+
def add_ranges(ranges)
|
9
|
+
ranges.each do |range|
|
10
|
+
ip_range_node = add_child("IpRange")
|
11
|
+
start_address = add_child("StartAddress",
|
12
|
+
nil,
|
13
|
+
nil,
|
14
|
+
ip_range_node)
|
15
|
+
start_address.content = range.start_address
|
16
|
+
end_address = add_child("EndAddress",
|
17
|
+
nil,
|
18
|
+
nil,
|
19
|
+
ip_range_node)
|
20
|
+
end_address.content = range.end_address
|
21
|
+
end
|
22
|
+
end
|
7
23
|
end
|
8
24
|
end
|
9
25
|
end
|
@@ -1,6 +1,5 @@
|
|
1
1
|
module VCloudSdk
|
2
2
|
module Xml
|
3
|
-
|
4
3
|
class NetworkConfigSection < Wrapper
|
5
4
|
def network_configs
|
6
5
|
get_nodes("NetworkConfig")
|
@@ -8,18 +7,17 @@ module VCloudSdk
|
|
8
7
|
|
9
8
|
def add_network_config(config)
|
10
9
|
unless config.is_a? NetworkConfig
|
11
|
-
|
10
|
+
fail CloudError, "Only NetworkConfig can be added to #{self.class}"
|
12
11
|
end
|
13
12
|
add_child(config)
|
14
13
|
end
|
15
14
|
|
16
15
|
def delete_network_config(net_name)
|
17
|
-
net_config = network_configs.find {|n| n.network_name == net_name }
|
18
|
-
|
19
|
-
|
16
|
+
net_config = network_configs.find { |n| n.network_name == net_name }
|
17
|
+
fail ObjectNotFoundError,
|
18
|
+
"Cannot delete network #{net_name}: not found" unless net_config
|
20
19
|
net_config.node.remove
|
21
20
|
end
|
22
21
|
end
|
23
|
-
|
24
22
|
end
|
25
23
|
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module VCloudSdk
|
2
|
+
module Xml
|
3
|
+
class ProductSection < Wrapper
|
4
|
+
def add_property(property)
|
5
|
+
property_node = add_child("Property",
|
6
|
+
ovf_namespace_prefix,
|
7
|
+
OVF)
|
8
|
+
property_node["#{ovf_namespace_prefix}:type"] = property["type"].nil? ? "string" : property["type"]
|
9
|
+
property_node["#{ovf_namespace_prefix}:key"] = property["key"]
|
10
|
+
property_node["#{ovf_namespace_prefix}:value"] = property["value"]
|
11
|
+
property_node["#{ovf_namespace_prefix}:password"] = property["password"] if property["password"]
|
12
|
+
|
13
|
+
unless property["Label"].nil?
|
14
|
+
label_node = add_child("Label", ovf_namespace_prefix, OVF, property_node)
|
15
|
+
label_node.content = property["Label"]
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def properties
|
20
|
+
get_nodes("Property", nil, true, OVF).map do |property_node|
|
21
|
+
property = {}
|
22
|
+
property["type"] = property_node.attribute("type").content
|
23
|
+
property["key"] = property_node.attribute("key").content
|
24
|
+
property["value"] = property_node.attribute("value").content
|
25
|
+
property["password"] = property_node.attribute("password").content
|
26
|
+
|
27
|
+
label_node = property_node.get_nodes("Label", nil, true, OVF).first
|
28
|
+
property["Label"] = label_node.content unless label_node.nil?
|
29
|
+
|
30
|
+
property
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require "forwardable"
|
2
|
+
|
3
|
+
module VCloudSdk
|
4
|
+
module Xml
|
5
|
+
class ProductSectionList < Wrapper
|
6
|
+
extend Forwardable
|
7
|
+
def_delegator :production_section, :add_property
|
8
|
+
|
9
|
+
def production_section
|
10
|
+
get_nodes("ProductSection", nil, true, OVF).first
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -14,13 +14,15 @@ module VCloudSdk
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def cpu
|
17
|
-
hardware.find
|
18
|
-
HARDWARE_TYPE[:CPU]
|
17
|
+
hardware.find do |h|
|
18
|
+
h.get_rasd_content(RASD_TYPES[:RESOURCE_TYPE]) == HARDWARE_TYPE[:CPU]
|
19
|
+
end
|
19
20
|
end
|
20
21
|
|
21
22
|
def memory
|
22
|
-
hardware.find
|
23
|
-
HARDWARE_TYPE[:MEMORY]
|
23
|
+
hardware.find do |h|
|
24
|
+
h.get_rasd_content(RASD_TYPES[:RESOURCE_TYPE]) == HARDWARE_TYPE[:MEMORY]
|
25
|
+
end
|
24
26
|
end
|
25
27
|
|
26
28
|
def scsi_controller
|