opennebula 5.13.90.pre → 6.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f9a8c00c023d39dac1d3d0c866851beca57f8b4a
4
- data.tar.gz: e44c5056a014e41ba5f2f5f928d36d3bdfcafd15
3
+ metadata.gz: c860bdde4c2e7184d75f0433181a5aa485d39296
4
+ data.tar.gz: 7b773535ac63930fb85252435814b4f4e81adcf0
5
5
  SHA512:
6
- metadata.gz: 1efacac3e2a1dc06134672c69f3d563a89d2cdbbb810bd8289c0d7f5e7e7dbd7de1a247fe5976f36d9df796355160b0d1de3f9fb8013c0fe4c3e30116212ab96
7
- data.tar.gz: 08304bf5ee0386bbef56d81e6a65668010452130b259ced25a75fdc5693109d7fa667248cb3cec5157636d1c965425fb44dfa043bdadcf821f4f6d3d2f9d1fdb
6
+ metadata.gz: 0b23945ca645beba28c3e898a13ef254b4a78ecdc63dec03922c808914233d550a3503efef499a521d2aa6fbfaeff795789976105ccb93eb80614ef3686662e1
7
+ data.tar.gz: 3337709c1791f07680d40dcb8c4a012139e93af38546fc200dacb07fea81b3890405a80f48a596f72465c4bb08e28f02b6c729801e8c414ba55559d1b2f7a097
@@ -51,7 +51,7 @@ end
51
51
  module CloudClient
52
52
 
53
53
  # OpenNebula version
54
- VERSION = '5.13.90'
54
+ VERSION = '6.0.2'
55
55
 
56
56
  # #########################################################################
57
57
  # Default location for the authentication file
data/lib/datacenter.rb CHANGED
@@ -500,7 +500,7 @@ module VCenterDriver
500
500
  end
501
501
 
502
502
  # Determine if a network must be excluded from the list
503
- def exclude_network?(vc_network, one_host, args, vc_network_hash)
503
+ def exclude_network?(one_host, args, vc_network_hash, network_type)
504
504
  vc_network_name = vc_network_hash[:vc_network_name]
505
505
  vc_network_host = vc_network_hash[:vc_network_host]
506
506
  vc_network_tag = vc_network_hash[:vc_network_tag]
@@ -514,12 +514,6 @@ module VCenterDriver
514
514
  ]
515
515
 
516
516
  # Only NSX-V and NSX-T can be excluded
517
- network_type = VCenterDriver::Network
518
- .get_network_type(
519
- vc_network,
520
- vc_network_name
521
- )
522
-
523
517
  return true if network_types.include? network_type
524
518
  end
525
519
  # Exclude networks without hosts
@@ -533,7 +527,7 @@ module VCenterDriver
533
527
  return true
534
528
  end
535
529
  # Exclude portgroup used for VXLAN communication in NSX
536
- if vc_network['name'].match(/^vxw-vmknicPg-dvs-(.*)/)
530
+ if vc_network_name.match(/^vxw-vmknicPg-dvs-(.*)/)
537
531
  return true
538
532
  end
539
533
 
@@ -543,7 +537,7 @@ module VCenterDriver
543
537
  end
544
538
 
545
539
  # Proccess each network
546
- def process_network(params)
540
+ def process_network(params, networks_type, hosts_list, host_list_object)
547
541
  vc_network = params[:vc_network]
548
542
  vcenter_instance_name = params[:vcenter_instance_name]
549
543
  vcenter_uuid = params[:vcenter_uuid]
@@ -576,26 +570,32 @@ module VCenterDriver
576
570
  # Initialize opts hash used to inject data into one template
577
571
  opts = {}
578
572
 
579
- # if full_process
580
573
  # Add network type to network hash
581
- network_type = \
582
- VCenterDriver::Network.get_network_type(
583
- vc_network,
584
- vc_network_name
585
- )
574
+ if networks_type.key?(vc_network_hash[:vc_network_ref])
575
+ network_type = networks_type[vc_network_hash[:vc_network_ref]]
576
+ else
577
+ network_type =
578
+ VCenterDriver::Network.get_network_type(
579
+ vc_network,
580
+ vc_network_name
581
+ )
582
+ networks_type[vc_network_hash[:vc_network_ref]] = network_type
583
+ end
584
+
586
585
  network[vc_network_ref][:network_type] = network_type
587
586
  network[vc_network_ref][:type] = network_type
588
- # end
589
587
 
590
588
  # Determine if the network must be excluded
591
589
  network[vc_network_ref][:excluded] = exclude_network?(
592
- vc_network,
593
590
  one_host,
594
591
  args,
595
- vc_network_hash
592
+ vc_network_hash,
593
+ network_type
596
594
  )
597
595
 
598
- return if network[vc_network_ref][:excluded] == true
596
+ if network[vc_network_ref][:excluded] == true
597
+ return [nil, networks_type, hosts_list, host_list_object]
598
+ end
599
599
 
600
600
  if full_process
601
601
  case network[vc_network_ref][:network_type]
@@ -653,31 +653,50 @@ module VCenterDriver
653
653
  vc_hosts = vc_network.host
654
654
  vc_hosts.each do |vc_host|
655
655
  # Get vCenter Cluster
