opennebula 6.0.3 → 6.2.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -202,7 +202,7 @@ module VCenterDriver
202
202
  # index associated to his own resource opt
203
203
  #
204
204
  # Example:
205
- # {"vm-343" => {linked: '0', copy: '0'...}
205
+ # {"vm-343" => {:linked_clone: '0', :copy: '0'...}
206
206
  #
207
207
  # @ return [Hash] the list of unimported resources
208
208
  #
@@ -263,7 +263,10 @@ module VCenterDriver
263
263
 
264
264
  cluster_list = {}
265
265
  cpool.each do |c|
266
- cluster_list[c['ID']] = c['NAME'] if c['ID'].to_i != 0
266
+ name = VCenterDriver::VcImporter.sanitize(
267
+ c['NAME']
268
+ )
269
+ cluster_list[c['ID']] = name if c['ID'].to_i != 0
267
270
  end
268
271
 
269
272
  # Get OpenNebula's host pool
@@ -312,10 +315,13 @@ module VCenterDriver
312
315
 
313
316
  cluster_list_str = "\n"
314
317
  cluster_list.each do |key, value|
318
+ name = VCenterDriver::VcImporter.sanitize(
319
+ value
320
+ )
315
321
  cluster_list_str << " - \e[94mID: " \
316
322
  << key \
317
323
  << "\e[39m - NAME: " \
318
- << value << "\n"
324
+ << name << "\n"
319
325
  end
320
326
 
321
327
  STDOUT.print "\n #{cluster_list_str}"
@@ -330,15 +336,19 @@ module VCenterDriver
330
336
  end
331
337
  end
332
338
 
339
+ cluster_name = VCenterDriver::VcImporter.sanitize(
340
+ cluster[:cluster_name]
341
+ )
342
+
333
343
  # Check if the OpenNebula Cluster exists, and reuse it
334
344
  one_cluster_id ||= cluster_list
335
- .key(cluster[:cluster_name])
345
+ .key(cluster_name)
336
346
 
337
347
  if !one_cluster_id
338
348
  one_cluster = VCenterDriver::VIHelper
339
349
  .new_one_item(OpenNebula::Cluster)
340
350
  rc = one_cluster
341
- .allocate((cluster[:cluster_name]).to_s)
351
+ .allocate(cluster_name.to_s)
342
352
  if ::OpenNebula.is_error?(rc)
343
353
  # rubocop:disable Layout/LineLength
344
354
  STDOUT.puts " Error creating OpenNebula cluster: #{rc.message}\n"
@@ -355,7 +365,7 @@ module VCenterDriver
355
365
  rpool,
356
366
  one_cluster_id)
357
367
  # rubocop:disable Layout/LineLength
358
- STDOUT.puts "\n OpenNebula host \e[92m#{cluster[:cluster_name]}\e[39m with"\
368
+ STDOUT.puts "\n OpenNebula host \e[92m#{cluster_name}\e[39m with"\
359
369
  " ID \e[94m#{one_host.id}\e[39m successfully created."
360
370
  STDOUT.puts
361
371
  # rubocop:enable Layout/LineLength
@@ -369,9 +379,11 @@ module VCenterDriver
369
379
  error_msg = "\nError: #{e.message}\n"
370
380
  error_msg << "#{e.backtrace}\n" \
371
381
  if VCenterDriver::CONFIG[:debug_information]
372
- STDOUT.puts error_msg
382
+ STDERR.puts error_msg
383
+ raise_error = true
373
384
  ensure
374
385
  vi_client.close_connection if vi_client
386
+ raise if raise_error
375
387
  end
376
388
  end
377
389
 
@@ -579,8 +579,6 @@ end
579
579
  end
580
580
  end
581
581
 
582
- dc = cluster.datacenter
583
-
584
582
  vcenter_vm_folder = drv_action['USER_TEMPLATE/VCENTER_VM_FOLDER']
585
583
 
586
584
  if !vcenter_vm_folder.nil? && !vcenter_vm_folder.empty?
@@ -1090,14 +1088,22 @@ end
1090
1088
  #
1091
1089
  # @return [Hash ("String" => self.Nic)] Model representation of nics
1092
1090
  def info_nics
