opennebula 5.13.90.pre → 6.0.0.3
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 +1 -1
- data/lib/datacenter.rb +71 -37
- data/lib/distributed_firewall.rb +17 -4
- data/lib/network.rb +13 -16
- data/lib/nsx_client.rb +17 -4
- data/lib/nsx_constants.rb +18 -5
- data/lib/nsx_driver.rb +15 -2
- data/lib/nsx_rule.rb +17 -4
- data/lib/nsxt_client.rb +17 -4
- data/lib/nsxv_client.rb +17 -4
- data/lib/opennebula/flow/service_template.rb +37 -1
- data/lib/opennebula/marketplaceapp_ext.rb +77 -13
- data/lib/opennebula/virtual_machine_ext.rb +35 -17
- data/lib/opennebula.rb +1 -1
- data/lib/scripts_common.rb +3 -0
- data/lib/vcenter_driver.rb +13 -2
- data/lib/vcenter_importer.rb +2 -2
- data/lib/vi_helper.rb +2 -1
- data/lib/virtual_machine.rb +48 -10
- data/lib/vm_template.rb +9 -8
- data/lib/vmm_importer.rb +8 -0
- metadata +19 -19
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a444d034775d99b9c676a7718063ff71798eb2ee
|
4
|
+
data.tar.gz: aba015a7d6e223011bb9f33fd1a610dcc01b1379
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9dad15a530bfa73ffce417c4dc66f8f2118239de7396c7aa1cdae928869f69b994e1dc61a93ab410de9b74511d4a770eac922b07db1d29391758d91fb11b54e6
|
7
|
+
data.tar.gz: e00ba49630acf67ae3fbcc1c715a7164ede4b6aec81fa059ecbe6536f8d90c7477ece5c3e73a9e5a1aafc26508729e9fb390ecfef43815e93f1042f6594a1ca9
|
data/lib/cloud/CloudClient.rb
CHANGED
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?(
|
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
|
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
|
-
|
582
|
-
|
583
|
-
|
584
|
-
|
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
|
-
|
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
|
-
|
657
|
-
|
658
|
-
|
659
|
-
|
660
|
-
|
661
|
-
|
662
|
-
|
663
|
-
|
664
|
-
|
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] <<
|
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] <<
|
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] <<
|
680
|
-
|
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
|
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
|
data/lib/distributed_firewall.rb
CHANGED
@@ -29,14 +29,27 @@ module NSXDriver
|
|
29
29
|
unless defined?(GEMS_LOCATION)
|
30
30
|
end
|
31
31
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
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 = {}, &
|
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] =
|
535
|
+
params[:args] = {}
|
538
536
|
|
539
|
-
selected =
|
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
|
-
|
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
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
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
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
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
|
-
|
44
|
-
|
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
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
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
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
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
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
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
|
|
@@ -357,7 +357,15 @@ module OpenNebula
|
|
357
357
|
|
358
358
|
break rc if OpenNebula.is_error?(rc)
|
359
359
|
|
360
|
-
|
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? ||
|
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
|
192
|
-
template_id
|
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
|
-
|
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
|
-
|
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
|
-
|
363
|
+
tmpl << "\nNAME=\"#{options[:name]}\"\n"
|
301
364
|
|
302
|
-
|
303
|
-
|
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
|
-
|
271
|
-
rc = info
|
272
|
-
raise rc.message if OpenNebula.is_error?(rc)
|
270
|
+
rc = info
|
273
271
|
|
274
|
-
|
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
|
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
|
|
data/lib/opennebula.rb
CHANGED
data/lib/scripts_common.rb
CHANGED
@@ -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
|
|
data/lib/vcenter_driver.rb
CHANGED
@@ -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
|
-
|
44
|
-
|
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'
|
data/lib/vcenter_importer.rb
CHANGED
@@ -496,9 +496,9 @@ module VCenterDriver
|
|
496
496
|
end
|
497
497
|
|
498
498
|
#
|
499
|
-
# Create and allocate a
|
499
|
+
# Create and allocate a OpenNebula Object.
|
500
500
|
#
|
501
|
-
# @param info [String] Info passed to
|
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
|
data/lib/virtual_machine.rb
CHANGED
@@ -33,14 +33,27 @@ module VCenterDriver
|
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
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
|
-
'
|
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
|
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]
|
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
|
-
|
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 =
|
1663
|
-
|
1661
|
+
first_condition =
|
1662
|
+
!(item.instance_of? RbVmomi::VIM::Datacenter)
|
1663
|
+
second_condition =
|
1664
|
+
item.name != 'vm'
|
1664
1665
|
|
1665
|
-
|
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:
|
4
|
+
version: 6.0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- OpenNebula
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-11-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nokogiri
|
@@ -117,24 +117,24 @@ files:
|
|
117
117
|
- lib/opennebula.rb
|
118
118
|
- lib/vcenter_driver.rb
|
119
119
|
- lib/datacenter.rb
|
120
|
-
- lib/datastore.rb
|
121
|
-
- lib/file_helper.rb
|
122
|
-
- lib/host.rb
|
123
120
|
- lib/memoize.rb
|
124
121
|
- lib/network.rb
|
125
122
|
- lib/rest_client.rb
|
126
|
-
- lib/vcenter_importer.rb
|
127
123
|
- lib/vi_client.rb
|
128
124
|
- lib/vi_helper.rb
|
129
|
-
- lib/virtual_machine.rb
|
130
125
|
- lib/vm_device.rb
|
131
126
|
- lib/vm_disk.rb
|
132
127
|
- lib/vm_nic.rb
|
133
128
|
- lib/vm_helper.rb
|
134
129
|
- lib/vm_monitor.rb
|
135
130
|
- lib/vm_folder.rb
|
136
|
-
- lib/vm_template.rb
|
137
131
|
- lib/vmm_importer.rb
|
132
|
+
- lib/datastore.rb
|
133
|
+
- lib/file_helper.rb
|
134
|
+
- lib/host.rb
|
135
|
+
- lib/vcenter_importer.rb
|
136
|
+
- lib/virtual_machine.rb
|
137
|
+
- lib/vm_template.rb
|
138
138
|
- lib/nsx_driver.rb
|
139
139
|
- lib/distributed_firewall.rb
|
140
140
|
- lib/logical_port.rb
|
@@ -189,13 +189,11 @@ files:
|
|
189
189
|
- lib/opennebula/image.rb
|
190
190
|
- lib/opennebula/image_pool.rb
|
191
191
|
- lib/opennebula/lockable_ext.rb
|
192
|
-
- lib/opennebula/marketplace.rb
|
193
192
|
- lib/opennebula/marketplace_pool.rb
|
194
193
|
- lib/opennebula/marketplaceapp.rb
|
195
194
|
- lib/opennebula/marketplaceapp_ext.rb
|
196
195
|
- lib/opennebula/marketplaceapp_pool.rb
|
197
196
|
- lib/opennebula/oneflow_client.rb
|
198
|
-
- lib/opennebula/pool.rb
|
199
197
|
- lib/opennebula/pool_element.rb
|
200
198
|
- lib/opennebula/security_group.rb
|
201
199
|
- lib/opennebula/security_group_pool.rb
|
@@ -203,14 +201,11 @@ files:
|
|
203
201
|
- lib/opennebula/template.rb
|
204
202
|
- lib/opennebula/template_ext.rb
|
205
203
|
- lib/opennebula/template_pool.rb
|
206
|
-
- lib/opennebula/user.rb
|
207
204
|
- lib/opennebula/user_pool.rb
|
208
205
|
- lib/opennebula/utils.rb
|
209
206
|
- lib/opennebula/vdc.rb
|
210
207
|
- lib/opennebula/vdc_pool.rb
|
211
|
-
- lib/opennebula/virtual_machine.rb
|
212
208
|
- lib/opennebula/virtual_machine_ext.rb
|
213
|
-
- lib/opennebula/virtual_machine_pool.rb
|
214
209
|
- lib/opennebula/virtual_network.rb
|
215
210
|
- lib/opennebula/virtual_network_pool.rb
|
216
211
|
- lib/opennebula/virtual_router.rb
|
@@ -219,20 +214,25 @@ files:
|
|
219
214
|
- lib/opennebula/vm_group_pool.rb
|
220
215
|
- lib/opennebula/vntemplate.rb
|
221
216
|
- lib/opennebula/vntemplate_pool.rb
|
222
|
-
- lib/opennebula/wait_ext.rb
|
223
217
|
- lib/opennebula/xml_element.rb
|
224
218
|
- lib/opennebula/xml_pool.rb
|
225
219
|
- lib/opennebula/xml_utils.rb
|
226
|
-
- lib/opennebula/zone.rb
|
227
220
|
- lib/opennebula/zone_pool.rb
|
221
|
+
- lib/opennebula/marketplace.rb
|
222
|
+
- lib/opennebula/pool.rb
|
223
|
+
- lib/opennebula/user.rb
|
224
|
+
- lib/opennebula/virtual_machine.rb
|
225
|
+
- lib/opennebula/virtual_machine_pool.rb
|
226
|
+
- lib/opennebula/wait_ext.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
|
234
|
-
- lib/opennebula/
|
233
|
+
- lib/opennebula/flow/service_template.rb
|
235
234
|
- lib/opennebula/ldap_auth_spec.rb
|
235
|
+
- lib/opennebula/ldap_auth.rb
|
236
236
|
- lib/opennebula/server_cipher_auth.rb
|
237
237
|
- lib/opennebula/server_x509_auth.rb
|
238
238
|
- lib/opennebula/ssh_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:
|
260
|
+
version: '0'
|
261
261
|
requirements: []
|
262
262
|
rubyforge_project:
|
263
263
|
rubygems_version: 2.0.14.1
|