656
- vc_cluster = vc_host.parent
657
- vc_cluster_ref = vc_cluster._ref
658
- vc_cluster_name = vc_cluster.name
659
- # Get one host from each vCenter cluster
660
- one_host = VCenterDriver::VIHelper
661
- .find_by_ref(OpenNebula::HostPool,
662
- 'TEMPLATE/VCENTER_CCR_REF',
663
- vc_cluster_ref,
664
- vcenter_uuid)
656
+ vc_host_ref = vc_host._ref
657
+ if !host_list_object.key?(vc_host_ref)
658
+ vc_cluster = vc_host.parent
659
+ vc_cluster_ref = vc_cluster._ref
660
+ vc_cluster_name = vc_cluster.name
661
+ host_list_object[vc_host_ref] = {
662
+ :vc_cluster_ref => vc_cluster_ref,
663
+ :vc_cluster_name => vc_cluster_name
664
+ }
665
+ end
666
+
667
+ vc_cluster = host_list_object[vc_host_ref]
668
+
669
+ if hosts_list.key? vc_cluster[:vc_cluster_ref]
670
+ one_host = hosts_list[vc_cluster[:vc_cluster_ref]]
671
+ else
672
+ one_host = VCenterDriver::VIHelper
673
+ .find_by_ref(OpenNebula::HostPool,
674
+ 'TEMPLATE/VCENTER_CCR_REF',
675
+ vc_cluster[:vc_cluster_ref],
676
+ vcenter_uuid)
677
+ hosts_list[vc_cluster[:vc_cluster_ref]] = one_host
678
+ end
665
679
  # Check if network is excluded from each host
666
680
  next if exclude_network?(
667
- vc_network,
668
681
  one_host,
669
682
  args,
670
- vc_network_hash
683
+ vc_network_hash,
684
+ network_type
671
685
  )
672
686
 
673
687
  # Insert vCenter cluster ref
674
- network[vc_network_ref][:clusters][:refs] << vc_cluster_ref
688
+ network[vc_network_ref][:clusters][:refs] <<
689
+ vc_cluster[:vc_cluster_ref]
690
+
675
691
  # Insert OpenNebula cluster id
676
692
  cluster_id = one_cluster_id(one_host)
677
- network[vc_network_ref][:clusters][:one_ids] << cluster_id
693
+ network[vc_network_ref][:clusters][:one_ids] <<
694
+ cluster_id
695
+
678
696
  # Insert vCenter cluster name
679
- network[vc_network_ref][:clusters][:names] << vc_cluster_name
680
- opts[:dc_name] = vc_cluster_name
697
+ network[vc_network_ref][:clusters][:names] <<
698
+ vc_cluster[:vc_cluster_name]
699
+ opts[:dc_name] = vc_cluster[:vc_cluster_name]
681
700
  end
682
701
 
683
702
  # Remove duplicate entries
@@ -708,7 +727,7 @@ module VCenterDriver
708
727
  network[vc_network_ref]['name']
709
728
  end
710
729
 
711
- network
730
+ [network, networks_type, hosts_list, host_list_object]
712
731
  end
713
732
 
714
733
  # rubocop:disable Style/GlobalVars
@@ -725,13 +744,15 @@ module VCenterDriver
725
744
  $conf[:one_xmlrpc]
726
745
  )
727
746
  end
728
-
729
747
  one_host = OpenNebula::Host.new_with_id(args[:host], one_client)
730
748
  rc = one_host.info
731
749
  raise rc.message if OpenNebula.is_error? rc
732
750
 
733
751
  # Get all networks in vcenter cluster (one_host)
734
752
  vc_cluster_networks = cluster_networks(one_host)
753
+ networks_type = {}
754
+ hosts_list = {}
755
+ host_list_object = {}
735
756
 
736
757
  # Iterate over vcenter networks
737
758
  vc_cluster_networks.each do |vc_cluster_network|
@@ -753,7 +774,20 @@ module VCenterDriver
753
774
  params[:one_host]= one_host
754
775
  params[:args] = args
755
776
 
756
- network = process_network(params)
777
+ network,
778
+ networks_type_new,
779
+ hosts_list_new,
780
+ host_list_object_new =
781
+ process_network(
782
+ params,
783
+ networks_type,
784
+ hosts_list,
785
+ host_list_object
786
+ )
787
+
788
+ networks_type = networks_type_new
789
+ hosts_list = hosts_list_new
790
+ host_list_object = host_list_object_new
757
791
 
758
792
  networks.merge!(network) unless network.nil?
759
793
  end
@@ -29,14 +29,27 @@ module NSXDriver
29
29
  unless defined?(GEMS_LOCATION)
30
30
  end
31
31
 
32
- if File.directory?(GEMS_LOCATION)
33
- real_gems_path = File.realpath(GEMS_LOCATION)
34
- if !defined?(Gem) || Gem.path != [real_gems_path]
35
- $LOAD_PATH.reject! {|l| l =~ /vendor_ruby/ }
32
+ # rubocop: disable all
33
+ # %%RUBYGEMS_SETUP_BEGIN%%
34
+ if File.directory?(GEMS_LOCATION)
35
+ real_gems_path = File.realpath(GEMS_LOCATION)
36
+ if !defined?(Gem) || Gem.path != [real_gems_path]
37
+ $LOAD_PATH.reject! {|l| l =~ /vendor_ruby/ }
38
+
39
+ # Suppress warnings from Rubygems
40
+ # https://github.com/OpenNebula/one/issues/5379
41
+ begin
42
+ verb = $VERBOSE
43
+ $VERBOSE = nil
36
44
  require 'rubygems'
37
45
  Gem.use_paths(real_gems_path)
46
+ ensure
47
+ $VERBOSE = verb
38
48
  end
39
49
  end
50
+ end
51
+ # %%RUBYGEMS_SETUP_END%%
52
+ # rubocop: enable all
40
53
 
41
54
  $LOAD_PATH << RUBY_LIB_LOCATION
42
55
 
data/lib/network.rb CHANGED
@@ -486,7 +486,7 @@ module VCenterDriver
486
486
  @defaults = { :size => '255', :type => 'ether' }
487
487
  end
488
488
 
489
- def process_import(indexes, opts = {}, &block)
489
+ def process_import(indexes, opts = {}, &_block)
490
490
  indexes = indexes.gsub(/\s*\,\s*/, ',').strip.split(',')
491
491
 
492
492
  dc_folder = VCenterDriver::DatacenterFolder.new(@vi_client)
@@ -526,30 +526,27 @@ module VCenterDriver
526
526
  "#{hpool.message}"
527
527
  end