1091
+ keep_mac_on_imported = false
1092
+ keep_mac_on_imported = CONFIG[:keep_mac_on_imported] \
1093
+ unless CONFIG[:keep_mac_on_imported].nil?
1094
+
1093
1095
  @nics = { :macs => {} }
1094
1096
 
1095
1097
  vc_nics = vcenter_nics_list
1096
1098
  one_nics = one_nics_get
1097
1099
 
1098
1100
  one_nics.each do |one_nic|
1099
- index = one_nic['NIC_ID']
1100
- mac = one_nic['MAC']
1101
+ index = one_nic['NIC_ID']
1102
+ if keep_mac_on_imported && one_nic['MAC_IMPORTED']
1103
+ mac = one_nic['MAC_IMPORTED']
1104
+ else
1105
+ mac = one_nic['MAC']
1106
+ end
1101
1107
  vc_dev = query_nic(mac, vc_nics)
1102
1108
 
1103
1109
  if vc_dev
@@ -1975,7 +1981,7 @@ end
1975
1981
  end
1976
1982
 
1977
1983
  card_spec = {
1978
- :key => Time.now.utc.strftime('%Y%m%d%M%S%L').to_i,
1984
+ :key => 0,
1979
1985
  :deviceInfo => {
1980
1986
  :label => 'net' + card_num.to_s,
1981
1987
  :summary => pg_name
@@ -1985,6 +1991,9 @@ end
1985
1991
  :macAddress => mac,
1986
1992
  :unitNumber => unumber
1987
1993
  }
1994
+ if @vi_client.vim.serviceContent.about.apiVersion.to_f >= 7.0
1995
+ card_spec[:key] = Time.now.utc.strftime('%m%d%M%S%L').to_i
1996
+ end
1988
1997
 
1989
1998
  if (limit || rsrv) && (limit > 0)
1990
1999
  ra_spec = {}
@@ -2121,7 +2130,7 @@ end
2121
2130
  end
2122
2131
 
2123
2132
  card_spec = {
2124
- :key => Time.now.utc.strftime('%Y%m%d%M%S%L').to_i,
2133
+ :key => 0,
2125
2134
  :deviceInfo => {
2126
2135
  :label => 'net' + card_num.to_s,
2127
2136
  :summary => pg_name
@@ -2129,6 +2138,9 @@ end
2129
2138
  :backing => backing,
2130
2139
  :addressType => 'generated'
2131
2140
  }
2141
+ if @vi_client.vim.serviceContent.about.apiVersion.to_f >= 7.0
2142
+ card_spec[:key] = Time.now.utc.strftime('%m%d%M%S%L').to_i
2143
+ end
2132
2144
 
2133
2145
  if (limit || rsrv) && (limit > 0)
2134
2146
  ra_spec = {}
@@ -2419,7 +2431,7 @@ end
2419
2431
  # automatically cleans all system snapshots
2420
2432
  # https://github.com/OpenNebula/one/issues/5409
2421
2433
  if snapshots? || one_snapshots?
2422
- error_msg = 'Existing system snapshots, cannot change disks. '
2434
+ error_msg = 'Existing sytem snapshots, cannot change disks. '
2423
2435
  error_msg << 'Please remove all snapshots and try again.'
2424
2436
  raise error_message
2425
2437
  end
@@ -2606,9 +2618,8 @@ end
2606
2618
  return unless disk.exists?
2607
2619
 
2608
2620
  if snapshots? || one_snapshots?
2609
- error_message = 'Existing system snapshots, cannot change '
2610
- error_message << 'disks . Please remove all snapshots and '
2611
- error_message << 'try again.'
2621
+ error_message = 'Existing sytem snapshots, cannot change disks'
2622
+ error_message << '. Please remove all snapshots and try again.'
2612
2623
  raise error_message
2613
2624
  end
2614
2625
 
data/lib/vm_template.rb CHANGED
@@ -40,7 +40,7 @@ module VCenterDriver
40
40
  def lock
41
41
  return unless @locking
42
42
 
43
- @locking_file = File.open('/tmp/vcenter-importer-lock', 'w')
43
+ @locking_file = File.open('/var/tmp/vcenter-importer-lock', 'w')
44
44
  @locking_file.flock(File::LOCK_EX)
45
45
  end
46
46
 
@@ -50,9 +50,9 @@ module VCenterDriver
50
50
 
51
51
  @locking_file.close
52
52
 
53
- return unless File.exist?('/tmp/vcenter-importer-lock')
53
+ return unless File.exist?('/var/tmp/vcenter-importer-lock')
54
54
 
55
- File.delete('/tmp/vcenter-importer-lock')
55
+ File.delete('/var/tmp/vcenter-importer-lock')
56
56
  end
57
57
 
58
58
  def vm?
@@ -96,6 +96,90 @@ module VCenterDriver
96
96
  @vi_client.vim.serviceContent.about.instanceUuid rescue nil
97
97
  end
98
98
 
99
+ def save_as_linked_clones(name)
100
+ error = nil
101
+
102
+ disks = @item.config.hardware.device.grep(
103
+ RbVmomi::VIM::VirtualMachine
104
+ )
105
+ disks.select {|x| x.backing.parent.nil? }.each do |disk|
106
+ spec = {
107
+ :deviceChange => [
108
+ {
109
+ :operation => :remove,
110
+ :device => disk
111
+ },
112
+ {
113
+ :operation => :add,
114
+ :fileOperation => :create,
115
+ :device => disk.dup.tap do |x|
116
+ x.backing = x.backing.dup
117
+ x.backing.fileName =
118
+ "[#{disk.backing.datastore.name}]"
119
+ x.backing.parent = disk.backing
120
+ end
121
+ }
122
+ ]
123
+ }
124
+ @item.ReconfigVM_Task(
125
+ :spec => spec
126
+ ).wait_for_completion
127
+ end
128
+
129
+ relocateSpec = RbVmomi::VIM.VirtualMachineRelocateSpec(
130
+ :diskMoveType => :moveChildMostDiskBacking
131
+ )
132
+
133
+ spec = RbVmomi::VIM.VirtualMachineCloneSpec(
134
+ :location => relocateSpec,
135
+ :powerOn => false,
136
+ :template => true
137
+ )
138
+
139
+ new_template = @item.CloneVM_Task(
140
+ :folder => @item.parent,
141
+ :name => name,
142
+ :spec => spec
143
+ ).wait_for_completion
144
+
145
+ new_vm_template_ref = new_template._ref
146
+
147
+ one_client = OpenNebula::Client.new
148
+ importer = VCenterDriver::VmImporter.new(
149
+ one_client,
150
+ @vi_client
151
+ )
152
+
153
+ importer.retrieve_resources({})
154
+ importer.get_indexes(new_vm_template_ref)
155
+
156
+ importer.process_import(
157
+ new_vm_template_ref,
158
+ {
159
+ new_vm_template_ref.to_s => {
160
+ :type => 'default',
161
+ :linked_clone => '1',
162
+ :copy => '0',
163
+ :name => '',
164
+ :folder => ''
165
+ }
166
+ }
167
+ )
168
+
169
+ begin
170
+ importer.output[:success][0][:id][0]
171
+ rescue StandardError => e
172
+ error = 'Creating linked clone VM Template' \
173
+ " failed due to \"#{e.message}\".\n"
174
+
175
+ if VCenterDriver::CONFIG[:debug_information]
176
+ error += " #{e.backtrace}\n"
177
+ end
178
+ end
179
+
180
+ [error, new_vm_template_ref]
181
+ end
182
+
99
183
  def create_template_copy(template_name)
100
184
  error = nil
101
185
  template_ref = nil
@@ -733,6 +817,9 @@ module VCenterDriver
733
817
  nic, true)
734
818
  network_found.info
735
819
 
820
+ if nic[:mac]
821
+ nic_tmp << "MAC_IMPORTED=\"#{nic[:mac]}\",\n"
822
+ end
736
823
  # This is the existing nic info
737
824
  if nic[:mac] && ipv4.empty? && ipv6.empty?
738
825
  nic_tmp << "MAC=\"#{nic[:mac]}\",\n"
@@ -1832,12 +1919,10 @@ module VCenterDriver
1832
1919
  # the template if something go wrong
1833
1920
  if copy
1834
1921
  error, template_copy_ref =
1835
- selected[:template]
1836
- .create_template_copy(
1837
- opts[:name]
1838
- )
1922
+ selected[:template].save_as_linked_clones(opts[:name])
1923
+
1839
1924
  unless template_copy_ref
1840
- raise 'There is a problem creating creating' \
1925
+ raise 'There is a problem creating ' \
1841
1926
  "your copy: #{error}"
1842
1927
  end
1843
1928
 
@@ -1890,68 +1975,70 @@ module VCenterDriver
1890
1975
  working_template[:one] <<
1891
1976
  "VCENTER_TEMPLATE_NAME=\"#{selected[:name]}\"\n"
1892
1977
 
1893
- create(working_template[:one]) do |one_object, id|
1894
- res[:id] << id
1978
+ unless copy
1979
+ create(working_template[:one]) do |one_object, id|
1980
+ res[:id] << id
1895
1981
 
1896
- type = { :object => 'template', :id => id }
1897
- error, template_disks, allocated_images =
1898
- template
1899
- .import_vcenter_disks(
1900
- vc_uuid,
1901
- dpool,
1902
- ipool,
1903
- type
1904
- )
1982
+ type = { :object => 'template', :id => id }
1983
+ error, template_disks, allocated_images =
1984
+ template
1985
+ .import_vcenter_disks(
1986
+ vc_uuid,
1987
+ dpool,
1988
+ ipool,
1989
+ type
1990
+ )
1905
1991
 
1906
- if allocated_images
1907
- # rollback stack
1908
- allocated_images.reverse.each do |i|
1909
- @rollback.unshift(Raction.new(i, :delete))
1992
+ if allocated_images
1993
+ # rollback stack
1994
+ allocated_images.reverse.each do |i|
1995
+ @rollback.unshift(Raction.new(i, :delete))
1996
+ end
1910
1997
  end
1911
- end
1912
- raise error unless error.empty?
1998
+ raise error unless error.empty?
1913
1999
 
1914
- working_template[:one] << template_disks
2000
+ working_template[:one] << template_disks
1915
2001
 
1916
- if template_copy_ref
1917
- template_moref = template_copy_ref
1918
- else
1919
- template_moref = selected[:vcenter_ref]
1920
- end
2002
+ if template_copy_ref
2003
+ template_moref = template_copy_ref
2004
+ else
2005
+ template_moref = selected[:vcenter_ref]
2006
+ end
1921
2007
 
1922
- opts_nics = {
1923
- :vi_client => @vi_client,
1924
- :vc_uuid => vc_uuid,
1925
- :npool => npool,
1926
- :hpool => hpool,
1927
- :vcenter => vcenter,
1928
- :template_moref => template_moref,
1929
- :vm_object => nil
1930
- }
2008
+ opts_nics = {
2009
+ :vi_client => @vi_client,
2010
+ :vc_uuid => vc_uuid,
2011
+ :npool => npool,
2012
+ :hpool => hpool,
2013
+ :vcenter => vcenter,
2014
+ :template_moref => template_moref,
2015
+ :vm_object => nil
2016
+ }
1931
2017
 
1932
- error, template_nics, _ar_ids, allocated_nets =
1933
- template
1934
- .import_vcenter_nics(
1935
- opts_nics,
1936
- id,
1937
- dc
1938
- )
2018
+ error, template_nics, _ar_ids, allocated_nets =
2019
+ template
2020
+ .import_vcenter_nics(
2021
+ opts_nics,
2022
+ id,
2023
+ dc
2024
+ )
1939
2025
 
1940
- if allocated_nets
1941
- # rollback stack
1942
- allocated_nets.reverse.each do |n|
1943
- @rollback.unshift(Raction.new(n, :delete))
2026
+ if allocated_nets
2027
+ # rollback stack
2028
+ allocated_nets.reverse.each do |n|
2029
+ @rollback.unshift(Raction.new(n, :delete))
2030
+ end
1944
2031
  end
1945
- end
1946
- raise error unless error.empty?
2032
+ raise error unless error.empty?
1947
2033
 
1948
- working_template[:one] << template_nics
1949
- working_template[:one] << rp_opts(
1950
- opts[:type],
1951
- opts[:resourcepool]
1952
- )
2034
+ working_template[:one] << template_nics
2035
+ working_template[:one] << rp_opts(
2036
+ opts[:type],
2037
+ opts[:resourcepool]
2038
+ )
1953
2039
 
1954
- one_object.update(working_template[:one])
2040
+ one_object.update(working_template[:one])
2041
+ end
1955
2042
  end
1956
2043
 
1957
2044
  res