opennebula 6.10.3 → 6.99.85.pre

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.
Files changed (131) hide show
  1. checksums.yaml +4 -4
  2. data/lib/cloud/CloudClient.rb +3 -3
  3. data/lib/models/role.rb +349 -823
  4. data/lib/models/service.rb +156 -80
  5. data/lib/models/vmrole.rb +703 -0
  6. data/lib/models/vrrole.rb +284 -0
  7. data/lib/models.rb +3 -1
  8. data/lib/opennebula/acl.rb +1 -1
  9. data/lib/opennebula/acl_pool.rb +1 -1
  10. data/lib/opennebula/backupjob.rb +1 -1
  11. data/lib/opennebula/backupjob_pool.rb +1 -1
  12. data/lib/opennebula/client.rb +1 -1
  13. data/lib/opennebula/cluster.rb +45 -2
  14. data/lib/opennebula/cluster_pool.rb +1 -1
  15. data/lib/opennebula/datastore.rb +1 -1
  16. data/lib/opennebula/datastore_pool.rb +1 -1
  17. data/lib/opennebula/document.rb +1 -1
  18. data/lib/opennebula/document_json.rb +1 -1
  19. data/lib/opennebula/document_pool.rb +1 -1
  20. data/lib/opennebula/document_pool_json.rb +1 -1
  21. data/lib/opennebula/error.rb +1 -1
  22. data/lib/opennebula/flow/grammar.rb +1 -1
  23. data/lib/opennebula/flow/service_pool.rb +1 -1
  24. data/lib/opennebula/flow/service_template.rb +353 -97
  25. data/lib/opennebula/flow/service_template_ext.rb +3 -3
  26. data/lib/opennebula/flow/service_template_pool.rb +1 -1
  27. data/lib/opennebula/flow/validator.rb +458 -410
  28. data/lib/opennebula/flow.rb +1 -1
  29. data/lib/opennebula/group.rb +1 -1
  30. data/lib/opennebula/group_pool.rb +1 -1
  31. data/lib/opennebula/hook.rb +1 -1
  32. data/lib/opennebula/hook_log.rb +1 -1
  33. data/lib/opennebula/hook_pool.rb +1 -1
  34. data/lib/opennebula/host.rb +1 -60
  35. data/lib/opennebula/host_pool.rb +1 -1
  36. data/lib/opennebula/image.rb +1 -1
  37. data/lib/opennebula/image_pool.rb +1 -1
  38. data/lib/opennebula/ldap_auth.rb +1 -1
  39. data/lib/opennebula/ldap_auth_spec.rb +1 -1
  40. data/lib/opennebula/lockable_ext.rb +1 -1
  41. data/lib/opennebula/marketplace.rb +1 -1
  42. data/lib/opennebula/marketplace_pool.rb +1 -1
  43. data/lib/opennebula/marketplaceapp.rb +1 -1
  44. data/lib/opennebula/marketplaceapp_ext.rb +14 -211
  45. data/lib/opennebula/marketplaceapp_pool.rb +1 -1
  46. data/lib/opennebula/oneflow_client.rb +11 -9
  47. data/lib/opennebula/pool.rb +1 -1
  48. data/lib/opennebula/pool_element.rb +1 -1
  49. data/lib/opennebula/security_group.rb +1 -1
  50. data/lib/opennebula/security_group_pool.rb +1 -1
  51. data/lib/opennebula/server_cipher_auth.rb +1 -1
  52. data/lib/opennebula/server_x509_auth.rb +1 -1
  53. data/lib/opennebula/ssh_auth.rb +1 -1
  54. data/lib/opennebula/system.rb +1 -1
  55. data/lib/opennebula/template.rb +1 -1
  56. data/lib/opennebula/template_ext.rb +1 -1
  57. data/lib/opennebula/template_pool.rb +1 -1
  58. data/lib/opennebula/user.rb +1 -1
  59. data/lib/opennebula/user_pool.rb +1 -1
  60. data/lib/opennebula/utils.rb +2 -2
  61. data/lib/opennebula/vdc.rb +1 -1
  62. data/lib/opennebula/vdc_pool.rb +1 -1
  63. data/lib/opennebula/virtual_machine.rb +3 -12
  64. data/lib/opennebula/virtual_machine_ext.rb +2 -31
  65. data/lib/opennebula/virtual_machine_pool.rb +1 -1
  66. data/lib/opennebula/virtual_network.rb +1 -1
  67. data/lib/opennebula/virtual_network_pool.rb +1 -1
  68. data/lib/opennebula/virtual_router.rb +1 -1
  69. data/lib/opennebula/virtual_router_pool.rb +1 -1
  70. data/lib/opennebula/vm_group.rb +1 -1
  71. data/lib/opennebula/vm_group_pool.rb +1 -1
  72. data/lib/opennebula/vntemplate.rb +1 -1
  73. data/lib/opennebula/vntemplate_pool.rb +1 -1
  74. data/lib/opennebula/wait_ext.rb +1 -1
  75. data/lib/opennebula/x509_auth.rb +1 -1
  76. data/lib/opennebula/xml_element.rb +2 -2
  77. data/lib/opennebula/xml_pool.rb +1 -1
  78. data/lib/opennebula/xml_utils.rb +1 -1
  79. data/lib/opennebula/zone.rb +1 -1
  80. data/lib/opennebula/zone_pool.rb +1 -1
  81. data/lib/opennebula.rb +2 -2
  82. metadata +6 -67
  83. data/lib/ActionManager.rb +0 -280
  84. data/lib/CommandManager.rb +0 -328
  85. data/lib/DriverExecHelper.rb +0 -213
  86. data/lib/HostSyncManager.rb +0 -111
  87. data/lib/OpenNebulaDriver.rb +0 -223
  88. data/lib/VirtualMachineDriver.rb +0 -404
  89. data/lib/datacenter.rb +0 -1319
  90. data/lib/datastore.rb +0 -1049
  91. data/lib/distributed_firewall.rb +0 -293
  92. data/lib/file_helper.rb +0 -374
  93. data/lib/host.rb +0 -1518
  94. data/lib/logical_port.rb +0 -50
  95. data/lib/logical_switch.rb +0 -77
  96. data/lib/memoize.rb +0 -74
  97. data/lib/network.rb +0 -705
  98. data/lib/nsx_client.rb +0 -157
  99. data/lib/nsx_component.rb +0 -28
  100. data/lib/nsx_constants.rb +0 -162
  101. data/lib/nsx_driver.rb +0 -91
  102. data/lib/nsx_error.rb +0 -77
  103. data/lib/nsx_rule.rb +0 -206
  104. data/lib/nsxt_client.rb +0 -189
  105. data/lib/nsxt_dfw.rb +0 -196
  106. data/lib/nsxt_logical_port.rb +0 -94
  107. data/lib/nsxt_rule.rb +0 -188
  108. data/lib/nsxt_tz.rb +0 -38
  109. data/lib/nsxv_client.rb +0 -189
  110. data/lib/nsxv_dfw.rb +0 -202
  111. data/lib/nsxv_logical_port.rb +0 -107
  112. data/lib/nsxv_rule.rb +0 -172
  113. data/lib/nsxv_tz.rb +0 -41
  114. data/lib/opaque_network.rb +0 -134
  115. data/lib/rest_client.rb +0 -191
  116. data/lib/scripts_common.rb +0 -176
  117. data/lib/transport_zone.rb +0 -43
  118. data/lib/vcenter_driver.rb +0 -152
  119. data/lib/vcenter_importer.rb +0 -626
  120. data/lib/vi_client.rb +0 -273
  121. data/lib/vi_helper.rb +0 -328
  122. data/lib/virtual_machine.rb +0 -3574
  123. data/lib/virtual_wire.rb +0 -158
  124. data/lib/vm_device.rb +0 -80
  125. data/lib/vm_disk.rb +0 -202
  126. data/lib/vm_folder.rb +0 -69
  127. data/lib/vm_helper.rb +0 -30
  128. data/lib/vm_monitor.rb +0 -305
  129. data/lib/vm_nic.rb +0 -70
  130. data/lib/vm_template.rb +0 -2112
  131. data/lib/vmm_importer.rb +0 -165