528
528
 
529
- opts = {}
530
-
531
529
  params = {}
532
530
  params[:vc_network] = vc_cluster_network
533
531
  params[:vcenter_instance_name] = vcenter_instance_name
534
532
  params[:vcenter_uuid] = vcenter_uuid
535
533
  params[:_hpool] = hpool
536
534
  params[:one_host] = one_host
537
- params[:args] = opts
535
+ params[:args] = {}
538
536
 
539
- selected = dc_folder.process_network(params)
537
+ selected, _networks_type, _hosts_list, _clusters_list =
538
+ dc_folder.process_network(
539
+ params,
540
+ {},
541
+ {},
542
+ {}
543
+ )
540
544
 
541
545
  selected = selected[index]
542
546
 
543
- if block_given?
544
- @info[index][:opts] = block.call(selected)
545
- elsif opts[index]
546
- @info[index][:opts] = opts[index]
547
- else
548
- @info[index][:opts] = defaults
549
- end
550
-
551
547
  # import the object
552
- @info[:success] << import(selected)
548
+ opts[index] ||= @defaults
549
+ @info[:success] << import(selected, opts[index])
553
550
  rescue StandardError => e
554
551
  @info[:error] << { index => e.message }
555
552
  @info[index][:e] = e
@@ -645,8 +642,8 @@ module VCenterDriver
645
642
  str
646
643
  end
647
644
 
648
- def import(selected)
649
- opts = @info[selected[:ref]][:opts]
645
+ def import(selected, opts = nil)
646
+ opts = @info[selected[:ref]][:opts] if opts.nil?
650
647
 
651
648
  net = VCenterDriver::Network
652
649
  .new_from_ref(selected[:ref], @vi_client)
data/lib/nsx_client.rb CHANGED
@@ -29,14 +29,27 @@ module NSXDriver
29
29
  unless defined?(GEMS_LOCATION)
30
30
  end
31
31
 
32
- if File.directory?(GEMS_LOCATION)
33
- real_gems_path = File.realpath(GEMS_LOCATION)
34
- if !defined?(Gem) || Gem.path != [real_gems_path]
35
- $LOAD_PATH.reject! {|l| l =~ /vendor_ruby/ }
32
+ # rubocop: disable all
33
+ # %%RUBYGEMS_SETUP_BEGIN%%
34
+ if File.directory?(GEMS_LOCATION)
35
+ real_gems_path = File.realpath(GEMS_LOCATION)
36
+ if !defined?(Gem) || Gem.path != [real_gems_path]
37
+ $LOAD_PATH.reject! {|l| l =~ /vendor_ruby/ }
38
+
39
+ # Suppress warnings from Rubygems
40
+ # https://github.com/OpenNebula/one/issues/5379
41
+ begin
42
+ verb = $VERBOSE
43
+ $VERBOSE = nil
36
44
  require 'rubygems'
37
45
  Gem.use_paths(real_gems_path)
46
+ ensure
47
+ $VERBOSE = verb
38
48
  end
39
49
  end
50
+ end
51
+ # %%RUBYGEMS_SETUP_END%%
52
+ # rubocop: enable all
40
53
 
41
54
  $LOAD_PATH << RUBY_LIB_LOCATION
42
55
 
data/lib/nsx_constants.rb CHANGED
@@ -6,7 +6,7 @@
6
6
  # a copy of the License at #
7
7
  # #
8
8
  # http://www.apache.org/licenses/LICENSE-2.0 #
9
- # #
9
+ # #
10
10
  # Unless required by applicable law or agreed to in writing, software #
11
11
  # distributed under the License is distributed on an "AS IS" BASIS, #
12
12
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
@@ -29,14 +29,27 @@ module NSXDriver
29
29
  unless defined?(GEMS_LOCATION)
30
30
  end
31
31
 
32
- if File.directory?(GEMS_LOCATION)
33
- real_gems_path = File.realpath(GEMS_LOCATION)
34
- if !defined?(Gem) || Gem.path != [real_gems_path]
35
- $LOAD_PATH.reject! {|l| l =~ /vendor_ruby/ }
32
+ # rubocop: disable all
33
+ # %%RUBYGEMS_SETUP_BEGIN%%
34
+ if File.directory?(GEMS_LOCATION)
35
+ real_gems_path = File.realpath(GEMS_LOCATION)
36
+ if !defined?(Gem) || Gem.path != [real_gems_path]
37
+ $LOAD_PATH.reject! {|l| l =~ /vendor_ruby/ }
38
+
39
+ # Suppress warnings from Rubygems
40
+ # https://github.com/OpenNebula/one/issues/5379
41
+ begin
42
+ verb = $VERBOSE
43
+ $VERBOSE = nil
36
44
  require 'rubygems'
37
45
  Gem.use_paths(real_gems_path)
46
+ ensure
47
+ $VERBOSE = verb
38
48
  end
39
49
  end
50
+ end
51
+ # %%RUBYGEMS_SETUP_END%%
52
+ # rubocop: enable all
40
53
 
41
54
  $LOAD_PATH << RUBY_LIB_LOCATION
42
55
 
data/lib/nsx_driver.rb CHANGED
@@ -36,14 +36,27 @@ end
36
36
 
37
37
  ENV['LANG'] = 'C'
38
38
 
39
+ # rubocop: disable all
40
+ # %%RUBYGEMS_SETUP_BEGIN%%
39
41
  if File.directory?(GEMS_LOCATION)
40
42
  real_gems_path = File.realpath(GEMS_LOCATION)
41
43
  if !defined?(Gem) || Gem.path != [real_gems_path]
42
44
  $LOAD_PATH.reject! {|l| l =~ /vendor_ruby/ }
43
- require 'rubygems'
44
- Gem.use_paths(real_gems_path)
45
+
46
+ # Suppress warnings from Rubygems
47
+ # https://github.com/OpenNebula/one/issues/5379
48
+ begin
49
+ verb = $VERBOSE
50
+ $VERBOSE = nil
51
+ require 'rubygems'
52
+ Gem.use_paths(real_gems_path)
53
+ ensure
54
+ $VERBOSE = verb
55
+ end
45
56
  end
