ruby_vcloud_sdk 0.6.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/README.md +164 -42
- data/lib/ruby_vcloud_sdk/catalog.rb +23 -6
- data/lib/ruby_vcloud_sdk/client.rb +3 -2
- data/lib/ruby_vcloud_sdk/infrastructure.rb +12 -0
- data/lib/ruby_vcloud_sdk/internal_disk.rb +2 -1
- data/lib/ruby_vcloud_sdk/network_config.rb +16 -0
- data/lib/ruby_vcloud_sdk/nic.rb +26 -0
- data/lib/ruby_vcloud_sdk/powerable.rb +5 -4
- data/lib/ruby_vcloud_sdk/vapp.rb +12 -4
- data/lib/ruby_vcloud_sdk/vdc.rb +17 -5
- data/lib/ruby_vcloud_sdk/version.rb +1 -1
- data/lib/ruby_vcloud_sdk/vm.rb +62 -7
- data/lib/ruby_vcloud_sdk/xml/wrapper_classes/instantiate_vapp_template_params.rb +49 -4
- data/lib/ruby_vcloud_sdk/xml/wrapper_classes/network_connection.rb +10 -8
- data/lib/ruby_vcloud_sdk/xml/wrapper_classes/network_connection_section.rb +12 -11
- data/lib/ruby_vcloud_sdk/xml/wrapper_classes/org.rb +6 -0
- data/lib/ruby_vcloud_sdk/xml/wrapper_classes/product_section.rb +36 -11
- data/lib/ruby_vcloud_sdk/xml/wrapper_classes/virtual_hardware_section.rb +22 -6
- data/lib/ruby_vcloud_sdk/xml/wrapper_classes/vm.rb +14 -2
- metadata +17 -27
data/lib/ruby_vcloud_sdk/vapp.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require_relative "infrastructure"
|
2
2
|
require_relative "powerable"
|
3
3
|
require_relative "vm"
|
4
|
+
require_relative "network_config"
|
4
5
|
|
5
6
|
module VCloudSdk
|
6
7
|
class VApp
|
@@ -28,10 +29,10 @@ module VCloudSdk
|
|
28
29
|
wait_for_running_tasks(vapp, "VApp #{vapp_name}")
|
29
30
|
|
30
31
|
Config.logger.info "Deleting vApp #{vapp_name}."
|
31
|
-
monitor_task(connection.delete(vapp.remove_link),
|
32
|
+
monitor_task(connection.delete(vapp.remove_link.href),
|
32
33
|
@session.time_limit[:delete_vapp]) do |task|
|
33
34
|
Config.logger.info "vApp #{vapp_name} deleted."
|
34
|
-
return
|
35
|
+
return
|
35
36
|
end
|
36
37
|
|
37
38
|
fail ApiRequestError,
|
@@ -66,6 +67,12 @@ module VCloudSdk
|
|
66
67
|
end
|
67
68
|
end
|
68
69
|
|
70
|
+
def vm_exists?(name)
|
71
|
+
entity_xml.vms.any? do |vm|
|
72
|
+
vm.name == name
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
69
76
|
def find_vm_by_name(name)
|
70
77
|
entity_xml.vms.each do |vm|
|
71
78
|
return VCloudSdk::VM.new(@session, vm.href) if vm.name == name
|
@@ -113,10 +120,11 @@ module VCloudSdk
|
|
113
120
|
payload,
|
114
121
|
Xml::MEDIA_TYPE[:NETWORK_CONFIG_SECTION])
|
115
122
|
monitor_task(task)
|
123
|
+
self
|
116
124
|
end
|
117
125
|
|
118
126
|
def delete_network_by_name(name)
|
119
|
-
unless list_networks.any? { |network_name| network_name == name}
|
127
|
+
unless list_networks.any? { |network_name| network_name == name }
|
120
128
|
fail ObjectNotFoundError,
|
121
129
|
"Network '#{name}' is not found"
|
122
130
|
end
|
@@ -134,7 +142,7 @@ module VCloudSdk
|
|
134
142
|
payload,
|
135
143
|
Xml::MEDIA_TYPE[:NETWORK_CONFIG_SECTION])
|
136
144
|
monitor_task(task)
|
137
|
-
|
145
|
+
self
|
138
146
|
end
|
139
147
|
|
140
148
|
private
|
data/lib/ruby_vcloud_sdk/vdc.rb
CHANGED
@@ -19,7 +19,7 @@ module VCloudSdk
|
|
19
19
|
:name, :upload_link, :upload_media_link,
|
20
20
|
:instantiate_vapp_template_link
|
21
21
|
|
22
|
-
public :find_network_by_name
|
22
|
+
public :find_network_by_name, :network_exists?
|
23
23
|
|
24
24
|
def initialize(session, link)
|
25
25
|
@session = session
|
@@ -48,6 +48,12 @@ module VCloudSdk
|
|
48
48
|
fail ObjectNotFoundError, "Storage profile '#{name}' is not found"
|
49
49
|
end
|
50
50
|
|
51
|
+
def storage_profile_exists?(name)
|
52
|
+
storage_profile_records.any? do |storage_profile|
|
53
|
+
storage_profile.name == name
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
51
57
|
def vapps
|
52
58
|
entity_xml.vapps.map do |vapp_link|
|
53
59
|
VCloudSdk::VApp.new(@session, vapp_link)
|
@@ -70,6 +76,12 @@ module VCloudSdk
|
|
70
76
|
fail ObjectNotFoundError, "VApp '#{name}' is not found"
|
71
77
|
end
|
72
78
|
|
79
|
+
def vapp_exists?(name)
|
80
|
+
entity_xml.vapps.any? do |vapp|
|
81
|
+
vapp.name == name
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
73
85
|
def resources
|
74
86
|
cpu = VCloudSdk::CPU.new(entity_xml.available_cpu_cores)
|
75
87
|
memory = VCloudSdk::Memory.new(entity_xml.available_memory_mb)
|
@@ -123,8 +135,8 @@ module VCloudSdk
|
|
123
135
|
end
|
124
136
|
|
125
137
|
def disk_exists?(name)
|
126
|
-
|
127
|
-
|
138
|
+
list_disks.any? do |disk_name|
|
139
|
+
disk_name == name
|
128
140
|
end
|
129
141
|
end
|
130
142
|
|
@@ -165,7 +177,7 @@ module VCloudSdk
|
|
165
177
|
"#{disks.size} disks with name #{name} were found" if disks.size > 1
|
166
178
|
|
167
179
|
delete_single_disk(disks.first)
|
168
|
-
|
180
|
+
self
|
169
181
|
end
|
170
182
|
|
171
183
|
def delete_all_disks_by_name(name)
|
@@ -182,7 +194,7 @@ module VCloudSdk
|
|
182
194
|
|
183
195
|
fail CloudError,
|
184
196
|
"Failed to delete one or more of the disks with name '#{name}'. Check logs for details." unless success
|
185
|
-
|
197
|
+
self
|
186
198
|
end
|
187
199
|
|
188
200
|
def storage_profile_xml_node(name)
|
data/lib/ruby_vcloud_sdk/vm.rb
CHANGED
@@ -2,6 +2,7 @@ require "forwardable"
|
|
2
2
|
require_relative "infrastructure"
|
3
3
|
require_relative "powerable"
|
4
4
|
require_relative "internal_disk"
|
5
|
+
require_relative "nic"
|
5
6
|
|
6
7
|
module VCloudSdk
|
7
8
|
class VM
|
@@ -92,6 +93,19 @@ module VCloudSdk
|
|
92
93
|
.map { |network_connection| network_connection.network }
|
93
94
|
end
|
94
95
|
|
96
|
+
def nics
|
97
|
+
primary_index = entity_xml
|
98
|
+
.network_connection_section
|
99
|
+
.primary_network_connection_index
|
100
|
+
entity_xml
|
101
|
+
.network_connection_section
|
102
|
+
.network_connections
|
103
|
+
.map do |network_connection|
|
104
|
+
VCloudSdk::NIC.new(network_connection,
|
105
|
+
network_connection.network_connection_index == primary_index)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
95
109
|
def independent_disks
|
96
110
|
hardware_section = entity_xml.hardware_section
|
97
111
|
disks = []
|
@@ -122,10 +136,10 @@ module VCloudSdk
|
|
122
136
|
task = connection.post(entity_xml.attach_disk_link.href,
|
123
137
|
disk_attach_or_detach_params(disk),
|
124
138
|
Xml::MEDIA_TYPE[:DISK_ATTACH_DETACH_PARAMS])
|
125
|
-
|
139
|
+
monitor_task(task)
|
126
140
|
|
127
141
|
Config.logger.info "Disk '#{disk.name}' is attached to VM '#{name}'"
|
128
|
-
|
142
|
+
self
|
129
143
|
end
|
130
144
|
|
131
145
|
def detach_disk(disk)
|
@@ -143,10 +157,10 @@ module VCloudSdk
|
|
143
157
|
task = connection.post(entity_xml.detach_disk_link.href,
|
144
158
|
disk_attach_or_detach_params(disk),
|
145
159
|
Xml::MEDIA_TYPE[:DISK_ATTACH_DETACH_PARAMS])
|
146
|
-
|
160
|
+
monitor_task(task)
|
147
161
|
|
148
162
|
Config.logger.info "Disk '#{disk.name}' is detached from VM '#{name}'"
|
149
|
-
|
163
|
+
self
|
150
164
|
end
|
151
165
|
|
152
166
|
def insert_media(catalog_name, media_file_name)
|
@@ -163,6 +177,7 @@ module VCloudSdk
|
|
163
177
|
media_insert_or_eject_params(media),
|
164
178
|
Xml::MEDIA_TYPE[:MEDIA_INSERT_EJECT_PARAMS])
|
165
179
|
monitor_task(task)
|
180
|
+
self
|
166
181
|
end
|
167
182
|
|
168
183
|
def eject_media(catalog_name, media_file_name)
|
@@ -179,6 +194,7 @@ module VCloudSdk
|
|
179
194
|
media_insert_or_eject_params(media),
|
180
195
|
Xml::MEDIA_TYPE[:MEDIA_INSERT_EJECT_PARAMS])
|
181
196
|
monitor_task(task)
|
197
|
+
self
|
182
198
|
end
|
183
199
|
|
184
200
|
def add_nic(
|
@@ -203,7 +219,7 @@ module VCloudSdk
|
|
203
219
|
fail CloudError,
|
204
220
|
"VM #{name} is powered-on and cannot add NIC." if is_status?(payload, :POWERED_ON)
|
205
221
|
|
206
|
-
nic_index =
|
222
|
+
nic_index = add_nic_index
|
207
223
|
|
208
224
|
Config.logger
|
209
225
|
.info("Adding NIC #{nic_index}, network #{network_name} using mode '#{ip_addressing_mode}' #{ip.nil? ? "" : "IP: #{ip}"}")
|
@@ -230,6 +246,20 @@ module VCloudSdk
|
|
230
246
|
payload,
|
231
247
|
Xml::MEDIA_TYPE[:VM])
|
232
248
|
monitor_task(task)
|
249
|
+
self
|
250
|
+
end
|
251
|
+
|
252
|
+
def delete_nics(*nics)
|
253
|
+
payload = entity_xml
|
254
|
+
fail CloudError,
|
255
|
+
"VM #{name} is powered-on and cannot delete NIC." if is_status?(payload, :POWERED_ON)
|
256
|
+
|
257
|
+
payload.delete_nics(*nics)
|
258
|
+
task = connection.post(payload.reconfigure_link.href,
|
259
|
+
payload,
|
260
|
+
Xml::MEDIA_TYPE[:VM])
|
261
|
+
monitor_task(task)
|
262
|
+
self
|
233
263
|
end
|
234
264
|
|
235
265
|
def product_section_properties
|
@@ -240,8 +270,8 @@ module VCloudSdk
|
|
240
270
|
end
|
241
271
|
|
242
272
|
def product_section_properties=(properties)
|
243
|
-
Config.logger
|
244
|
-
|
273
|
+
Config.logger.info(
|
274
|
+
"Updating VM #{name} production sections with properties: #{properties.inspect}")
|
245
275
|
task = connection.put(entity_xml.product_sections_link.href,
|
246
276
|
product_section_list_params(properties),
|
247
277
|
Xml::MEDIA_TYPE[:PRODUCT_SECTIONS])
|
@@ -288,10 +318,35 @@ module VCloudSdk
|
|
288
318
|
payload,
|
289
319
|
Xml::MEDIA_TYPE[:VM])
|
290
320
|
monitor_task(task)
|
321
|
+
self
|
322
|
+
end
|
323
|
+
|
324
|
+
def delete_internal_disk_by_name(name)
|
325
|
+
payload = entity_xml
|
326
|
+
|
327
|
+
unless payload.delete_hard_disk?(name)
|
328
|
+
fail ObjectNotFoundError, "Internal disk '#{name}' is not found"
|
329
|
+
end
|
330
|
+
|
331
|
+
task = connection.post(payload.reconfigure_link.href,
|
332
|
+
payload,
|
333
|
+
Xml::MEDIA_TYPE[:VM])
|
334
|
+
monitor_task(task)
|
335
|
+
self
|
291
336
|
end
|
292
337
|
|
293
338
|
private
|
294
339
|
|
340
|
+
def add_nic_index
|
341
|
+
# nic index begins with 0
|
342
|
+
i = 0
|
343
|
+
nic_indexes = nics.map { |n| n.nic_index }
|
344
|
+
while (nic_indexes.include?(i))
|
345
|
+
i += 1
|
346
|
+
end
|
347
|
+
i
|
348
|
+
end
|
349
|
+
|
295
350
|
def disk_attach_or_detach_params(disk)
|
296
351
|
Xml::WrapperFactory
|
297
352
|
.create_instance("DiskAttachOrDetachParams")
|
@@ -42,24 +42,69 @@ module VCloudSdk
|
|
42
42
|
@local_exists = true
|
43
43
|
|
44
44
|
locality.each do |k,v|
|
45
|
-
node_sp = create_child("SourcedVmInstantiationParams"
|
45
|
+
node_sp = create_child("SourcedVmInstantiationParams",
|
46
|
+
namespace.prefix,
|
47
|
+
namespace.href)
|
46
48
|
is_source_delete.node.after(node_sp)
|
47
49
|
|
48
|
-
node_sv = add_child("Source",
|
50
|
+
node_sv = add_child("Source",
|
51
|
+
namespace.prefix,
|
52
|
+
namespace.href,
|
53
|
+
node_sp)
|
49
54
|
node_sv["type"] = k.type
|
50
55
|
node_sv["name"] = k.name
|
51
56
|
node_sv["href"] = k.href
|
52
57
|
|
53
|
-
node_lp = create_child("LocalityParams"
|
58
|
+
node_lp = create_child("LocalityParams",
|
59
|
+
namespace.prefix,
|
60
|
+
namespace.href)
|
54
61
|
node_sv.after(node_lp)
|
55
62
|
|
56
|
-
node_re = add_child("ResourceEntity",
|
63
|
+
node_re = add_child("ResourceEntity",
|
64
|
+
namespace.prefix,
|
65
|
+
namespace.href,
|
66
|
+
node_lp)
|
57
67
|
node_re["type"] = v.type
|
58
68
|
node_re["name"] = v.name
|
59
69
|
node_re["href"] = v.href
|
60
70
|
end
|
61
71
|
end
|
62
72
|
|
73
|
+
def set_network_config(vapp_network_name, vdc_netowrk_href, fence_mode)
|
74
|
+
instantiation_param = get_nodes("InstantiationParams").first
|
75
|
+
|
76
|
+
net_config_section = add_child("NetworkConfigSection",
|
77
|
+
namespace.prefix,
|
78
|
+
namespace.href,
|
79
|
+
instantiation_param.node)
|
80
|
+
|
81
|
+
ovf_info = add_child("Info", "ovf", OVF, net_config_section)
|
82
|
+
ovf_info.content = "Configuration parameters for logical networks"
|
83
|
+
|
84
|
+
network_config = create_child("NetworkConfig",
|
85
|
+
namespace.prefix,
|
86
|
+
namespace.href)
|
87
|
+
ovf_info.after(network_config)
|
88
|
+
network_config["networkName"] = vapp_network_name
|
89
|
+
|
90
|
+
configuration = add_child("Configuration",
|
91
|
+
namespace.prefix,
|
92
|
+
namespace.href,
|
93
|
+
network_config)
|
94
|
+
|
95
|
+
parent_network = add_child("ParentNetwork",
|
96
|
+
namespace.prefix,
|
97
|
+
namespace.href,
|
98
|
+
configuration)
|
99
|
+
parent_network["href"] = vdc_netowrk_href
|
100
|
+
|
101
|
+
fence_node = create_child("FenceMode",
|
102
|
+
namespace.prefix,
|
103
|
+
namespace.href)
|
104
|
+
parent_network.after(fence_node)
|
105
|
+
fence_node.content = fence_mode
|
106
|
+
end
|
107
|
+
|
63
108
|
private
|
64
109
|
|
65
110
|
def is_source_delete
|
@@ -1,6 +1,5 @@
|
|
1
1
|
module VCloudSdk
|
2
2
|
module Xml
|
3
|
-
|
4
3
|
class NetworkConnection < Wrapper
|
5
4
|
def network
|
6
5
|
@root["network"]
|
@@ -16,15 +15,18 @@ module VCloudSdk
|
|
16
15
|
end
|
17
16
|
|
18
17
|
def network_connection_index=(value)
|
19
|
-
|
18
|
+
index_node = get_nodes("NetworkConnectionIndex").first
|
19
|
+
if index_node.nil?
|
20
20
|
index_node = create_child("NetworkConnectionIndex")
|
21
21
|
add_child(index_node)
|
22
22
|
end
|
23
|
-
|
23
|
+
index_node.content = value
|
24
24
|
end
|
25
25
|
|
26
26
|
def ip_address
|
27
|
-
get_nodes("IpAddress").first
|
27
|
+
ip_address_node = get_nodes("IpAddress").first
|
28
|
+
return if ip_address_node.nil?
|
29
|
+
ip_address_node.content
|
28
30
|
end
|
29
31
|
|
30
32
|
def ip_address=(value)
|
@@ -59,13 +61,13 @@ module VCloudSdk
|
|
59
61
|
end
|
60
62
|
|
61
63
|
def ip_address_allocation_mode=(value)
|
62
|
-
|
63
|
-
|
64
|
-
|
64
|
+
unless IP_ADDRESSING_MODE.values.include?(value)
|
65
|
+
fail ArgumentError,
|
66
|
+
"Invalid IP addressing mode. Valid modes " +
|
67
|
+
"are: #{IP_ADDRESSING_MODE.values.join(" ")}"
|
65
68
|
end
|
66
69
|
get_nodes("IpAddressAllocationMode").first.content = value
|
67
70
|
end
|
68
71
|
end
|
69
|
-
|
70
72
|
end
|
71
73
|
end
|
@@ -1,6 +1,5 @@
|
|
1
1
|
module VCloudSdk
|
2
2
|
module Xml
|
3
|
-
|
4
3
|
class NetworkConnectionSection < Wrapper
|
5
4
|
def add_item(item)
|
6
5
|
link_node = get_nodes("Link").first
|
@@ -12,10 +11,11 @@ module VCloudSdk
|
|
12
11
|
end
|
13
12
|
|
14
13
|
def network_connection(index)
|
15
|
-
net = network_connections.find
|
16
|
-
|
14
|
+
net = network_connections.find do |n|
|
15
|
+
n.network_connection_index == index.to_s
|
16
|
+
end
|
17
17
|
unless net
|
18
|
-
|
18
|
+
fail ObjectNotFoundError, "Network connection #{index} does not exist."
|
19
19
|
end
|
20
20
|
net
|
21
21
|
end
|
@@ -38,26 +38,27 @@ module VCloudSdk
|
|
38
38
|
connection = network_connection(index)
|
39
39
|
if connection
|
40
40
|
connection.node.remove
|
41
|
-
reconcile_primary_network
|
41
|
+
reconcile_primary_network
|
42
42
|
else
|
43
|
-
|
44
|
-
|
43
|
+
fail ObjectNotFoundError,
|
44
|
+
"Cannot remove network connection #{index}: does not exist."
|
45
45
|
end
|
46
46
|
end
|
47
47
|
|
48
48
|
private
|
49
49
|
|
50
|
-
def reconcile_primary_network
|
50
|
+
def reconcile_primary_network
|
51
51
|
new_primary = network_connections.first
|
52
52
|
if new_primary
|
53
|
-
|
54
|
-
|
53
|
+
primary_index = new_primary.network_connection_index
|
54
|
+
self.primary_network_connection_index = primary_index
|
55
|
+
primary_index
|
55
56
|
else
|
56
57
|
primary = get_nodes("PrimaryNetworkConnectionIndex").first
|
57
58
|
primary.node.remove if primary
|
59
|
+
nil
|
58
60
|
end
|
59
61
|
end
|
60
62
|
end
|
61
|
-
|
62
63
|
end
|
63
64
|
end
|
@@ -5,31 +5,56 @@ module VCloudSdk
|
|
5
5
|
property_node = add_child("Property",
|
6
6
|
ovf_namespace_prefix,
|
7
7
|
OVF)
|
8
|
-
property_node["#{ovf_namespace_prefix}:type"] =
|
8
|
+
property_node["#{ovf_namespace_prefix}:type"] =
|
9
|
+
property["type"].nil? ? "string" : property["type"]
|
9
10
|
property_node["#{ovf_namespace_prefix}:key"] = property["key"]
|
10
11
|
property_node["#{ovf_namespace_prefix}:value"] = property["value"]
|
11
|
-
property_node["#{ovf_namespace_prefix}:password"] =
|
12
|
+
property_node["#{ovf_namespace_prefix}:password"] =
|
13
|
+
property["password"] if property["password"] # default to false
|
14
|
+
property_node["#{ovf_namespace_prefix}:userConfigurable"] =
|
15
|
+
property["userConfigurable"] if property["userConfigurable"] # default to false
|
12
16
|
|
13
|
-
|
14
|
-
|
15
|
-
|
17
|
+
%w[Label Description].each do |k|
|
18
|
+
add_child_node_property(property_node, property, k)
|
19
|
+
end
|
20
|
+
|
21
|
+
if property["value"].nil?
|
22
|
+
value_node = add_child("Value", ovf_namespace_prefix, OVF, property_node)
|
23
|
+
value_node.attribute("value").value = property["value"]
|
16
24
|
end
|
17
25
|
end
|
18
26
|
|
19
27
|
def properties
|
20
28
|
get_nodes("Property", nil, true, OVF).map do |property_node|
|
21
29
|
property = {}
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
30
|
+
%w[type key value password userConfigurable].each do |k|
|
31
|
+
attr = property_node.attribute(k)
|
32
|
+
property[k] = attr.nil? ? "" : attr.content
|
33
|
+
end
|
26
34
|
|
27
|
-
|
28
|
-
|
35
|
+
%w[Label Description].each do |k|
|
36
|
+
read_child_node_property(property_node, property, k)
|
37
|
+
end
|
29
38
|
|
39
|
+
value_node = property_node.get_nodes("Value", nil, true, OVF).first
|
40
|
+
property["value"] = value_node.attribute("value").content unless value_node.nil?
|
30
41
|
property
|
31
42
|
end
|
32
43
|
end
|
44
|
+
|
45
|
+
private
|
46
|
+
|
47
|
+
def add_child_node_property(property_node, property, key)
|
48
|
+
unless property[key].nil?
|
49
|
+
child_node = add_child(key, ovf_namespace_prefix, OVF, property_node)
|
50
|
+
child_node.content = property[key]
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def read_child_node_property(property_node, property, key)
|
55
|
+
child_node = property_node.get_nodes(key, nil, true, OVF).first
|
56
|
+
property[key] = child_node.content unless child_node.nil?
|
57
|
+
end
|
33
58
|
end
|
34
59
|
end
|
35
60
|
end
|
@@ -35,8 +35,9 @@ module VCloudSdk
|
|
35
35
|
end
|
36
36
|
|
37
37
|
def nics
|
38
|
-
items = hardware.
|
39
|
-
RASD_TYPES[:RESOURCE_TYPE]) == HARDWARE_TYPE[:NIC]
|
38
|
+
items = hardware.select do |h|
|
39
|
+
h.get_rasd_content(RASD_TYPES[:RESOURCE_TYPE]) == HARDWARE_TYPE[:NIC]
|
40
|
+
end
|
40
41
|
items.map { |i| NicItemWrapper.new(i) }
|
41
42
|
end
|
42
43
|
|
@@ -45,14 +46,29 @@ module VCloudSdk
|
|
45
46
|
end
|
46
47
|
|
47
48
|
def remove_hw(hw_type, index)
|
48
|
-
|
49
|
+
index = index.to_s
|
50
|
+
item = hardware.find do |h|
|
49
51
|
h.get_rasd_content(RASD_TYPES[:RESOURCE_TYPE]) == hw_type &&
|
50
|
-
|
52
|
+
h.get_rasd_content(RASD_TYPES[:ADDRESS_ON_PARENT]) == index
|
53
|
+
end
|
51
54
|
if item
|
52
55
|
item.node.remove
|
53
56
|
else
|
54
|
-
|
55
|
-
|
57
|
+
fail ObjectNotFoundError,
|
58
|
+
"Cannot remove hw item #{hw_type}:#{index}, does not exist."
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def reconcile_primary_network(primary_index)
|
63
|
+
primary_index = primary_index.to_s
|
64
|
+
hardware.select do |item|
|
65
|
+
item.get_rasd_content(RASD_TYPES[:RESOURCE_TYPE]) == HARDWARE_TYPE[:NIC]
|
66
|
+
end.each do |item|
|
67
|
+
if item.get_rasd_content(RASD_TYPES[:ADDRESS_ON_PARENT]) == primary_index
|
68
|
+
item.get_rasd(RASD_TYPES[:CONNECTION]).attribute("primaryNetworkConnection").value = "true"
|
69
|
+
else
|
70
|
+
item.get_rasd(RASD_TYPES[:CONNECTION]).attribute("primaryNetworkConnection").value = "false"
|
71
|
+
end
|
56
72
|
end
|
57
73
|
end
|
58
74
|
|
@@ -117,6 +117,17 @@ module VCloudSdk
|
|
117
117
|
"busType", VCLOUD_NAMESPACE)] = bus_type
|
118
118
|
end
|
119
119
|
|
120
|
+
def delete_hard_disk?(disk_name)
|
121
|
+
hardware_section.hard_disks.each do |disk|
|
122
|
+
if disk.element_name == disk_name
|
123
|
+
disk.node.remove
|
124
|
+
return true
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
false
|
129
|
+
end
|
130
|
+
|
120
131
|
def change_cpu_count(quantity)
|
121
132
|
@logger.debug("Updating CPU count on vm #{name} to #{quantity} ")
|
122
133
|
item = hardware_section.cpu
|
@@ -132,7 +143,7 @@ module VCloudSdk
|
|
132
143
|
# Deletes NIC from VM. Accepts variable number of arguments for NICs.
|
133
144
|
# To delete all NICs from VM use the splat operator
|
134
145
|
# ex: delete_nic(vm, *vm.hardware_section.nics)
|
135
|
-
def
|
146
|
+
def delete_nics(*nics)
|
136
147
|
# Trying to remove a NIC without removing the network connection
|
137
148
|
# first will cause an error. Removing the network connection of a NIC
|
138
149
|
# in the NetworkConnectionSection will automatically delete the NIC.
|
@@ -141,8 +152,9 @@ module VCloudSdk
|
|
141
152
|
nics.each do |nic|
|
142
153
|
nic_index = nic.nic_index
|
143
154
|
@logger.info("Removing NIC #{nic_index} from VM #{name}")
|
144
|
-
net_conn_section.remove_network_connection(nic_index)
|
155
|
+
primary_index = net_conn_section.remove_network_connection(nic_index)
|
145
156
|
vhw_section.remove_nic(nic_index)
|
157
|
+
vhw_section.reconcile_primary_network(primary_index) if primary_index
|
146
158
|
end
|
147
159
|
end
|
148
160
|
|