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.
- checksums.yaml +4 -4
- data/lib/cloud/CloudClient.rb +3 -3
- data/lib/models/role.rb +349 -823
- data/lib/models/service.rb +156 -80
- data/lib/models/vmrole.rb +703 -0
- data/lib/models/vrrole.rb +284 -0
- data/lib/models.rb +3 -1
- data/lib/opennebula/acl.rb +1 -1
- data/lib/opennebula/acl_pool.rb +1 -1
- data/lib/opennebula/backupjob.rb +1 -1
- data/lib/opennebula/backupjob_pool.rb +1 -1
- data/lib/opennebula/client.rb +1 -1
- data/lib/opennebula/cluster.rb +45 -2
- data/lib/opennebula/cluster_pool.rb +1 -1
- data/lib/opennebula/datastore.rb +1 -1
- data/lib/opennebula/datastore_pool.rb +1 -1
- data/lib/opennebula/document.rb +1 -1
- data/lib/opennebula/document_json.rb +1 -1
- data/lib/opennebula/document_pool.rb +1 -1
- data/lib/opennebula/document_pool_json.rb +1 -1
- data/lib/opennebula/error.rb +1 -1
- data/lib/opennebula/flow/grammar.rb +1 -1
- data/lib/opennebula/flow/service_pool.rb +1 -1
- data/lib/opennebula/flow/service_template.rb +353 -97
- data/lib/opennebula/flow/service_template_ext.rb +3 -3
- data/lib/opennebula/flow/service_template_pool.rb +1 -1
- data/lib/opennebula/flow/validator.rb +458 -410
- data/lib/opennebula/flow.rb +1 -1
- data/lib/opennebula/group.rb +1 -1
- data/lib/opennebula/group_pool.rb +1 -1
- data/lib/opennebula/hook.rb +1 -1
- data/lib/opennebula/hook_log.rb +1 -1
- data/lib/opennebula/hook_pool.rb +1 -1
- data/lib/opennebula/host.rb +1 -60
- data/lib/opennebula/host_pool.rb +1 -1
- data/lib/opennebula/image.rb +1 -1
- data/lib/opennebula/image_pool.rb +1 -1
- data/lib/opennebula/ldap_auth.rb +1 -1
- data/lib/opennebula/ldap_auth_spec.rb +1 -1
- data/lib/opennebula/lockable_ext.rb +1 -1
- data/lib/opennebula/marketplace.rb +1 -1
- data/lib/opennebula/marketplace_pool.rb +1 -1
- data/lib/opennebula/marketplaceapp.rb +1 -1
- data/lib/opennebula/marketplaceapp_ext.rb +14 -211
- data/lib/opennebula/marketplaceapp_pool.rb +1 -1
- data/lib/opennebula/oneflow_client.rb +11 -9
- data/lib/opennebula/pool.rb +1 -1
- data/lib/opennebula/pool_element.rb +1 -1
- data/lib/opennebula/security_group.rb +1 -1
- data/lib/opennebula/security_group_pool.rb +1 -1
- data/lib/opennebula/server_cipher_auth.rb +1 -1
- data/lib/opennebula/server_x509_auth.rb +1 -1
- data/lib/opennebula/ssh_auth.rb +1 -1
- data/lib/opennebula/system.rb +1 -1
- data/lib/opennebula/template.rb +1 -1
- data/lib/opennebula/template_ext.rb +1 -1
- data/lib/opennebula/template_pool.rb +1 -1
- data/lib/opennebula/user.rb +1 -1
- data/lib/opennebula/user_pool.rb +1 -1
- data/lib/opennebula/utils.rb +2 -2
- data/lib/opennebula/vdc.rb +1 -1
- data/lib/opennebula/vdc_pool.rb +1 -1
- data/lib/opennebula/virtual_machine.rb +3 -12
- data/lib/opennebula/virtual_machine_ext.rb +2 -31
- data/lib/opennebula/virtual_machine_pool.rb +1 -1
- data/lib/opennebula/virtual_network.rb +1 -1
- data/lib/opennebula/virtual_network_pool.rb +1 -1
- data/lib/opennebula/virtual_router.rb +1 -1
- data/lib/opennebula/virtual_router_pool.rb +1 -1
- data/lib/opennebula/vm_group.rb +1 -1
- data/lib/opennebula/vm_group_pool.rb +1 -1
- data/lib/opennebula/vntemplate.rb +1 -1
- data/lib/opennebula/vntemplate_pool.rb +1 -1
- data/lib/opennebula/wait_ext.rb +1 -1
- data/lib/opennebula/x509_auth.rb +1 -1
- data/lib/opennebula/xml_element.rb +2 -2
- data/lib/opennebula/xml_pool.rb +1 -1
- data/lib/opennebula/xml_utils.rb +1 -1
- data/lib/opennebula/zone.rb +1 -1
- data/lib/opennebula/zone_pool.rb +1 -1
- data/lib/opennebula.rb +2 -2
- metadata +6 -67
- data/lib/ActionManager.rb +0 -280
- data/lib/CommandManager.rb +0 -328
- data/lib/DriverExecHelper.rb +0 -213
- data/lib/HostSyncManager.rb +0 -111
- data/lib/OpenNebulaDriver.rb +0 -223
- data/lib/VirtualMachineDriver.rb +0 -404
- data/lib/datacenter.rb +0 -1319
- data/lib/datastore.rb +0 -1049
- data/lib/distributed_firewall.rb +0 -293
- data/lib/file_helper.rb +0 -374
- data/lib/host.rb +0 -1518
- data/lib/logical_port.rb +0 -50
- data/lib/logical_switch.rb +0 -77
- data/lib/memoize.rb +0 -74
- data/lib/network.rb +0 -705
- data/lib/nsx_client.rb +0 -157
- data/lib/nsx_component.rb +0 -28
- data/lib/nsx_constants.rb +0 -162
- data/lib/nsx_driver.rb +0 -91
- data/lib/nsx_error.rb +0 -77
- data/lib/nsx_rule.rb +0 -206
- data/lib/nsxt_client.rb +0 -189
- data/lib/nsxt_dfw.rb +0 -196
- data/lib/nsxt_logical_port.rb +0 -94
- data/lib/nsxt_rule.rb +0 -188
- data/lib/nsxt_tz.rb +0 -38
- data/lib/nsxv_client.rb +0 -189
- data/lib/nsxv_dfw.rb +0 -202
- data/lib/nsxv_logical_port.rb +0 -107
- data/lib/nsxv_rule.rb +0 -172
- data/lib/nsxv_tz.rb +0 -41
- data/lib/opaque_network.rb +0 -134
- data/lib/rest_client.rb +0 -191
- data/lib/scripts_common.rb +0 -176
- data/lib/transport_zone.rb +0 -43
- data/lib/vcenter_driver.rb +0 -152
- data/lib/vcenter_importer.rb +0 -626
- data/lib/vi_client.rb +0 -273
- data/lib/vi_helper.rb +0 -328
- data/lib/virtual_machine.rb +0 -3574
- data/lib/virtual_wire.rb +0 -158
- data/lib/vm_device.rb +0 -80
- data/lib/vm_disk.rb +0 -202
- data/lib/vm_folder.rb +0 -69
- data/lib/vm_helper.rb +0 -30
- data/lib/vm_monitor.rb +0 -305
- data/lib/vm_nic.rb +0 -70
- data/lib/vm_template.rb +0 -2112
- 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
|