46
57
  end
58
+ # %%RUBYGEMS_SETUP_END%%
59
+ # rubocop: enable all
47
60
 
48
61
  $LOAD_PATH << LIB_LOCATION + '/ruby'
49
62
  $LOAD_PATH << LIB_LOCATION + '/ruby/nsx_driver'
data/lib/nsx_rule.rb CHANGED
@@ -33,14 +33,27 @@ module NSXDriver
33
33
  unless defined?(GEMS_LOCATION)
34
34
  end
35
35
 
36
- if File.directory?(GEMS_LOCATION)
37
- real_gems_path = File.realpath(GEMS_LOCATION)
38
- if !defined?(Gem) || Gem.path != [real_gems_path]
39
- $LOAD_PATH.reject! {|l| l =~ /vendor_ruby/ }
36
+ # rubocop: disable all
37
+ # %%RUBYGEMS_SETUP_BEGIN%%
38
+ if File.directory?(GEMS_LOCATION)
39
+ real_gems_path = File.realpath(GEMS_LOCATION)
40
+ if !defined?(Gem) || Gem.path != [real_gems_path]
41
+ $LOAD_PATH.reject! {|l| l =~ /vendor_ruby/ }
42
+
43
+ # Suppress warnings from Rubygems
44
+ # https://github.com/OpenNebula/one/issues/5379
45
+ begin
46
+ verb = $VERBOSE
47
+ $VERBOSE = nil
40
48
  require 'rubygems'
41
49
  Gem.use_paths(real_gems_path)
50
+ ensure
51
+ $VERBOSE = verb
42
52
  end
43
53
  end
54
+ end
55
+ # %%RUBYGEMS_SETUP_END%%
56
+ # rubocop: enable all
44
57
 
45
58
  $LOAD_PATH << RUBY_LIB_LOCATION
46
59
 
data/lib/nsxt_client.rb CHANGED
@@ -29,14 +29,27 @@ module NSXDriver
29
29
  unless defined?(GEMS_LOCATION)
30
30
  end
31
31
 
32
- if File.directory?(GEMS_LOCATION)
33
- real_gems_path = File.realpath(GEMS_LOCATION)
34
- if !defined?(Gem) || Gem.path != [real_gems_path]
35
- $LOAD_PATH.reject! {|l| l =~ /vendor_ruby/ }
32
+ # rubocop: disable all
33
+ # %%RUBYGEMS_SETUP_BEGIN%%
34
+ if File.directory?(GEMS_LOCATION)
35
+ real_gems_path = File.realpath(GEMS_LOCATION)
36
+ if !defined?(Gem) || Gem.path != [real_gems_path]
37
+ $LOAD_PATH.reject! {|l| l =~ /vendor_ruby/ }
38
+
39
+ # Suppress warnings from Rubygems
40
+ # https://github.com/OpenNebula/one/issues/5379
41
+ begin
42
+ verb = $VERBOSE
43
+ $VERBOSE = nil
36
44
  require 'rubygems'
37
45
  Gem.use_paths(real_gems_path)
46
+ ensure
47
+ $VERBOSE = verb
38
48
  end
39
49
  end
50
+ end
51
+ # %%RUBYGEMS_SETUP_END%%
52
+ # rubocop: enable all
40
53
 
41
54
  $LOAD_PATH << RUBY_LIB_LOCATION
42
55
 
data/lib/nsxv_client.rb CHANGED
@@ -29,14 +29,27 @@ module NSXDriver
29
29
  unless defined?(GEMS_LOCATION)
30
30
  end
31
31
 
32
- if File.directory?(GEMS_LOCATION)
33
- real_gems_path = File.realpath(GEMS_LOCATION)
34
- if !defined?(Gem) || Gem.path != [real_gems_path]
35
- $LOAD_PATH.reject! {|l| l =~ /vendor_ruby/ }
32
+ # rubocop: disable all
33
+ # %%RUBYGEMS_SETUP_BEGIN%%
34
+ if File.directory?(GEMS_LOCATION)
35
+ real_gems_path = File.realpath(GEMS_LOCATION)
36
+ if !defined?(Gem) || Gem.path != [real_gems_path]
37
+ $LOAD_PATH.reject! {|l| l =~ /vendor_ruby/ }
38
+
39
+ # Suppress warnings from Rubygems
40
+ # https://github.com/OpenNebula/one/issues/5379
41
+ begin
42
+ verb = $VERBOSE
43
+ $VERBOSE = nil
36
44
  require 'rubygems'
37
45
  Gem.use_paths(real_gems_path)
46
+ ensure
47
+ $VERBOSE = verb
38
48
  end
39
49
  end
50
+ end
51
+ # %%RUBYGEMS_SETUP_END%%
52
+ # rubocop: enable all
40
53
 
41
54
  $LOAD_PATH << RUBY_LIB_LOCATION
42
55
 
data/lib/opennebula.rb CHANGED
@@ -77,5 +77,5 @@ require 'opennebula/flow'
77
77
  module OpenNebula
78
78
 
79
79
  # OpenNebula version
80
- VERSION = '5.13.90'
80
+ VERSION = '6.0.2'
81
81
  end
@@ -357,7 +357,15 @@ module OpenNebula
357
357
 
358
358
  break rc if OpenNebula.is_error?(rc)
359
359
 
360
- rc = template.clone("#{template.name}-#{name}", recursive)
360
+ # The maximum size is 128, so crop the template name if it
361
+ # exceeds the limit
362
+ new_name = "#{template.name}-#{name}"
363
+
364
+ if new_name.size > 119
365
+ new_name = "#{template.name[0..(119 - name.size)]}-#{name}"
366
+ end
367
+
368
+ rc = template.clone(new_name, recursive)
361
369
 