data/lib/datacenter.rb DELETED
@@ -1,1319 +0,0 @@
1
- # -------------------------------------------------------------------------- #
2
- # Copyright 2002-2024, OpenNebula Project, OpenNebula Systems #
3
- # #
4
- # Licensed under the Apache License, Version 2.0 (the "License"); you may #
5
- # not use this file except in compliance with the License. You may obtain #
6
- # a copy of the License at #
7
- # #
8
- # http://www.apache.org/licenses/LICENSE-2.0 #
9
- # #
10
- # Unless required by applicable law or agreed to in writing, software #
11
- # distributed under the License is distributed on an "AS IS" BASIS, #
12
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
13
- # See the License for the specific language governing permissions and #
14
- # limitations under the License. #
15
- #--------------------------------------------------------------------------- #
16
-
17
- require 'set'
18
- require 'digest'
19
-
20
- ##############################################################################
21
- # Module VCenterDriver
22
- ##############################################################################
23
- module VCenterDriver
24
-
25
- ##########################################################################
26
- # Class DatacenterFolder
27
- ##########################################################################
28
- class DatacenterFolder
29
-
30
- attr_accessor :items
31
-
32
- def initialize(vi_client)
33
- @vi_client = vi_client
34
- @items = {}
35
- end
36
-
37
- ########################################################################
38
- # Builds a hash with Datacenter-Ref / Datacenter to be used as a cache
39
- # @return [Hash] in the form
40
- # { dc_ref [Symbol] => Datacenter object }
41
- ########################################################################
42
- def fetch!
43
- VIClient
44
- .get_entities(
45
- @vi_client.vim.root,
46
- 'Datacenter'
47
- ).each do |item|
48
- item_name = item._ref
49
- @items[item_name.to_sym] = Datacenter.new(item)
50
- end
51
- end
52
-
53
- ########################################################################
54
- # Returns a Datacenter. Uses the cache if available.
55
- # @param ref [Symbol] the vcenter ref
56
- # @return Datacenter
57
- ########################################################################
58
- def get(ref)
59
- if !@items[ref.to_sym]
60
- rbvmomi_dc = RbVmomi::VIM::Datacenter.new(@vi_client.vim, ref)
61
- @items[ref.to_sym] = Datacenter.new(rbvmomi_dc)
62
- end
63
-
64
- @items[ref.to_sym]
65
- end
66
-
67
- def vcenter_instance_uuid
68
- @vi_client.vim.serviceContent.about.instanceUuid
69
- end
70
-
71
- def vcenter_api_version
72
- @vi_client.vim.serviceContent.about.apiVersion
73
- end
74
-
75
- def get_unimported_hosts(hpool, _vcenter_instance_name)
76
- host_objects = {}
77
-
78
- vcenter_uuid = vcenter_instance_uuid
79
- vcenter_version = vcenter_api_version
80
-
81
- fetch! if @items.empty? # Get datacenters
82
-
83
- # Loop through datacenters
84
- @items.values.each do |dc|
85
- dc_name = dc.item.name
86
- host_objects[dc_name] = []
87
-
88
- # Get clusters inside a datacenter
89
- host_folder = dc.host_folder
90
- host_folder.fetch_clusters!
91
- host_folder.items.values.each do |ccr|
92
- # Check if the cluster is a host in OpenNebula's pool
93
- one_host =
94
- VCenterDriver::VIHelper
95
- .find_by_ref(
96
- OpenNebula::HostPool,
97
- 'TEMPLATE/VCENTER_CCR_REF',
98
- ccr['_ref'],
99
- vcenter_uuid,
100
- hpool
101
- )
102
- next if one_host
103
-
104
- # Get a ClusterComputeResource object
105
- cluster =
106
- VCenterDriver::ClusterComputeResource
107
- .new_from_ref(
108
- ccr['_ref'],
109
- @vi_client
110
- )
111
-
112
- # Obtain a list of resource pools found in the cluster
113
- rpools =
114
- cluster
115
- .get_resource_pool_list
116
- .reject {|rp| rp[:name].empty? }
117
-
118
- # Determine a host location (folder and subfolders)
119
- item = cluster.item
120
- folders = []
121
- until item.instance_of? RbVmomi::VIM::Datacenter
122
- item = item.parent
123
- if !item.instance_of?(RbVmomi::VIM::Datacenter) &&
124
- item.name != 'host'
125
- folders << item.name
126
- end
127
- raise "Could not find the host's location" if item.nil?
128
- end
129
- location = folders.reverse.join('/')
130
- location = '/' if location.empty?
131
-
132
- # Setting host import name and
133
- # replace spaces and weird characters
134
- cluster_name = ccr['name'].to_s.tr(' ', '_')
135
- cluster_name = VCenterDriver::VcImporter.sanitize(
136
- cluster_name
137
- )
138
- cluster_name =
139
- VCenterDriver::VIHelper
140
- .one_name(
141
- OpenNebula::HostPool,
142
- cluster_name,
143
- ccr['_ref']+vcenter_uuid,
144
- hpool
145
- )
146
-
147
- # Prepare hash for import tool
148
- host_info = {}
149
- host_info[:simple_name] = ccr['name']
150
- host_info[:cluster_name] = cluster_name
151
- host_info[:cluster_ref] = ccr['_ref']
152
- host_info[:cluster_location] = location
153
- host_info[:vcenter_uuid] = vcenter_uuid
154
- host_info[:vcenter_version] = vcenter_version
155
- host_info[:rp_list] = rpools
156
-
157
- # Add the hash to current datacenter
158
- host_objects[dc_name] << host_info
159
- end
160
- end
161
-
162
- host_objects
163
- end
164
-
165
- # rubocop:disable Style/GlobalVars
166
- def get_unimported_datastores(dpool, vcenter_instance_name, hpool, args)
167
- import_id = 0
168
- ds_objects = {}
169
- vcenter_uuid = vcenter_instance_uuid
170
-
171
- # Selected host in OpenNebula
172
- if $conf.nil?
173
- one_client = OpenNebula::Client.new
174
- else
175
- one_client = OpenNebula::Client.new(
176
- nil,
177
- $conf[:one_xmlrpc]
178
- )
179
- end
180
- one_host = OpenNebula::Host.new_with_id(args[:host], one_client)
181
-
182
- rc = one_host.info
183
- raise rc.message if OpenNebula.is_error? rc
184
-
185
- cluster_id = one_host['CLUSTER_ID'].to_i
186
-
187
- # Get datacenters
188
- fetch! if @items.empty?
189
-
190
- @items.values.each do |dc|
191
- clusters_in_ds = {}
192
- dc_name = dc.item.name
193
- dc_ref = dc.item._ref
194
-
195
- datastore_folder = dc.datastore_folder
196
- datastore_folder.fetch!
197
-
198
- datastore_folder.items.values.each do |ds|
199
- name, capacity, free_space =
200
- ds
201
- .item
202
- .collect(
203
- 'name',
204
- 'summary.capacity',
205
- 'summary.freeSpace'
206
- )
207
-
208
- ds_name = VCenterDriver::VcImporter.sanitize(
209
- name.to_s
210
- )
211
-
212
- ds_total_mb = ((capacity.to_i / 1024) / 1024)
213
- ds_free_mb = ((free_space.to_i / 1024) / 1024)
214
- ds_ref = ds['_ref']
215
-
216
- ds_objects[ds_ref] = {}
217
- ds_objects[ds_ref][:ref] = ds_ref
218
- ds_objects[ds_ref][:import_id] = import_id
219
- ds_objects[ds_ref][:datacenter] = dc_name
220
- ds_objects[ds_ref][:simple_name] = ds_name.to_s
221
- ds_objects[ds_ref][:total_mb] = ds_total_mb
222
- ds_objects[ds_ref][:free_mb] = ds_free_mb
223
- ds_objects[ds_ref][:ds] = []
224
- ds_objects[ds_ref][:cluster] = []
225
-
226
- if ds.instance_of? VCenterDriver::Datastore
227
- hosts = ds['host']
228
- hosts.each do |host|
229
- cluster_ref = host.key.parent._ref
230
- if !clusters_in_ds.key?(cluster_ref)
231
- clusters_in_ds[cluster_ref] = nil
232
-
233
- # Try to locate cluster ref in host's pool
234
- one_cluster =
235
- VCenterDriver::VIHelper
236
- .find_by_ref(
237
- OpenNebula::HostPool,
238
- 'TEMPLATE/VCENTER_CCR_REF',
239
- cluster_ref,
240
- vcenter_uuid,
241
- hpool
242
- )
243
- if one_cluster
244
- ds_objects[ds_ref][:cluster] <<
245
- one_cluster['CLUSTER_ID'].to_i
246
- clusters_in_ds[cluster_ref] =
247
- one_cluster['CLUSTER_ID'].to_i
248
- end
249
- else
250
- if clusters_in_ds[cluster_ref] &&
251
- !ds_objects[ds_ref][:cluster]
252
- .include?(
253
- clusters_in_ds[cluster_ref]
254
- )
255
- ds_objects[ds_ref][:cluster] <<
256
- clusters_in_ds[cluster_ref]
257
- end
258
- end
259
- end
260
-
261
- already_image_ds = VCenterDriver::Storage
262
- .exists_one_by_ref_dc_and_type?(
263
- ds_ref,
264
- dc_ref,
265
- vcenter_uuid,
266
- 'IMAGE_DS',
267
- dpool
268
- )
269
-
270
- key = ds_ref+vcenter_uuid
271
- if !already_image_ds
272
- ds_objects[ds_ref][:name] =
273
- VCenterDriver::VIHelper
274
- .one_name(
275
- OpenNebula::DatastorePool,
276
- "#{ds_name}(IMG)",
277
- key
278
- )
279
- object =
280
- ds
281
- .to_one_template(
282
- ds_objects[ds_ref],
283
- vcenter_uuid,
284
- dc_name,
285
- dc_ref,
286
- 'IMAGE_DS'
287
- )
288
- ds_objects[ds_ref][:ds] << object unless object.nil?
289
- end
290
-
291
- already_system_ds =
292
- VCenterDriver::Storage
293
- .exists_one_by_ref_dc_and_type?(
294
- ds_ref,
295
- dc_ref,
296
- vcenter_uuid,
297
- 'SYSTEM_DS',
298
- dpool
299
- )
300
-
301
- if !already_system_ds
302
- ds_objects[ds_ref][:name] =
303
- VCenterDriver::VIHelper
304
- .one_name(
305
- OpenNebula::DatastorePool,
306
- "#{ds_name}(SYS)",
307
- key
308
- )
309
- object = ds
310
- .to_one_template(
311
- ds_objects[ds_ref],
312
- vcenter_uuid,
313
- dc_name,
314
- dc_ref,
315
- 'SYSTEM_DS'
316
- )
317
- ds_objects[ds_ref][:ds] << object unless object.nil?
318
- end
319
-
320
- ds_objects[ds_ref][:name] = ds_name.to_s
321
- elsif ds.instance_of? VCenterDriver::StoragePod
322
- ds['children'].each do |sp_ds|
323
- hosts = sp_ds.host
324
- hosts.each do |host|
325
- cluster_ref = host.key.parent._ref
326
- if !clusters_in_ds.include?(cluster_ref)
327
- clusters_in_ds[cluster_ref] = nil
328
- # Try to locate cluster
329
- # ref in cluster's pool
330
- one_cluster =
331
- VCenterDriver::VIHelper
332
- .find_by_ref(
333
- OpenNebula::HostPool,
334
- 'TEMPLATE/VCENTER_CCR_REF',
335
- cluster_ref,
336
- vcenter_uuid,
337
- hpool
338
- )
339
- if one_cluster
340
- ds_objects[ds_ref][:cluster] <<
341
- one_cluster['CLUSTER_ID'].to_i
342
- clusters_in_ds[cluster_ref] =
343
- one_cluster['CLUSTER_ID'].to_i
344
- end
345
- else
346
- if clusters_in_ds[cluster_ref] &&
347
- !ds_objects[ds_ref][:cluster]
348
- .include?(
349
- clusters_in_ds[cluster_ref]
350
- )
351
- ds_objects[ds_ref][:cluster] <<
352
- clusters_in_ds[cluster_ref]
353
- end
354
- end
355
- end
356
- end
357
-
358
- already_system_ds = VCenterDriver::Storage
359
- .exists_one_by_ref_dc_and_type?(
360
- ds_ref,
361
- dc_ref,
362
- vcenter_uuid,
363
- 'SYSTEM_DS',
364
- dpool
365
- )
366
-
367
- if !already_system_ds
368
- ds_objects[ds_ref][:name] = "#{ds_name} \
369
- [#{vcenter_instance_name} - #{dc_name}] (StorDRS)"
370
- object = ds.to_one_template(
371
- ds_objects[ds_ref],
372
- vcenter_uuid,
373
- dc_name,
374
- dc_ref,
375
- 'SYSTEM_DS'
376
- )
377
- ds_objects[ds_ref][:ds] << object unless object.nil?
378
- end
379
- end
380
-
381
- if ds_objects[ds_ref][:ds].empty?
382
- ds_objects.delete(ds_ref)
383
- else
384
- import_id += 1
385
- end
386
- end
387
- end
388
-
389
- ds_objects.keys.each do |key|
390
- unless ds_objects[key][:cluster].include? cluster_id
391
- ds_objects.delete key
392
- end
393
- end
394
-
395
- { vcenter_instance_name => ds_objects }
396
- end
397
- # rubocop:enable Style/GlobalVars
398
-
399
- def get_unimported_templates(vi_client, tpool)
400
- template_objects = {}
401
- import_id = 0
402
- vcenter_uuid = vcenter_instance_uuid
403
-
404
- vcenter_instance_name = vi_client.vim.host
405
-
406
- fetch! if @items.empty? # Get datacenters
407
-
408
- @items.values.each do |dc|
409
- rp_cache = {}
410
- dc_name = dc.item.name
411
-
412
- view = vi_client
413
- .vim
414
- .serviceContent
415
- .viewManager
416
- .CreateContainerView(
417
- {
418
- :container => dc.item.vmFolder,
419
- :type => ['VirtualMachine'],
420
- :recursive => true
421
- }
422
- )
423
-
424
- pc = vi_client.vim.serviceContent.propertyCollector
425
-
426
- filter_spec = RbVmomi::VIM.PropertyFilterSpec(
427
- :objectSet => [
428
- {
429
- :obj => view,
430
- :skip => true,
431
- :selectSet => [
432
- RbVmomi::VIM.TraversalSpec(
433
- :name => 'traverseEntities',
434
- :type => 'ContainerView',
435
- :path => 'view',
436
- :skip => false
437
- )
438
- ]
439
- }
440
- ],
441
- :propSet => [
442
- {
443
- :type => 'VirtualMachine',
444
- :pathSet => ['config.template']
445
- }
446
- ]
447
- )
448
-
449
- result = pc.RetrieveProperties(
450
- :specSet => [filter_spec]
451
- )
452
-
453
- vms = {}
454
- result.each do |r|
455
- if r.obj.is_a?(RbVmomi::VIM::VirtualMachine)
456
- vms[r.obj._ref] = r.to_hash
457
- end
458
- end
459
- templates = []
460
- vms.each do |ref, value|
461
- next unless value['config.template']
462
-
463
- templates << VCenterDriver::Template
464
- .new_from_ref(
465
- ref,
466
- vi_client
467
- )
468
- end
469
-
470
- view.DestroyView # Destroy the view
471
-
472
- templates.each do |template|
473
- tref = template['_ref']
474
- next if template_objects[tref]
475
-
476
- one_template = VCenterDriver::VIHelper
477
- .find_by_ref(
478
- OpenNebula::TemplatePool,
479
- 'TEMPLATE/VCENTER_TEMPLATE_REF',
480
- tref,
481
- vcenter_uuid,
482
- tpool
483
- )
484
-
485
- # If the template has been already imported
486
- next if one_template
487
-
488
- one_template = VCenterDriver::Template
489
- .get_xml_template(
490
- template,
491
- vcenter_uuid,
492
- vi_client,
493
- dc_name,
494
- rp_cache
495
- )
496
-
497
- next if one_template.nil?
498
-
499
- one_template[:import_id] = import_id
500
- one_template[:vcenter] = vcenter_instance_name
501
- import_id += 1
502
- template_objects[tref] = one_template
503
- end
504
- end
505
-
506
- {
507
- vcenter_instance_name => template_objects
508
- }
509
- end
510
-
511
- def cluster_networks(one_host)
512
- ccr_ref = one_host['TEMPLATE/VCENTER_CCR_REF']
513
- cluster = VCenterDriver::ClusterComputeResource
514
- .new_from_ref(ccr_ref, @vi_client)
515
- # cluster = cluster_mob(one_host)
516
- raise "Cluster with ref: #{ccr_ref} not found" if cluster.nil?
517
-
518
- cluster.item.network
519
- end
520
-
521
- # Return ONE cluster ID
522
- def one_cluster_id(one_host)
523
- if !one_host || !one_host['CLUSTER_ID']
524
- cluster_id = -1
525
- else
526
- cluster_id = one_host['CLUSTER_ID']
527
- end
528
-
529
- cluster_id.to_i
530
- end
531
-
532
- # Determine if a network must be excluded from the list
533
- def exclude_network?(one_host, args, vc_network_hash, network_type)
534
- vc_network_name = vc_network_hash[:vc_network_name]
535
- vc_network_host = vc_network_hash[:vc_network_host]
536
- vc_network_tag = vc_network_hash[:vc_network_tag]
537
-
538
- # Exclude some networks if filter = true
539
- if args[:filter]
540
- if one_host && one_host['TEMPLATE/NSX_PASSWORD'].nil?
541
- network_types = [
542
- VCenterDriver::Network::NETWORK_TYPE_NSXT,
543
- VCenterDriver::Network::NETWORK_TYPE_NSXV
544
- ]
545
-
546
- # Only NSX-V and NSX-T can be excluded
547
- return true if network_types.include? network_type
548
- end
549
- # Exclude networks without hosts
550
- if vc_network_host.empty?
551
- return true
552
- end
553
-
554
- # Exclude DVS uplinks
555
- if !vc_network_tag.empty? &&
556
- vc_network_tag[0][:key] == 'SYSTEM/DVS.UPLINKPG'
557
- return true
558
- end
559
- # Exclude portgroup used for VXLAN communication in NSX
560
- if vc_network_name.match(/^vxw-vmknicPg-dvs-(.*)/)
561
- return true
562
- end
563
-
564
- return false
565
- end
566
- false
567
- end
568
-
569
- # Proccess each network
570
- def process_network(params, networks_type, hosts_list, host_list_object)
571
- vc_network = params[:vc_network]
572
- vcenter_instance_name = params[:vcenter_instance_name]
573
- vcenter_uuid = params[:vcenter_uuid]
574
- _hpool = params[:_hpool]
575
- one_host = params[:one_host]
576
- args = params[:args]
577
-
578
- full_process = !args[:short]
579
-
580
- vc_network_ref = vc_network._ref
581
- vc_network_name = VCenterDriver::VcImporter.sanitize(
582
- vc_network.name
583
- )
584
- vc_network_host = vc_network['host']
585
- vc_network_tag = vc_network['tag']
586
-
587
- vc_network_hash = {}
588
- vc_network_hash[:vc_network_ref] = vc_network_ref
589
- vc_network_hash[:vc_network_name] = vc_network_name
590
- vc_network_hash[:vc_network_host] = vc_network_host
591
- vc_network_hash[:vc_network_tag] = vc_network_tag
592
-
593
- # Initialize network hash
594
- network = {}
595
- # Add name to network hash
596
- network[vc_network_ref] = { 'name' => vc_network_name }
597
- # By default no network is excluded
598
- network[vc_network_ref][:excluded] = false
599
-
600
- # Initialize opts hash used to inject data into one template
601
- opts = {}
602
-
603
- # Add network type to network hash
604
- if networks_type.key?(vc_network_hash[:vc_network_ref])
605
- network_type = networks_type[vc_network_hash[:vc_network_ref]]
606
- else
607
- network_type =
608
- VCenterDriver::Network.get_network_type(
609
- vc_network,
610
- vc_network_name
611
- )
612
- networks_type[vc_network_hash[:vc_network_ref]] = network_type
613
- end
614
-
615
- network[vc_network_ref][:network_type] = network_type
616
- network[vc_network_ref][:type] = network_type
617
-
618
- # Determine if the network must be excluded
619
- network[vc_network_ref][:excluded] = exclude_network?(
620
- one_host,
621
- args,
622
- vc_network_hash,
623
- network_type
624
- )
625
-
626
- if network[vc_network_ref][:excluded] == true
627
- return [nil, networks_type, hosts_list, host_list_object]
628
- end
629
-
630
- if full_process
631
- case network[vc_network_ref][:network_type]
632
- # Distributed PortGroups
633
- when VCenterDriver::Network::NETWORK_TYPE_DPG
634
- network[vc_network_ref][:sw_name] = \
635
- vc_network.config.distributedVirtualSwitch.name
636
- # For DistributedVirtualPortgroups there
637
- # is networks and uplinks
638
- network[vc_network_ref][:uplink] = \
639
- vc_network.config.uplink
640
- # network[vc_network_ref][:uplink] = false
641
- # NSX-V PortGroups
642
- when VCenterDriver::Network::NETWORK_TYPE_NSXV
643
- network[vc_network_ref][:sw_name] = \
644
- vc_network.config.distributedVirtualSwitch.name
645
- # For NSX-V ( is the same as DistributedVirtualPortgroups )
646
- # there is networks and uplinks
647
- network[vc_network_ref][:uplink] = \
648
- vc_network.config.uplink
649
- network[vc_network_ref][:uplink] = false
650
- # Standard PortGroups
651
- when VCenterDriver::Network::NETWORK_TYPE_PG
652
- # There is no uplinks for standard portgroups,
653
- # so all Standard
654
- # PortGroups are networks and no uplinks
655
- network[vc_network_ref][:uplink] = false
656
- network[vc_network_ref][:sw_name] =
657
- VCenterDriver::Network
658
- .virtual_switch(
659
- vc_network
660
- )
661
- # NSX-T PortGroups
662
- when VCenterDriver::Network::NETWORK_TYPE_NSXT
663
- network[vc_network_ref][:sw_name] = \
664
- vc_network.summary.opaqueNetworkType
665
- # There is no uplinks for NSX-T networks,
666
- # so all NSX-T networks
667
- # are networks and no uplinks
668
- network[vc_network_ref][:uplink] = false
669
- else
670
- raise 'Unknown network type: ' \
671
- "#{network[vc_network_ref][:network_type]}"
672
- end
673
- end
674
-
675
- # Multicluster nets support
676
- network[vc_network_ref][:clusters] = {}
677
- network[vc_network_ref][:clusters][:refs] = []
678
- network[vc_network_ref][:clusters][:one_ids] = []
679
- network[vc_network_ref][:clusters][:names] = []
680
-
681
- # Get hosts related to this network and add them if is not
682
- # excluded
683
- vc_hosts = vc_network.host
684
- vc_hosts.each do |vc_host|
685
- # Get vCenter Cluster
686
- vc_host_ref = vc_host._ref
687
- if !host_list_object.key?(vc_host_ref)
688
- vc_cluster = vc_host.parent
689
- vc_cluster_ref = vc_cluster._ref
690
- vc_cluster_name = vc_cluster.name
691
- host_list_object[vc_host_ref] = {
692
- :vc_cluster_ref => vc_cluster_ref,
693
- :vc_cluster_name => vc_cluster_name
694
- }
695
- end
696
-
697
- vc_cluster = host_list_object[vc_host_ref]
698
-
699
- if hosts_list.key? vc_cluster[:vc_cluster_ref]
700
- one_host = hosts_list[vc_cluster[:vc_cluster_ref]]
701
- else
702
- one_host = VCenterDriver::VIHelper
703
- .find_by_ref(OpenNebula::HostPool,
704
- 'TEMPLATE/VCENTER_CCR_REF',
705
- vc_cluster[:vc_cluster_ref],
706
- vcenter_uuid)
707
- hosts_list[vc_cluster[:vc_cluster_ref]] = one_host
708
- end
709
- # Check if network is excluded from each host
710
- next if exclude_network?(
711
- one_host,
712
- args,
713
- vc_network_hash,
714
- network_type
715
- )
716
-
717
- # Insert vCenter cluster ref
718
- network[vc_network_ref][:clusters][:refs] <<
719
- vc_cluster[:vc_cluster_ref]
720
-
721
- # Insert OpenNebula cluster id
722
- cluster_id = one_cluster_id(one_host)
723
- network[vc_network_ref][:clusters][:one_ids] <<
724
- cluster_id
725
-
726
- # Insert vCenter cluster name
727
- network[vc_network_ref][:clusters][:names] <<
728
- vc_cluster[:vc_cluster_name]
729
- opts[:dc_name] = vc_cluster[:vc_cluster_name]
730
- end
731
-
732
- # Remove duplicate entries
733
- network[vc_network_ref][:clusters][:refs].uniq!
734
- network[vc_network_ref][:clusters][:one_ids].uniq!
735
- network[vc_network_ref][:clusters][:names].uniq!
736
-
737
- # Mark network as processed
738
- network[vc_network_ref][:processed] = true
739
-
740
- if full_process
741
- # General net_info related to datacenter
742
- opts[:vcenter_uuid] = vcenter_uuid
743
- opts[:vcenter_instance_name] = vcenter_instance_name
744
- opts[:network_name] = network[vc_network_ref]['name']
745
- opts[:network_ref] = network.keys.first
746
- opts[:network_type] = network[vc_network_ref][:network_type]
747
- opts[:sw_name] = network[vc_network_ref][:sw_name]
748
-
749
- network[vc_network_ref] = \
750
- network[vc_network_ref]
751
- .merge(VCenterDriver::Network
752
- .to_one_template(opts))
753
- else
754
- network[vc_network_ref][:ref] = \
755
- vc_network_ref
756
- network[vc_network_ref][:name] = \
757
- network[vc_network_ref]['name']
758
- end
759
-
760
- [network, networks_type, hosts_list, host_list_object]
761
- end
762
-
763
- # rubocop:disable Style/GlobalVars
764
- def get_unimported_networks(npool, vcenter_instance_name, hpool, args)
765
- vcenter_uuid = vcenter_instance_uuid
766
- networks = {}
767
-
768
- # Selected host in OpenNebula
769
- if $conf.nil?
770
- one_client = OpenNebula::Client.new
771
- else
772
- one_client = OpenNebula::Client.new(
773
- nil,
774
- $conf[:one_xmlrpc]
775
- )
776
- end
777
- one_host = OpenNebula::Host.new_with_id(args[:host], one_client)
778
- rc = one_host.info
779
- raise rc.message if OpenNebula.is_error? rc
780
-
781
- # Get all networks in vcenter cluster (one_host)
782
- vc_cluster_networks = cluster_networks(one_host)
783
- networks_type = {}
784
- hosts_list = {}
785
- host_list_object = {}
786
-
787
- # Iterate over vcenter networks
788
- vc_cluster_networks.each do |vc_cluster_network|
789
- exist = VCenterDriver::VIHelper
790
- .find_by_ref(OpenNebula::VirtualNetworkPool,
791
- 'TEMPLATE/VCENTER_NET_REF',
792
- vc_cluster_network._ref,
793
- vcenter_uuid,
794
- npool)
795
-
796
- next if exist
797
-
798
- params = {}
799
-
800
- params[:vc_network]= vc_cluster_network
801
- params[:vcenter_instance_name]= vcenter_instance_name
802
- params[:vcenter_uuid]= vcenter_uuid
803
- params[:_hpool]= hpool
804
- params[:one_host]= one_host
805
- params[:args] = args
806
-
807
- network,
808
- networks_type_new,
809
- hosts_list_new,
810
- host_list_object_new =
811
- process_network(
812
- params,
813
- networks_type,
814
- hosts_list,
815
- host_list_object
816
- )
817
-
818
- networks_type = networks_type_new
819
- hosts_list = hosts_list_new
820
- host_list_object = host_list_object_new
821
-
822
- networks.merge!(network) unless network.nil?
823
- end
824
- # Added import id
825
- imid = -1
826
- networks.map {|_k, v| v[:import_id] = imid += 1 }
827
- { vcenter_instance_name => networks }
828
- end
829
- # rubocop:enable Style/GlobalVars
830
-
831
- end
832
- # class DatatacenterFolder
833
-
834
- ##########################################################################
835
- # Class Datacenter
836
- ##########################################################################
837
- class Datacenter
838
-
839
- attr_accessor :item
840
-
841
- DPG_CREATE_TIMEOUT = 240
842
-
843
- def initialize(item, vi_client = nil)
844
- check_item(item, RbVmomi::VIM::Datacenter)
845
-
846
- @vi_client = vi_client
847
- @item = item
848
- @net_rollback = []
849
- @locking = true
850
- end
851
-
852
- def datastore_folder
853
- DatastoreFolder.new(@item.datastoreFolder)
854
- end
855
-
856
- def host_folder
857
- HostFolder.new(@item.hostFolder)
858
- end
859
-
860
- def vm_folder
861
- VirtualMachineFolder.new(@item.vmFolder)
862
- end
863
-
864
- def network_folder
865
- NetworkFolder.new(@item.networkFolder)
866
- end
867
-
868
- # Locking function. Similar to flock
869
- def lock
870
- hostlockname = @item['name'].downcase.tr(' ', '_')
871
- return unless @locking
872
-
873
- @locking_file =
874
- File
875
- .open("/tmp/vcenter-dc-#{hostlockname}-lock", 'w')
876
- @locking_file.flock(File::LOCK_EX)
877
- end
878
-
879
- # Unlock driver execution mutex
880
- def unlock
881
- return unless @locking
882
-
883
- @locking_file.close
884
- end
885
-
886
- ########################################################################
887
- # Check if distributed virtual switch exists in host
888
- ########################################################################
889
- def dvs_exists(switch_name, net_folder)
890
- net_folder.items.values.select do |dvs|
891
- dvs.instance_of?(VCenterDriver::DistributedVirtualSwitch) &&
892
- dvs['name'] == switch_name
893
- end.first rescue nil
894
- end
895
-
896
- ########################################################################
897
- # Is the distributed switch for the distributed pg different?
898
- ########################################################################
899
- def pg_changes_sw?(dpg, switch_name)
900
- dpg['config.distributedVirtualSwitch.name'] != switch_name
901
- end
902
-
903
- ########################################################################
904
- # Create a distributed vcenter switch in a datacenter
905
- ########################################################################
906
- def create_dvs(switch_name, pnics, mtu = 1500)
907
- # Prepare spec for DVS creation
908
- spec = RbVmomi::VIM::DVSCreateSpec.new
909
- spec.configSpec = RbVmomi::VIM::VMwareDVSConfigSpec.new
910
- spec.configSpec.name = switch_name
911
-
912
- # Specify number of uplinks port for dpg
913
- if pnics
914
- pnics = pnics.split(',')
915
- if !pnics.empty?
916
- spec.configSpec.uplinkPortPolicy =
917
- RbVmomi::VIM::DVSNameArrayUplinkPortPolicy.new
918
- spec.configSpec.uplinkPortPolicy.uplinkPortName = []
919
- (0..pnics.size-1).each do |index|
920
- spec
921
- .configSpec
922
- .uplinkPortPolicy
923
- .uplinkPortName[index]="dvUplink#{index+1}"
924
- end
925
- end
926
- end
927
-
928
- # Set maximum MTU
929
- spec.configSpec.maxMtu = mtu
930
-
931
- # The DVS must be created in the networkFolder of the datacenter
932
- dvs_creation_task = @item
933
- .networkFolder
934
- .CreateDVS_Task(
935
- :spec => spec
936
- )
937
- dvs_creation_task.wait_for_completion
938
-
939
- # If task finished successfuly we rename the uplink portgroup
940
- dvs = nil
941
- if dvs_creation_task.info.state == 'success'
942
- dvs = dvs_creation_task.info.result
943
- dvs
944
- .config
945
- .uplinkPortgroup[0]
946
- .Rename_Task(
947
- :newName => "#{switch_name}-uplink-pg"
948
- ).wait_for_completion
949
- else
950
- raise "The Distributed vSwitch #{switch_name} \
951
- could not be created. "
952
- end
953
-
954
- @net_rollback << {
955
- :action => :delete_dvs,
956
- :dvs => dvs,
957
- :name => switch_name
958
- }
959
-
960
- VCenterDriver::DistributedVirtualSwitch.new(dvs, @vi_client)
961
- end
962
-
963
- ########################################################################
964
- # Update a distributed vcenter switch
965
- ########################################################################
966
- def update_dvs(dvs, pnics, mtu)
967
- # Prepare spec for DVS creation
968
- spec = RbVmomi::VIM::VMwareDVSConfigSpec.new
969
- changed = false
970
-
971
- orig_spec = RbVmomi::VIM::VMwareDVSConfigSpec.new
972
- orig_spec.maxMtu = dvs['config.maxMtu']
973
- orig_spec.uplinkPortPolicy =
974
- RbVmomi::VIM::DVSNameArrayUplinkPortPolicy.new
975
- orig_spec.uplinkPortPolicy.uplinkPortName = []
976
- (0..dvs['config.uplinkPortgroup'].length-1).each do |index|
977
- orig_spec
978
- .uplinkPortPolicy
979
- .uplinkPortName[index]="dvUplink#{index+1}"
980
- end
981
-
982
- # Add more uplinks to default uplink
983
- # port group according to number of pnics
984
- if pnics
985
- pnics = pnics.split(',')
986
- if !pnics.empty? && dvs['config.uplinkPortgroup']
987
- .length != pnics.size
988
- spec.uplinkPortPolicy =
989
- RbVmomi::VIM::DVSNameArrayUplinkPortPolicy.new
990
- spec.uplinkPortPolicy.uplinkPortName = []
991
- (dvs['config.uplinkPortgroup']
992
- .length..num_pnics-1)
993
- .each do |index|
994
- spec
995
- .uplinkPortPolicy
996
- .uplinkPortName[index] =
997
- "dvUplink#{index+1}"
998
- end
999
- changed = true
1000
- end
1001
- end
1002
-
1003
- # Set maximum MTU
1004
- if mtu != dvs['config.maxMtu']
1005
- spec.maxMtu = mtu
1006
- changed = true
1007
- end
1008
-
1009
- # The DVS must be created in the networkFolder of the datacenter
1010
- return unless changed
1011
-
1012
- spec.configVersion = dvs['config.configVersion']
1013
-
1014
- begin
1015
- dvs
1016
- .item
1017
- .ReconfigureDvs_Task(
1018
- :spec => spec
1019
- ).wait_for_completion
1020
- rescue StandardError => e
1021
- raise "The Distributed switch #{dvs['name']} could \
1022
- not be updated. "\
1023
- "Reason: #{e.message}"
1024
- end
1025
-
1026
- @net_rollback << {
1027
- :action => :update_dvs,
1028
- :dvs => dvs.item,
1029
- :name => dvs['name'],
1030
- :spec => orig_spec
1031
- }
1032
- end
1033
-
1034
- ########################################################################
1035
- # Remove a distributed vcenter switch in a datacenter
1036
- ########################################################################
1037
- def remove_dvs(dvs)
1038
- begin
1039
- dvs.item.Destroy_Task.wait_for_completion
1040
- rescue StandardError
1041
- # Ignore destroy task exception
1042
- end
1043
- end
1044
-
1045
- ########################################################################
1046
- # Check if distributed port group exists in datacenter
1047
- ########################################################################
1048
- def dpg_exists(pg_name, net_folder)
1049
- net_folder.items.values.select do |dpg|
1050
- dpg.instance_of?(VCenterDriver::DistributedPortGroup) &&
1051
- dpg['name'] == pg_name
1052
- end.first rescue nil
1053
- end
1054
-
1055
- ########################################################################
1056
- # Check if Opaque Network exists in datacenter
1057
- ########################################################################
1058
- def nsx_network(nsx_id, pg_type)
1059
- timeout = 180
1060
- case pg_type
1061
- when VCenterDriver::Network::NETWORK_TYPE_NSXT
1062
- while timeout > 0
1063
- net_folder = network_folder
1064
- net_folder.fetch!
1065
- net_folder.items.values.each do |net|
1066
- if net.instance_of?(VCenterDriver::OpaqueNetwork) &&
1067
- net.item.summary.opaqueNetworkId == nsx_id
1068
- return net.item._ref
1069
- end
1070
- end
1071
- sleep(1)
1072
- timeout -= 1
1073
- end
1074
- # Not used right now, but maybe neccesary in the future.
1075
- when VCenterDriver::Network::NETWORK_TYPE_NSXV
1076
- while timeout > 0
1077
- net_folder = network_folder
1078
- net_folder.fetch!
1079
- net_folder.items.values.each do |net|
1080
- if net.instance_of?(
1081
- VCenterDriver::DistributedPortGroup
1082
- ) &&
1083
- net.item.key == nsx_id
1084
- return net.item._ref
1085
- end
1086
- end
1087
- sleep(1)
1088
- timeout -= 1
1089
- end
1090
- else
1091
- raise "Unknown network Port Group type: #{pg_type}"
1092
- end
1093
- end
1094
-
1095
- ########################################################################
1096
- # Create a distributed vcenter port group
1097
- ########################################################################
1098
- def create_dpg(dvs, pg_name, vlan_id, num_ports)
1099
- spec = RbVmomi::VIM::DVPortgroupConfigSpec.new
1100
-
1101
- # OpenNebula use DVS static port binding with autoexpand
1102
- if num_ports
1103
- spec.autoExpand = true
1104
- spec.numPorts = num_ports
1105
- end
1106
-
1107
- # Distributed port group name
1108
- spec.name = pg_name
1109
-
1110
- # Set VLAN information
1111
- spec.defaultPortConfig =
1112
- RbVmomi::VIM::VMwareDVSPortSetting.new
1113
- spec.defaultPortConfig.vlan =
1114
- RbVmomi::VIM::VmwareDistributedVirtualSwitchVlanIdSpec.new
1115
- spec.defaultPortConfig.vlan.vlanId =
1116
- vlan_id
1117
- spec.defaultPortConfig.vlan.inherited =
1118
- false
1119
-
1120
- # earlyBinding. A free DistributedVirtualPort will be selected and
1121
- # assigned to a VirtualMachine when
1122
- # the virtual machine is reconfigured
1123
- # to connect to the portgroup.
1124
- spec.type = 'earlyBinding'
1125
-
1126
- begin
1127
- dvs
1128
- .item
1129
- .AddDVPortgroup_Task(
1130
- :spec => [spec]
1131
- ).wait_for_completion
1132
- rescue StandardError => e
1133
- raise "The Distributed port group #{pg_name} \
1134
- could not be created. "\
1135
- "Reason: #{e.message}"
1136
- end
1137
-
1138
- # wait until the network is ready and we have a reference
1139
- portgroups = dvs['portgroup'].select do |dpg|
1140
- dpg.instance_of?(RbVmomi::VIM::DistributedVirtualPortgroup) &&
1141
- dpg['name'] == pg_name
1142
- end
1143
-
1144
- (0..DPG_CREATE_TIMEOUT).each do
1145
- break unless portgroups.empty?
1146
-
1147
- portgroups = dvs['portgroup'].select do |dpg|
1148
- dpg
1149
- .instance_of?(
1150
- RbVmomi::VIM::DistributedVirtualPortgroup
1151
- ) && dpg['name'] == pg_name
1152
- end
1153
- sleep 1
1154
- end
1155
-
1156
- if portgroups.empty?
1157
- raise 'Cannot get VCENTER_NET_REF \
1158
- for new distributed port group'
1159
- end
1160
-
1161
- @net_rollback << {
1162
- :action => :delete_dpg,
1163
- :dpg => portgroups.first,
1164
- :name => pg_name
1165
- }
1166
-
1167
- portgroups.first._ref
1168
- end
1169
-
1170
- ########################################################################
1171
- # Update a distributed vcenter port group
1172
- ########################################################################
1173
- def update_dpg(dpg, vlan_id, num_ports)
1174
- spec = RbVmomi::VIM::DVPortgroupConfigSpec.new
1175
-
1176
- changed = false
1177
-
1178
- orig_spec =
1179
- RbVmomi::VIM::DVPortgroupConfigSpec.new
1180
- orig_spec.numPorts =
1181
- dpg['config.numPorts']
1182
- orig_spec.defaultPortConfig =
1183
- RbVmomi::VIM::VMwareDVSPortSetting.new
1184
- orig_spec.defaultPortConfig.vlan =
1185
- RbVmomi::VIM::VmwareDistributedVirtualSwitchVlanIdSpec.new
1186
- orig_spec.defaultPortConfig.vlan.vlanId =
1187
- dpg['config.defaultPortConfig.vlan.vlanId']
1188
- orig_spec.defaultPortConfig.vlan.inherited =
1189
- false
1190
-
1191
- if num_ports && num_ports != orig_spec.numPorts
1192
- spec.numPorts = num_ports
1193
- changed = true
1194
- end
1195
-
1196
- # earlyBinding. A free DistributedVirtualPort
1197
- # will be selected and
1198
- # assigned to a VirtualMachine when
1199
- # the virtual machine is reconfigured
1200
- # to connect to the portgroup.
1201
- spec.type = 'earlyBinding'
1202
-
1203
- if vlan_id != orig_spec.defaultPortConfig.vlan.vlanId
1204
- spec.defaultPortConfig =
1205
- RbVmomi::VIM::VMwareDVSPortSetting.new
1206
- spec.defaultPortConfig.vlan =
1207
- RbVmomi::VIM::VmwareDistributedVirtualSwitchVlanIdSpec.new
1208
- spec.defaultPortConfig.vlan.vlanId = vlan_id
1209
- spec.defaultPortConfig.vlan.inherited = false
1210
- changed = true
1211
- end
1212
-
1213
- return unless changed
1214
-
1215
- spec.configVersion = dpg['config.configVersion']
1216
-
1217
- begin
1218
- dpg
1219
- .item
1220
- .ReconfigureDVPortgroup_Task(
1221
- :spec => spec
1222
- ).wait_for_completion
1223
- rescue StandardError => e
1224
- raise "The Distributed port group #{dpg['name']} \
1225
- could not be created. "\
1226
- "Reason: #{e.message}"
1227
- end
1228
-
1229
- @net_rollback << {
1230
- :action => :update_dpg,
1231
- :dpg => dpg.item,
1232
- :name => dpg['name'],
1233
- :spec => orig_spec
1234
- }
1235
- end
1236
-
1237
- ########################################################################
1238
- # Remove distributed port group from datacenter
1239
- ########################################################################
1240
- def remove_dpg(dpg)
1241
- begin
1242
- dpg.item.Destroy_Task.wait_for_completion
1243
- rescue RbVmomi::VIM::ResourceInUse
1244
- STDERR.puts "The distributed portgroup \
1245
- #{dpg['name']} is in use so it cannot be deleted"
1246
- nil
1247
- rescue StandardError => e
1248
- raise "The Distributed portgroup #{dpg['name']} \
1249
- could not be deleted. Reason: #{e.message} "
1250
- end
1251
- end
1252
-
1253
- ########################################################################
1254
- # Perform vcenter network rollback operations
1255
- ########################################################################
1256
- def network_rollback
1257
- @net_rollback.reverse_each do |nr|
1258
- case nr[:action]
1259
- when :update_dpg
1260
- begin
1261
- nr[:dpg].ReconfigureDVPortgroup_Task(:spec => nr[:spec])
1262
- .wait_for_completion
1263
- rescue StandardError => e
1264
- raise "A rollback operation for distributed \
1265
- port group #{nr[:name]} could not \
1266
- be performed. Reason: #{e.message}"
1267
- end
1268
- when :update_dvs
1269
- begin
1270
- nr[:dvs].ReconfigureDvs_Task(:spec => nr[:spec])
1271
- .wait_for_completion
1272
- rescue StandardError => e
1273
- raise "A rollback operation for distributed\
1274
- standard switch #{nr[:name]} could \
1275
- not be performed. Reason: #{e.message}"
1276
- end
1277
- when :delete_dvs
1278
- begin
1279
- nr[:dvs].Destroy_Task.wait_for_completion
1280
- rescue RbVmomi::VIM::ResourceInUse
1281
- next # Ignore if switch in use
1282
- rescue RbVmomi::VIM::NotFound
1283
- next # Ignore if switch not found
1284
- rescue StandardError => e
1285
- raise "A rollback operation \
1286
- for standard switch #{nr[:name]} \
1287
- could not be performed. Reason: #{e.message}"
1288
- end
1289
- when :delete_dpg
1290
- begin
1291
- nr[:dpg].Destroy_Task.wait_for_completion
1292
- rescue RbVmomi::VIM::ResourceInUse
1293
- next # Ignore if pg in use
1294
- rescue RbVmomi::VIM::NotFound
1295
- next # Ignore if pg not found
1296
- rescue StandardError => e
1297
- raise "A rollback operation for \
1298
- standard port group #{nr[:name]} could \
1299
- not be performed. Reason: #{e.message}"
1300
- end
1301
- end
1302
- end
1303
- end
1304
-
1305
- ########################################################################
1306
- # PowerOn VMs
1307
- ########################################################################
1308
- def power_on_vm(vm)
1309
- @item.PowerOnMultiVM_Task({ :vm => [vm] }).wait_for_completion
1310
- end
1311
-
1312
- def self.new_from_ref(ref, vi_client)
1313
- new(RbVmomi::VIM::Datacenter.new(vi_client.vim, ref), vi_client)
1314
- end
1315
-
1316
- end
1317
-
1318
- end
1319
- # module VCenterDriver