362
370
  break rc if OpenNebula.is_error?(rc)
363
371
 
@@ -384,6 +392,9 @@ module OpenNebula
384
392
  return rc
385
393
  end
386
394
 
395
+ # add registration time, as the template is new
396
+ body['registration_time'] = Integer(Time.now)
397
+
387
398
  # update the template with the new body
388
399
  doc.update(body.to_json)
389
400
 
@@ -391,6 +402,31 @@ module OpenNebula
391
402
  new_id
392
403
  end
393
404
 
405
+ # Clones a service template
406
+ #
407
+ # @param name [Stirng] New name
408
+ #
409
+ # @return [Integer] New template ID
410
+ def clone(name)
411
+ new_id = super
412
+
413
+ doc = OpenNebula::ServiceTemplate.new_with_id(new_id, @client)
414
+ rc = doc.info
415
+
416
+ return rc if OpenNebula.is_error?(rc)
417
+
418
+ body = JSON.parse(doc["TEMPLATE/#{TEMPLATE_TAG}"])
419
+
420
+ # add registration time, as the template is new
421
+ body['registration_time'] = Integer(Time.now)
422
+
423
+ # update the template with the new body
424
+ DocumentJSON.instance_method(:update).bind(doc).call(body.to_json)
425
+
426
+ # return the new document ID
427
+ new_id
428
+ end
429
+
394
430
  # Replaces the raw template contents
395
431
  #
396
432
  # @param template [String] New template contents, in the form KEY = VAL
@@ -155,6 +155,10 @@ module OpenNebula::MarketPlaceAppExt
155
155
  is_vcenter = !OpenNebula.is_error?(rc) &&
156
156
  (ds['TEMPLATE/DRIVER'] == 'vcenter')
157
157
 
158
+ if is_vcenter && options[:template].nil?
159
+ options = update_options_with_template(options)
160
+ end
161
+
158
162
  #---------------------------------------------------------------
159
163
  # Allocate the image in OpenNebula
160
164
  #---------------------------------------------------------------
@@ -181,15 +185,17 @@ module OpenNebula::MarketPlaceAppExt
181
185
  #---------------------------------------------------------------
182
186
  # Created an associated VMTemplate if needed
183
187
  #---------------------------------------------------------------
184
- if self['TEMPLATE/VMTEMPLATE64'].nil? || options[:notemplate]
188
+ if (self['TEMPLATE/VMTEMPLATE64'].nil? && !is_vcenter) ||
189
+ options[:notemplate] ||
190
+ options[:template] == -1
185
191
  return rc_info
186
192
  end
187
193
 
188
194
  if !options[:template].nil?
189
195
  template_id = options[:template]
190
196
 
191
- if template_id == -1
192
- template_id = options[:default_template]
197
+ if template_id < 0
198
+ raise 'Invalid option, template_id must be a valid ID'
193
199
  end
194
200
 
195
201
  template = Template.new_with_id(template_id, @client)
@@ -280,6 +286,33 @@ module OpenNebula::MarketPlaceAppExt
280
286
  rc
281
287
  end
282
288
 
289
+ def update_options_with_template(options, _validate = false)
290
+ vcenterrc_path =
291
+ "#{VAR_LOCATION}/remotes/etc/vmm/vcenter/vcenterrc"
292
+
293
+ if File.file?(vcenterrc_path)
294
+ config_vcenter = YAML.load_file(vcenterrc_path)
295
+
296
+ if config_vcenter.key?(:default_template)
297
+ options[:template] =
298
+ config_vcenter[:default_template]
299
+
300
+ options
301
+ else
302
+ raise "Couldn't find default_template " \
303
+ 'configuration in vcenterrc conf ' \
304
+ 'file. Please use the --template ' \
305
+ 'file to define a VM Template ID if ' \
306
+ 'needed or add default_template to' \
307
+ ' vcenterrc conf file'
308
+ end
309
+ else
310
+ raise "Couldn't find vcenterrc conf file. " \
311
+ ' Please use the --template file to define' \
312
+ ' a VM Template ID if needed.'
313
+ end
314
+ end
315
+
283
316
  # Creates a VM template based on the APPTEMPLATE64 attribute
284
317
  # @param [Hash] options
285
318
  # :export_name [String] name of the vm template
@@ -288,19 +321,50 @@ module OpenNebula::MarketPlaceAppExt
288
321
  #
289
322
  # @return [Integer, OpenNebula::Error] template id or error
290
323
  def create_vm_template(options, disks)
291
- # --------------------------------------------------------------
292
- # Allocate Template
293
- # --------------------------------------------------------------
294
- if self['TEMPLATE/APPTEMPLATE64'].nil?
295
- return Error.new("Missing APPTEMPLATE64 for App #{id}")
296
- end
324
+ dsid = options[:dsid]
325
+ ds = OpenNebula::Datastore.new_with_id(dsid, @client)
326
+ rc = ds.info
297
327
 
298
- tmpl = Base64.decode64(self['TEMPLATE/APPTEMPLATE64'])
328
+ is_vcenter =
329
+ !OpenNebula.is_error?(rc) &&
330
+ (ds['TEMPLATE/DRIVER'] == 'vcenter')
331
+
332
+ if is_vcenter
333
+ if options[:template].nil?
334
+ options = update_options_with_template(options)
335
+ end
336
+
337
+ template_id = options[:template]
338
+
339
+ if template_id < 0
340
+ return
341
+ end
342
+
343
+ template = Template.new_with_id(template_id, @client)
344
+
345
+ vmtpl_id = template.clone(
346
+ options[:vmtemplate_name] || options[:name]
347
+ )
348
+
349
+ vmtpl = Template.new_with_id(vmtpl_id, @client)
350
+ rc = vmtpl.info
351
+ else
352
+ # ----------------------------------------------------------
353
+ # Allocate Template
354
+ # ----------------------------------------------------------
355
+ if self['TEMPLATE/APPTEMPLATE64'].nil?
356
+ return Error.new(
357
+ "Missing APPTEMPLATE64 for App #{id}"
358
+ )
359
+ end
360
+
361
+ tmpl = Base64.decode64(self['TEMPLATE/APPTEMPLATE64'])
299
362
 
300
- tmpl << "\nNAME=\"#{options[:name]}\"\n"
363
+ tmpl << "\nNAME=\"#{options[:name]}\"\n"
301
364
 
302
- vmtpl = Template.new(Template.build_xml, @client)
303
- rc = vmtpl.allocate(tmpl)
365
+ vmtpl = Template.new(Template.build_xml, @client)
366
+ rc = vmtpl.allocate(tmpl)
367
+ end
304
368
 
305
369
  return rc if OpenNebula.is_error?(rc)
306
370
 
@@ -267,17 +267,20 @@ module OpenNebula::VirtualMachineExt
267
267
  # --------------------------------------------------------------
268
268
  # Check backup consistency
269
269
  # --------------------------------------------------------------
270
- unless binfo
271
- rc = info
272
- raise rc.message if OpenNebula.is_error?(rc)
270
+ rc = info
273
271
 
274
- binfo = backup_info
272
+ raise rc.message if OpenNebula.is_error?(rc)
273
+
274
+ binfo.merge!(backup_info) do |key, old_val, new_val|
275
+ new_val.nil? ? old_val : new_val
275
276
  end
276
277
 
277
278
  raise 'No backup information' if binfo.nil?
278
279
 
279
280
  raise 'No frequency defined' unless valid?(binfo[:freq])
280
281
 
282
+ raise 'No marketplace defined' unless valid?(binfo[:market])
283
+
281
284
  return if Time.now.to_i - binfo[:last].to_i < binfo[:freq].to_i
282
285
 
283
286
  # --------------------------------------------------------------
@@ -319,19 +322,12 @@ module OpenNebula::VirtualMachineExt
319
322
  # --------------------------------------------------------------
320
323
  # Cleanup
321
324
  # --------------------------------------------------------------
322
- logger.info "Deleting template #{tmp.id}" if logger
323
-
324
- tmp.delete(true)
325
-
326
- binfo[:apps].each do |id|
327
- logger.info "Deleting applicance #{id}" if logger
328
-
329
- papp = OpenNebula::MarketPlaceApp.new_with_id(id, @client)
330
-
331
- papp.delete
332
- end if !keep && binfo[:apps]
325
+ backup_cleanup(keep, logger, binfo, tmp)
333
326
  rescue Error, StandardError => e
327
+ backup_cleanup(keep, logger, binfo, tmp)
328
+
334
329
  logger.fatal(e.inspect) if logger
330
+
335
331
  raise
336
332
  end
337
333
 
@@ -421,9 +417,9 @@ module OpenNebula::VirtualMachineExt
421
417
 
422
418
  private
423
419
 
424
- # --------------------------------------------------------------
420
+ #-------------------------------------------------------------------
425
421
  # Check an attribute is defined and valid
426
- # --------------------------------------------------------------
422
+ #-------------------------------------------------------------------
427
423
  def valid?(att)
428
424
  return false if att.nil?
429
425
 
@@ -454,6 +450,9 @@ module OpenNebula::VirtualMachineExt
454
450
  binfo
455
451
  end
456
452
 
453
+ #-------------------------------------------------------------------
454
+ # Generate backup information string
455
+ #-------------------------------------------------------------------
457
456
  def backup_attr(binfo, ids)
458
457
  'BACKUP=[' \
459
458
  " MARKETPLACE_APP_IDS = \"#{ids.join(',')}\"," \
@@ -462,6 +461,25 @@ module OpenNebula::VirtualMachineExt
462
461
  " MARKETPLACE_ID = \"#{binfo[:market]}\" ]"
463
462
  end
464
463
 
464
+ #-------------------------------------------------------------------
465
+ # Cleanup backup leftovers in case of failure
466
+ #-------------------------------------------------------------------
467
+ def backup_cleanup(keep, logger, binfo, template)
468
+ if template
469
+ logger.info "Deleting template #{template.id}" if logger
470
+
471
+ template.delete(true)
472
+ end
473
+
474
+ binfo[:apps].each do |id|
475
+ logger.info "Deleting applicance #{id}" if logger
476
+
477
+ papp = OpenNebula::MarketPlaceApp.new_with_id(id, @client)
478
+
479
+ papp.delete
480
+ end if !keep && binfo[:apps]
481
+ end
482
+
465
483
  end
466
484
  end
467
485
 
@@ -14,6 +14,8 @@
14
14
  # limitations under the License. #
15
15
  #--------------------------------------------------------------------------- #
16
16
 
17
+ require 'shellwords'
18
+
17
19
  module OpenNebula
18
20
 
19
21
  # Generic log function
@@ -76,6 +78,7 @@ module OpenNebula
76
78
  # If a second parameter is present it is used as the error message when
77
79
  # the command fails
78
80
  def self.exec_and_log(command, message=nil, allowed_return_code=0)
81
+ command = command.shellsplit.shelljoin # escape
79
82
  output=`#{command} 2>&1 1>/dev/null`
80
83
  code=$?.exitstatus
81
84
 
@@ -36,14 +36,25 @@ end
36
36
 
37
37
  ENV['LANG'] = 'C'
38
38
 
39
+ # %%RUBYGEMS_SETUP_BEGIN%%
39
40
  if File.directory?(GEMS_LOCATION)
40
41
  real_gems_path = File.realpath(GEMS_LOCATION)
41
42
  if !defined?(Gem) || Gem.path != [real_gems_path]
42
43
  $LOAD_PATH.reject! {|l| l =~ /vendor_ruby/ }
43
- require 'rubygems'
44
- Gem.use_paths(real_gems_path)
44
+
45
+ # Suppress warnings from Rubygems
46
+ # https://github.com/OpenNebula/one/issues/5379
47
+ begin
48
+ verb = $VERBOSE
49
+ $VERBOSE = nil
50
+ require 'rubygems'
51
+ Gem.use_paths(real_gems_path)
52
+ ensure
53
+ $VERBOSE = verb
54
+ end
45
55
  end
46
56
  end
57
+ # %%RUBYGEMS_SETUP_END%%
47
58
 
48
59
  $LOAD_PATH << LIB_LOCATION + '/ruby/vendors/rbvmomi/lib'
49
60
  $LOAD_PATH << LIB_LOCATION + '/ruby'
@@ -496,9 +496,9 @@ module VCenterDriver
496
496
  end
497
497
 
498
498
  #
499
- # Create and allocate a Opennebula Object.
499
+ # Create and allocate a OpenNebula Object.
500
500
  #
501
- # @param info [String] Info passed to opennebula Core.
501
+ # @param info [String] Info passed to OpenNebula Core.
502
502
  #
503
503
  # @return [&block] the allocated object through a block.
504
504
  #
data/lib/vi_helper.rb CHANGED
@@ -231,10 +231,11 @@ module VCenterDriver
231
231
  @ref_hash[attribute][refkey]
232
232
  end
233
233
 
234
+ require 'addressable'
234
235
  def self.find_image_by(att, the_class, path, ds_id, pool = nil)
235
236
  pool = one_pool(the_class, false) if pool.nil?
236
237
  pool.find do |e|
237
- e[att] == path &&
238
+ e[att] == Addressable::URI.escape(path) &&
238
239
  e['DATASTORE_ID'] == ds_id
239
240
  end
240
241
  end
@@ -33,14 +33,27 @@ module VCenterDriver
33
33
  end
34
34
  end
35
35
 
36
- if File.directory?(GEMS_LOCATION)
37
- real_gems_path = File.realpath(GEMS_LOCATION)
38
- if !defined?(Gem) || Gem.path != [real_gems_path]
39
- $LOAD_PATH.reject! {|l| l =~ /vendor_ruby/ }
36
+ # rubocop: disable all
37
+ # %%RUBYGEMS_SETUP_BEGIN%%
38
+ if File.directory?(GEMS_LOCATION)
39
+ real_gems_path = File.realpath(GEMS_LOCATION)
40
+ if !defined?(Gem) || Gem.path != [real_gems_path]
41
+ $LOAD_PATH.reject! {|l| l =~ /vendor_ruby/ }
42
+
43
+ # Suppress warnings from Rubygems
44
+ # https://github.com/OpenNebula/one/issues/5379
45
+ begin
46
+ verb = $VERBOSE
47
+ $VERBOSE = nil
40
48
  require 'rubygems'
41
49
  Gem.use_paths(real_gems_path)
50
+ ensure
51
+ $VERBOSE = verb
42
52
  end
43
53
  end
54
+ end
55
+ # %%RUBYGEMS_SETUP_END%%
56
+ # rubocop: enable all
44
57
 
45
58
  $LOAD_PATH << RUBY_LIB_LOCATION
46
59
 
@@ -1041,7 +1054,8 @@ module VCenterDriver
1041
1054
  else
1042
1055
  if snapshots?
1043
1056
  error = 'Disk metadata not present and snapshots exist. ' \
1044
- 'OpenNebula cannot manage this VM.'
1057
+ 'Please remove imported VM with "onevm recover ' \
1058
+ '--delete-db".'
1045
1059
  raise error
1046
1060
  end
1047
1061
 
@@ -2401,6 +2415,15 @@ module VCenterDriver
2401
2415
 
2402
2416
  # Attach DISK to VM (hotplug)
2403
2417
  def attach_disk(disk)
2418
+ # Adding a new disk in newer vSphere versions
2419
+ # automatically cleans all system snapshots
2420
+ # https://github.com/OpenNebula/one/issues/5409
2421
+ if snapshots? or one_snapshots?
2422
+ error_message = 'Existing sytem snapshots, cannot change disks. '
2423
+ error_message << 'Please remove all snapshots and try again.'
2424
+ raise error_message
2425
+ end
2426
+
2404
2427
  spec_hash = {}
2405
2428
  device_change = []
2406
2429
 
@@ -2582,6 +2605,12 @@ module VCenterDriver
2582
2605
  def detach_disk(disk)
2583
2606
  return unless disk.exists?
2584
2607
 
2608
+ if snapshots? or one_snapshots?
2609
+ error_message = 'Existing sytem snapshots, cannot change disks. '
2610
+ error_message << 'Please remove all snapshots and try again.'
2611
+ raise error_message
2612
+ end
2613
+
2585
2614
  spec_hash = {}
2586
2615
  spec_hash[:extraConfig] = [disk.config(:delete)]
2587
2616
  spec_hash[:deviceChange] = [{
@@ -2611,15 +2640,15 @@ module VCenterDriver
2611
2640
  # - The disk is managed by OpenNebula
2612
2641
  detachable= !(one_vm['LCM_STATE'].to_i == 11 && !disk.managed?)
2613
2642
  detachable &&= disk.exists?
2614
-
2643
+
2615
2644
  return unless detachable
2616
2645
 
2617
2646
  detach_disk(disk)
2618
2647
 
2619
2648
  # Check if we want to keep the non persistent disk
2620
2649
  keep_non_persistent_disks =
2621
- VCenterDriver::CONFIG[:keep_non_persistent_disks]
2622
-
2650
+ VCenterDriver::CONFIG[:keep_non_persistent_disks]
2651
+
2623
2652
  return if keep_non_persistent_disks == true
2624
2653
 
2625
2654
  disk.destroy
@@ -2816,7 +2845,7 @@ module VCenterDriver
2816
2845
  # Convert VM to template in vCenter
2817
2846
  mark_as_template
2818
2847
 
2819
- # Edit the Opennebula template
2848
+ # Edit the OpenNebula template
2820
2849
  one_client = OpenNebula::Client.new
2821
2850
  template_id = one_item['TEMPLATE/TEMPLATE_ID']
2822
2851
  new_template = OpenNebula::Template.new_with_id(template_id,
@@ -2867,6 +2896,15 @@ module VCenterDriver
2867
2896
  self['rootSnapshot'] && !self['rootSnapshot'].empty?
2868
2897
  end
2869
2898
 
2899
+ def one_snapshots?
2900
+ begin
2901
+ !one_item['TEMPLATE/SNAPSHOT'].nil?
2902
+ rescue StandardError
2903
+ # one_item may not be retrieved if deploy_id hasn't been set
2904
+ false
2905
+ end
2906
+ end
2907
+
2870
2908
  def instantiated_as_persistent?
2871
2909
  begin
2872
2910
  !one_item['TEMPLATE/CLONING_TEMPLATE_ID'].nil?
@@ -3032,7 +3070,7 @@ module VCenterDriver
3032
3070
  # Create a snapshot for the VM
3033
3071
  def create_snapshot(snap_id, snap_name)
3034
3072
  memory_dumps = true
3035
- memory_dumps = CONFIG[:memory_dumps] if CONFIG[:memory_dumps]
3073
+ memory_dumps = CONFIG[:memory_dumps] unless CONFIG[:memory_dumps].nil?
3036
3074
 
3037
3075
  snapshot_hash = {
3038
3076
  :name => snap_id,
data/lib/vm_template.rb CHANGED
@@ -1573,9 +1573,8 @@ module VCenterDriver
1573
1573
  str << "]\n"
1574
1574
 
1575
1575
  if annotation.nil? || annotation.empty?
1576
- str << 'DESCRIPTION = "vCenter Template \
1577
- imported by OpenNebula' \
1578
- " from Cluster #{ccr_name}\"\n"
1576
+ str << 'DESCRIPTION = "vCenter Template imported by OpenNebula'\
1577
+ " from Cluster #{ccr_name}\"\n"
1579
1578
  else
1580
1579
  notes = annotation.gsub('\\', '\\\\').gsub('"', '\\"')
1581
1580
  str << "DESCRIPTION = \"#{notes}\"\n"
@@ -1659,10 +1658,12 @@ module VCenterDriver
1659
1658
  folders = []
1660
1659
  until item.instance_of? RbVmomi::VIM::Datacenter
1661
1660
  item = item.parent
1662
- first_condition = item.instance_of? RbVmomi::VIM::Datacenter
1663
- second_condition = item.name != 'vm'
1661
+ first_condition =
1662
+ !(item.instance_of? RbVmomi::VIM::Datacenter)
1663
+ second_condition =
1664
+ item.name != 'vm'
1664
1665
 
1665
- unless first_condition && second_condition
1666
+ if first_condition && second_condition
1666
1667
  folders << item.name
1667
1668
  end
1668
1669
  if item.nil?
@@ -1693,8 +1694,8 @@ module VCenterDriver
1693
1694
  one_tmp[:dc_name] = dc_name
1694
1695
  one_tmp[:template_name] = template_name
1695
1696
  one_tmp[:sunstone_template_name]=
1696
- "#{template_name} [ Cluster: #{template_ccr_name} \
1697
- - Template location: #{location} ]"
1697
+ "#{template_name} [ Cluster: #{template_ccr_name}" \
1698
+ " - Template location: #{location} ]"
1698
1699
  one_tmp[:template_location] = location
1699
1700
  one_tmp[:vcenter_ccr_ref] = template_ccr_ref
1700
1701
  one_tmp[:vcenter_ref] = template_ref
data/lib/vmm_importer.rb CHANGED
@@ -54,6 +54,14 @@ module VCenterDriver
54
54
 
55
55
  vc_vm = VCenterDriver::VirtualMachine.new_without_id(@vi_client,
56
56
  vm_ref)
57
+
58
+ # Importing Wild VMs with snapshots is not supported
59
+ # https://github.com/OpenNebula/one/issues/1268
60
+ if vc_vm.snapshots? && vc_vm.disk_keys.empty?
61
+ raise 'Disk metadata not present and snapshots exist, '\
62
+ 'cannot import this VM'
63
+ end
64
+
57
65
  vname = vc_vm['name']
58
66
 
59
67
  type = { :object => 'VM', :id => vname }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: opennebula
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.13.90.pre
4
+ version: 6.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - OpenNebula
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-03-24 00:00:00.000000000 Z
11
+ date: 2021-05-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri
@@ -223,14 +223,14 @@ files:
223
223
  - lib/opennebula/xml_element.rb
224
224
  - lib/opennebula/xml_pool.rb
225
225
  - lib/opennebula/xml_utils.rb
226
- - lib/opennebula/zone.rb
227
226
  - lib/opennebula/zone_pool.rb
227
+ - lib/opennebula/zone.rb
228
228
  - lib/opennebula/flow/grammar.rb
229
229
  - lib/opennebula/flow/service_pool.rb
230
- - lib/opennebula/flow/service_template.rb
231
230
  - lib/opennebula/flow/service_template_ext.rb
232
231
  - lib/opennebula/flow/service_template_pool.rb
233
232
  - lib/opennebula/flow/validator.rb
233
+ - lib/opennebula/flow/service_template.rb
234
234
  - lib/opennebula/ldap_auth.rb
235
235
  - lib/opennebula/ldap_auth_spec.rb
236
236
  - lib/opennebula/server_cipher_auth.rb
@@ -255,9 +255,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
255
255
  version: '0'
256
256
  required_rubygems_version: !ruby/object:Gem::Requirement
257
257
  requirements:
258
- - - '>'
258
+ - - '>='
259
259
  - !ruby/object:Gem::Version
260
- version: 1.3.1
260
+ version: '0'
261
261
  requirements: []
262
262
  rubyforge_project:
263
263
  rubygems_version: 2.0.14.1