opennebula-cli 5.12.13 → 5.13.80.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 +5 -5
- data/bin/oneacct +5 -14
- data/bin/oneacl +4 -15
- data/bin/onecluster +6 -17
- data/bin/onedatastore +6 -17
- data/bin/oneflow +81 -23
- data/bin/oneflow-template +51 -27
- data/bin/onegroup +6 -17
- data/bin/onehook +6 -17
- data/bin/onehost +4 -15
- data/bin/oneimage +95 -18
- data/bin/onemarket +6 -17
- data/bin/onemarketapp +113 -20
- data/bin/onesecgroup +9 -17
- data/bin/oneshowback +14 -20
- data/bin/onetemplate +8 -18
- data/bin/oneuser +26 -17
- data/bin/onevcenter +6 -28
- data/bin/onevdc +6 -17
- data/bin/onevm +142 -21
- data/bin/onevmgroup +9 -17
- data/bin/onevnet +4 -15
- data/bin/onevntemplate +7 -17
- data/bin/onevrouter +6 -17
- data/bin/onezone +6 -17
- data/lib/cli_helper.rb +7 -10
- data/lib/command_parser.rb +1 -1
- data/lib/one_helper/oneacct_helper.rb +9 -22
- data/lib/one_helper/oneacl_helper.rb +1 -1
- data/lib/one_helper/onecluster_helper.rb +1 -1
- data/lib/one_helper/onedatastore_helper.rb +11 -1
- data/lib/one_helper/oneflow_helper.rb +20 -5
- data/lib/one_helper/oneflowtemplate_helper.rb +28 -2
- data/lib/one_helper/onegroup_helper.rb +1 -1
- data/lib/one_helper/onehook_helper.rb +1 -1
- data/lib/one_helper/onehost_helper.rb +1 -5
- data/lib/one_helper/oneimage_helper.rb +7 -7
- data/lib/one_helper/onemarket_helper.rb +1 -1
- data/lib/one_helper/onemarketapp_helper.rb +494 -96
- data/lib/one_helper/onequota_helper.rb +1 -1
- data/lib/one_helper/onesecgroup_helper.rb +1 -1
- data/lib/one_helper/onetemplate_helper.rb +12 -1
- data/lib/one_helper/oneuser_helper.rb +11 -3
- data/lib/one_helper/onevcenter_helper.rb +176 -146
- data/lib/one_helper/onevdc_helper.rb +1 -1
- data/lib/one_helper/onevm_helper.rb +9 -9
- data/lib/one_helper/onevmgroup_helper.rb +1 -1
- data/lib/one_helper/onevnet_helper.rb +1 -1
- data/lib/one_helper/onevntemplate_helper.rb +1 -1
- data/lib/one_helper/onevrouter_helper.rb +1 -20
- data/lib/one_helper/onezone_helper.rb +12 -1
- data/lib/one_helper.rb +398 -37
- data/share/schemas/xsd/acct.xsd +179 -0
- data/share/schemas/xsd/acl_pool.xsd +22 -0
- data/share/schemas/xsd/api_info.xsd +43 -0
- data/share/schemas/xsd/cluster.xsd +34 -0
- data/share/schemas/xsd/cluster_pool.xsd +12 -0
- data/share/schemas/xsd/datastore.xsd +67 -0
- data/share/schemas/xsd/datastore_pool.xsd +12 -0
- data/share/schemas/xsd/document.xsd +42 -0
- data/share/schemas/xsd/document_pool.xsd +12 -0
- data/share/schemas/xsd/group.xsd +179 -0
- data/share/schemas/xsd/group_pool.xsd +194 -0
- data/share/schemas/xsd/hook.xsd +59 -0
- data/share/schemas/xsd/hook_message_api.xsd +14 -0
- data/share/schemas/xsd/hook_message_retry.xsd +12 -0
- data/share/schemas/xsd/hook_message_state.xsd +25 -0
- data/share/schemas/xsd/hook_pool.xsd +12 -0
- data/share/schemas/xsd/host.xsd +164 -0
- data/share/schemas/xsd/host_pool.xsd +12 -0
- data/share/schemas/xsd/image.xsd +123 -0
- data/share/schemas/xsd/image_pool.xsd +12 -0
- data/share/schemas/xsd/index.xsd +49 -0
- data/share/schemas/xsd/marketplace.xsd +44 -0
- data/share/schemas/xsd/marketplace_pool.xsd +12 -0
- data/share/schemas/xsd/marketplaceapp.xsd +56 -0
- data/share/schemas/xsd/marketplaceapp_pool.xsd +12 -0
- data/share/schemas/xsd/opennebula_configuration.xsd +412 -0
- data/share/schemas/xsd/raftstatus.xsd +18 -0
- data/share/schemas/xsd/security_group.xsd +74 -0
- data/share/schemas/xsd/security_group_pool.xsd +12 -0
- data/share/schemas/xsd/showback.xsd +29 -0
- data/share/schemas/xsd/user.xsd +186 -0
- data/share/schemas/xsd/user_pool.xsd +201 -0
- data/share/schemas/xsd/vdc.xsd +76 -0
- data/share/schemas/xsd/vdc_pool.xsd +12 -0
- data/share/schemas/xsd/vm.xsd +251 -0
- data/share/schemas/xsd/vm_group.xsd +59 -0
- data/share/schemas/xsd/vm_group_pool.xsd +12 -0
- data/share/schemas/xsd/vm_pool.xsd +114 -0
- data/share/schemas/xsd/vmtemplate.xsd +52 -0
- data/share/schemas/xsd/vmtemplate_pool.xsd +12 -0
- data/share/schemas/xsd/vnet.xsd +137 -0
- data/share/schemas/xsd/vnet_pool.xsd +85 -0
- data/share/schemas/xsd/vntemplate.xsd +50 -0
- data/share/schemas/xsd/vntemplate_pool.xsd +12 -0
- data/share/schemas/xsd/vrouter.xsd +49 -0
- data/share/schemas/xsd/vrouter_pool.xsd +12 -0
- data/share/schemas/xsd/zone.xsd +40 -0
- data/share/schemas/xsd/zone_pool.xsd +36 -0
- metadata +92 -30
- data/lib/one_helper/oneprovision_helper.rb +0 -362
data/lib/one_helper.rb
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# -------------------------------------------------------------------------- #
|
|
2
|
-
# Copyright 2002-
|
|
2
|
+
# Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
|
|
3
3
|
# #
|
|
4
4
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may #
|
|
5
5
|
# not use this file except in compliance with the License. You may obtain #
|
|
@@ -30,17 +30,19 @@ include OpenNebula
|
|
|
30
30
|
module OpenNebulaHelper
|
|
31
31
|
ONE_VERSION=<<-EOT
|
|
32
32
|
OpenNebula #{OpenNebula::VERSION}
|
|
33
|
-
Copyright 2002-
|
|
33
|
+
Copyright 2002-2021, OpenNebula Project, OpenNebula Systems
|
|
34
34
|
EOT
|
|
35
35
|
|
|
36
36
|
if ONE_LOCATION
|
|
37
|
-
TABLE_CONF_PATH=ONE_LOCATION+"/etc/cli"
|
|
38
|
-
VAR_LOCATION=ONE_LOCATION+"/var" if !defined?(VAR_LOCATION)
|
|
39
|
-
CLI_ADDONS_LOCATION=ONE_LOCATION+"/lib/ruby/cli/addons"
|
|
37
|
+
TABLE_CONF_PATH = ONE_LOCATION + "/etc/cli"
|
|
38
|
+
VAR_LOCATION = ONE_LOCATION + "/var" if !defined?(VAR_LOCATION)
|
|
39
|
+
CLI_ADDONS_LOCATION = ONE_LOCATION + "/lib/ruby/cli/addons"
|
|
40
|
+
XSD_PATH = ONE_LOCATION + '/share/schemas/xsd'
|
|
40
41
|
else
|
|
41
|
-
TABLE_CONF_PATH="/etc/one/cli"
|
|
42
|
-
VAR_LOCATION="/var/lib/one" if !defined?(VAR_LOCATION)
|
|
43
|
-
CLI_ADDONS_LOCATION="/usr/lib/one/ruby/cli/addons"
|
|
42
|
+
TABLE_CONF_PATH = "/etc/one/cli"
|
|
43
|
+
VAR_LOCATION = "/var/lib/one" if !defined?(VAR_LOCATION)
|
|
44
|
+
CLI_ADDONS_LOCATION = "/usr/lib/one/ruby/cli/addons"
|
|
45
|
+
XSD_PATH = '/usr/share/one/schemas/xsd'
|
|
44
46
|
end
|
|
45
47
|
|
|
46
48
|
EDITOR_PATH='/usr/bin/vi'
|
|
@@ -55,6 +57,23 @@ EOT
|
|
|
55
57
|
:description => "Show the resource in xml format"
|
|
56
58
|
}
|
|
57
59
|
|
|
60
|
+
JSON = {
|
|
61
|
+
:name => 'json',
|
|
62
|
+
:short => '-j',
|
|
63
|
+
:large => '--json',
|
|
64
|
+
:description => 'Show the resource in JSON format',
|
|
65
|
+
:proc => lambda do |_, _|
|
|
66
|
+
require 'json'
|
|
67
|
+
end
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
YAML = {
|
|
71
|
+
:name => 'yaml',
|
|
72
|
+
:short => '-y',
|
|
73
|
+
:large => '--yaml',
|
|
74
|
+
:description => 'Show the resource in YAML format'
|
|
75
|
+
}
|
|
76
|
+
|
|
58
77
|
NUMERIC={
|
|
59
78
|
:name => "numeric",
|
|
60
79
|
:short => "-n",
|
|
@@ -428,7 +447,9 @@ EOT
|
|
|
428
447
|
UPDATECONF_OPTIONS_VM = TEMPLATE_OPTIONS[6..15] + [TEMPLATE_OPTIONS[2],
|
|
429
448
|
TEMPLATE_OPTIONS[17], TEMPLATE_OPTIONS[18]]
|
|
430
449
|
|
|
431
|
-
|
|
450
|
+
FORMAT = [XML, JSON, YAML]
|
|
451
|
+
|
|
452
|
+
OPTIONS = FORMAT, EXTENDED, NUMERIC, KILOBYTES
|
|
432
453
|
|
|
433
454
|
class OneHelper
|
|
434
455
|
attr_accessor :client
|
|
@@ -590,12 +611,10 @@ EOT
|
|
|
590
611
|
end
|
|
591
612
|
|
|
592
613
|
def print_page(pool, options)
|
|
593
|
-
|
|
614
|
+
elements = 0
|
|
615
|
+
page = ""
|
|
594
616
|
|
|
595
617
|
if options[:xml]
|
|
596
|
-
elements = 0
|
|
597
|
-
page = ""
|
|
598
|
-
|
|
599
618
|
pool.each {|e|
|
|
600
619
|
elements += 1
|
|
601
620
|
page << e.to_xml(true) << "\n"
|
|
@@ -604,8 +623,15 @@ EOT
|
|
|
604
623
|
pname = pool.pool_name
|
|
605
624
|
ename = pool.element_name
|
|
606
625
|
|
|
607
|
-
|
|
608
|
-
|
|
626
|
+
if options[:decrypt]
|
|
627
|
+
page = pool.map do |element|
|
|
628
|
+
element.info(true)
|
|
629
|
+
element.to_hash[ename]
|
|
630
|
+
end
|
|
631
|
+
else
|
|
632
|
+
page = pool.to_hash
|
|
633
|
+
elems = page[pname][ename]
|
|
634
|
+
end
|
|
609
635
|
|
|
610
636
|
if elems.class == Array
|
|
611
637
|
elements = elems.length
|
|
@@ -626,7 +652,7 @@ EOT
|
|
|
626
652
|
size = $stdout.winsize[0] - 1
|
|
627
653
|
|
|
628
654
|
# ----------- First page, check if pager is needed -------------
|
|
629
|
-
rc = pool.get_page(size, 0, false)
|
|
655
|
+
rc = pool.get_page(size, 0, false, options[:state])
|
|
630
656
|
ps = ""
|
|
631
657
|
|
|
632
658
|
return -1, rc.message if OpenNebula.is_error?(rc)
|
|
@@ -654,7 +680,7 @@ EOT
|
|
|
654
680
|
options[:no_header] = true
|
|
655
681
|
|
|
656
682
|
loop do
|
|
657
|
-
rc = pool.get_page(size, current, false)
|
|
683
|
+
rc = pool.get_page(size, current, false, options[:state])
|
|
658
684
|
|
|
659
685
|
return -1, rc.message if OpenNebula.is_error?(rc)
|
|
660
686
|
|
|
@@ -677,19 +703,19 @@ EOT
|
|
|
677
703
|
|
|
678
704
|
stop_pager(ppid)
|
|
679
705
|
else
|
|
680
|
-
|
|
681
|
-
return -1, array.message if OpenNebula.is_error?(array)
|
|
706
|
+
rc = pool.info
|
|
682
707
|
|
|
683
|
-
|
|
684
|
-
|
|
708
|
+
return -1, rc.message if OpenNebula.is_error?(rc)
|
|
709
|
+
|
|
710
|
+
_, hash = print_page(pool, options)
|
|
685
711
|
|
|
686
712
|
if options[:ids] && elements
|
|
687
|
-
|
|
713
|
+
hash.reject! do |element|
|
|
688
714
|
!options[:ids].include?(element['ID'].to_i)
|
|
689
715
|
end
|
|
690
716
|
end
|
|
691
717
|
|
|
692
|
-
table.show(
|
|
718
|
+
table.show(hash, options)
|
|
693
719
|
end
|
|
694
720
|
|
|
695
721
|
return 0
|
|
@@ -705,7 +731,7 @@ EOT
|
|
|
705
731
|
size = $stdout.winsize[0] - 1
|
|
706
732
|
|
|
707
733
|
# ----------- First page, check if pager is needed -------------
|
|
708
|
-
rc = pool.get_page(size, 0, extended)
|
|
734
|
+
rc = pool.get_page(size, 0, extended, options[:state])
|
|
709
735
|
ps = ""
|
|
710
736
|
|
|
711
737
|
return -1, rc.message if OpenNebula.is_error?(rc)
|
|
@@ -740,7 +766,7 @@ EOT
|
|
|
740
766
|
current = size
|
|
741
767
|
|
|
742
768
|
loop do
|
|
743
|
-
rc = pool.get_page(size, current, extended)
|
|
769
|
+
rc = pool.get_page(size, current, extended, options[:state])
|
|
744
770
|
|
|
745
771
|
return -1, rc.message if OpenNebula.is_error?(rc)
|
|
746
772
|
|
|
@@ -779,6 +805,82 @@ EOT
|
|
|
779
805
|
return 0
|
|
780
806
|
end
|
|
781
807
|
|
|
808
|
+
#-----------------------------------------------------------------------
|
|
809
|
+
# List pool in JSON format, pagination is used in interactive output
|
|
810
|
+
#-----------------------------------------------------------------------
|
|
811
|
+
def list_pool_format(pool, options, filter_flag)
|
|
812
|
+
extended = options.include?(:extended) && options[:extended]
|
|
813
|
+
|
|
814
|
+
if $stdout.isatty and (!options.key?:no_pager)
|
|
815
|
+
size = $stdout.winsize[0] - 1
|
|
816
|
+
|
|
817
|
+
# ----------- First page, check if pager is needed -------------
|
|
818
|
+
rc = pool.get_page(size, 0, extended, options[:state])
|
|
819
|
+
ps = ""
|
|
820
|
+
|
|
821
|
+
return -1, rc.message if OpenNebula.is_error?(rc)
|
|
822
|
+
|
|
823
|
+
elements = get_format_size(pool, options)
|
|
824
|
+
ppid = -1
|
|
825
|
+
|
|
826
|
+
if elements >= size
|
|
827
|
+
ppid = start_pager
|
|
828
|
+
end
|
|
829
|
+
|
|
830
|
+
yield(pool) if block_given?
|
|
831
|
+
|
|
832
|
+
if elements < size
|
|
833
|
+
return 0
|
|
834
|
+
end
|
|
835
|
+
|
|
836
|
+
if elements < size
|
|
837
|
+
return 0
|
|
838
|
+
elsif !pool.is_paginated?
|
|
839
|
+
stop_pager(ppid)
|
|
840
|
+
return 0
|
|
841
|
+
end
|
|
842
|
+
|
|
843
|
+
# ------- Rest of the pages in the pool, piped to pager --------
|
|
844
|
+
current = size
|
|
845
|
+
|
|
846
|
+
loop do
|
|
847
|
+
rc = pool.get_page(size, current, extended, options[:state])
|
|
848
|
+
|
|
849
|
+
return -1, rc.message if OpenNebula.is_error?(rc)
|
|
850
|
+
|
|
851
|
+
current += size
|
|
852
|
+
|
|
853
|
+
begin
|
|
854
|
+
Process.waitpid(ppid, Process::WNOHANG)
|
|
855
|
+
rescue Errno::ECHILD
|
|
856
|
+
break
|
|
857
|
+
end
|
|
858
|
+
|
|
859
|
+
elements = get_format_size(pool, options)
|
|
860
|
+
|
|
861
|
+
break if elements < size
|
|
862
|
+
|
|
863
|
+
yield(pool) if block_given?
|
|
864
|
+
|
|
865
|
+
$stdout.flush
|
|
866
|
+
end
|
|
867
|
+
|
|
868
|
+
stop_pager(ppid)
|
|
869
|
+
else
|
|
870
|
+
if pool.pool_name == "VM_POOL" && extended
|
|
871
|
+
rc = pool.info_all_extended
|
|
872
|
+
else
|
|
873
|
+
rc = pool.info
|
|
874
|
+
end
|
|
875
|
+
|
|
876
|
+
return -1, rc.message if OpenNebula.is_error?(rc)
|
|
877
|
+
|
|
878
|
+
yield(pool) if block_given?
|
|
879
|
+
end
|
|
880
|
+
|
|
881
|
+
return 0
|
|
882
|
+
end
|
|
883
|
+
|
|
782
884
|
#-----------------------------------------------------------------------
|
|
783
885
|
# List pool table in top-like form
|
|
784
886
|
#-----------------------------------------------------------------------
|
|
@@ -807,11 +909,27 @@ EOT
|
|
|
807
909
|
filter_flag ||= OpenNebula::Pool::INFO_ALL
|
|
808
910
|
|
|
809
911
|
pool = factory_pool(filter_flag)
|
|
912
|
+
pname = pool.pool_name
|
|
913
|
+
ename = pool.element_name
|
|
810
914
|
|
|
811
915
|
if top
|
|
812
916
|
return list_pool_top(table, pool, options)
|
|
813
917
|
elsif options[:xml]
|
|
814
918
|
return list_pool_xml(pool, options, filter_flag)
|
|
919
|
+
elsif options[:json]
|
|
920
|
+
list_pool_format(pool, options, filter_flag) do |pool|
|
|
921
|
+
hash = check_resource_xsd(pool, pname)
|
|
922
|
+
hash[pname] = check_resource_xsd(hash[pname], ename)
|
|
923
|
+
|
|
924
|
+
puts ::JSON.pretty_generate(hash)
|
|
925
|
+
end
|
|
926
|
+
elsif options[:yaml]
|
|
927
|
+
list_pool_format(pool, options, filter_flag) do |pool|
|
|
928
|
+
hash = check_resource_xsd(pool, pname)
|
|
929
|
+
hash[pname] = check_resource_xsd(hash[pname], ename)
|
|
930
|
+
|
|
931
|
+
puts hash.to_yaml(:indent => 4)
|
|
932
|
+
end
|
|
815
933
|
else
|
|
816
934
|
return list_pool_table(table, pool, options, filter_flag)
|
|
817
935
|
end
|
|
@@ -855,6 +973,17 @@ EOT
|
|
|
855
973
|
|
|
856
974
|
if options[:xml]
|
|
857
975
|
return 0, resource.to_xml(true)
|
|
976
|
+
elsif options[:json]
|
|
977
|
+
# If body is set, the resource contains a JSON inside
|
|
978
|
+
if options[:body]
|
|
979
|
+
return 0, check_resource_xsd(resource)
|
|
980
|
+
else
|
|
981
|
+
return 0, ::JSON.pretty_generate(
|
|
982
|
+
check_resource_xsd(resource)
|
|
983
|
+
)
|
|
984
|
+
end
|
|
985
|
+
elsif options[:yaml]
|
|
986
|
+
return 0, check_resource_xsd(resource).to_yaml(:indent => 4)
|
|
858
987
|
else
|
|
859
988
|
format_resource(resource, options)
|
|
860
989
|
return 0
|
|
@@ -1064,6 +1193,199 @@ EOT
|
|
|
1064
1193
|
|
|
1065
1194
|
return 0, pool
|
|
1066
1195
|
end
|
|
1196
|
+
|
|
1197
|
+
def get_format_size(pool, options)
|
|
1198
|
+
if options[:json]
|
|
1199
|
+
::JSON.pretty_generate(pool.to_hash).split("\n").size
|
|
1200
|
+
elsif options[:yaml]
|
|
1201
|
+
pool.to_hash.to_yaml.split("\n").size
|
|
1202
|
+
else
|
|
1203
|
+
STDERR.puts 'ERROR: Format not found'
|
|
1204
|
+
exit(-1)
|
|
1205
|
+
end
|
|
1206
|
+
end
|
|
1207
|
+
|
|
1208
|
+
########################################################################
|
|
1209
|
+
# XSD check and fix
|
|
1210
|
+
########################################################################
|
|
1211
|
+
|
|
1212
|
+
# Check XSD values for a single resource
|
|
1213
|
+
#
|
|
1214
|
+
# @param resource [OpenNebula::Object] Resource to check
|
|
1215
|
+
# @param ename [String] Resource name
|
|
1216
|
+
#
|
|
1217
|
+
# @return [Object] Hash with correct values
|
|
1218
|
+
def check_resource_xsd(resource, ename = nil)
|
|
1219
|
+
hash = resource.to_hash
|
|
1220
|
+
ename = hash.keys.first unless ename
|
|
1221
|
+
xsd = read_xsd(ename)
|
|
1222
|
+
|
|
1223
|
+
return hash unless xsd
|
|
1224
|
+
|
|
1225
|
+
hash[ename] = check_xsd(hash[ename], nil, ename, xsd)
|
|
1226
|
+
|
|
1227
|
+
hash
|
|
1228
|
+
end
|
|
1229
|
+
|
|
1230
|
+
# Read XSD file and parse to XML
|
|
1231
|
+
#
|
|
1232
|
+
# @param ename [String] Element name to read XSD
|
|
1233
|
+
#
|
|
1234
|
+
# @return [Hash] XSD in hash format, nil if not found
|
|
1235
|
+
def read_xsd(ename)
|
|
1236
|
+
require 'active_support/core_ext/hash/conversions'
|
|
1237
|
+
|
|
1238
|
+
# Try GEM directory
|
|
1239
|
+
file = File.expand_path(
|
|
1240
|
+
"../share/schemas/xsd/#{ename.downcase}.xsd",
|
|
1241
|
+
File.dirname(__FILE__)
|
|
1242
|
+
)
|
|
1243
|
+
|
|
1244
|
+
file = "#{XSD_PATH}/#{ename.downcase}.xsd" unless File.exist?(file)
|
|
1245
|
+
|
|
1246
|
+
unless File.exist?(file)
|
|
1247
|
+
STDERR.puts "WARNING: XSD for #{ename} not found, skipping check"
|
|
1248
|
+
return nil
|
|
1249
|
+
end
|
|
1250
|
+
|
|
1251
|
+
hash = Hash.from_xml(Nokogiri::XML(File.read(file)).to_s)
|
|
1252
|
+
hash = hash['schema']['element']
|
|
1253
|
+
|
|
1254
|
+
if hash.keys.include?('complexType')
|
|
1255
|
+
hash['complexType']['sequence']['element']
|
|
1256
|
+
else
|
|
1257
|
+
hash['element']
|
|
1258
|
+
end
|
|
1259
|
+
end
|
|
1260
|
+
|
|
1261
|
+
# Check values XSD
|
|
1262
|
+
#
|
|
1263
|
+
# @param hash [Object] Resource information in hash format
|
|
1264
|
+
# @param elements [Array] Keys to check
|
|
1265
|
+
# @param ename [String] Element name to take XSD
|
|
1266
|
+
# @param xsd [Hash] XSD file content
|
|
1267
|
+
# @param parents [Array] Parent keys of current hash
|
|
1268
|
+
def check_xsd(hash, elements, ename, xsd, parents = [])
|
|
1269
|
+
return unless hash
|
|
1270
|
+
|
|
1271
|
+
if (hash.is_a? Hash) && !hash.empty?
|
|
1272
|
+
hash.map do |ki, vi|
|
|
1273
|
+
vi = [vi].flatten if is_array?(xsd, [ki])
|
|
1274
|
+
|
|
1275
|
+
if (vi.is_a? Hash) && !vi.empty?
|
|
1276
|
+
parents << ki
|
|
1277
|
+
|
|
1278
|
+
vi.map do |kj, vj|
|
|
1279
|
+
parents << kj
|
|
1280
|
+
|
|
1281
|
+
path = (parents + [ki, kj]).uniq
|
|
1282
|
+
vj = [vj].flatten if is_array?(xsd, path)
|
|
1283
|
+
|
|
1284
|
+
hash[ki][kj] = check_xsd(vj,
|
|
1285
|
+
[ki, kj],
|
|
1286
|
+
ename,
|
|
1287
|
+
xsd,
|
|
1288
|
+
parents)
|
|
1289
|
+
end
|
|
1290
|
+
|
|
1291
|
+
parents.clear
|
|
1292
|
+
elsif vi.is_a? Array
|
|
1293
|
+
hash[ki] = check_xsd(vi, [ki], ename, xsd, parents)
|
|
1294
|
+
else
|
|
1295
|
+
hash[ki] = check_xsd(vi, [ki], ename, xsd, parents)
|
|
1296
|
+
end
|
|
1297
|
+
end
|
|
1298
|
+
|
|
1299
|
+
hash
|
|
1300
|
+
elsif hash.is_a? Array
|
|
1301
|
+
ret = []
|
|
1302
|
+
|
|
1303
|
+
hash.each do |v|
|
|
1304
|
+
ret << check_xsd(v, elements, ename, xsd, parents)
|
|
1305
|
+
end
|
|
1306
|
+
|
|
1307
|
+
ret
|
|
1308
|
+
else
|
|
1309
|
+
check_type(hash) do
|
|
1310
|
+
type = get_xsd_path(xsd, elements)
|
|
1311
|
+
type['type'] unless type.nil?
|
|
1312
|
+
end
|
|
1313
|
+
end
|
|
1314
|
+
end
|
|
1315
|
+
|
|
1316
|
+
# Get xsd path value
|
|
1317
|
+
#
|
|
1318
|
+
# @param xsd [Hash] XSD information
|
|
1319
|
+
# @param elements [Array] Path to get
|
|
1320
|
+
#
|
|
1321
|
+
# @return [Hash] Path information
|
|
1322
|
+
def get_xsd_path(xsd, elements)
|
|
1323
|
+
return unless elements
|
|
1324
|
+
|
|
1325
|
+
element = elements.shift
|
|
1326
|
+
|
|
1327
|
+
# Return nil, because is an empty complexType
|
|
1328
|
+
return unless element
|
|
1329
|
+
|
|
1330
|
+
element = [xsd].flatten.find do |v|
|
|
1331
|
+
v['name'] == element || v['ref'] == element
|
|
1332
|
+
end
|
|
1333
|
+
|
|
1334
|
+
# Return nil, because element was not find in XSD
|
|
1335
|
+
return unless element
|
|
1336
|
+
|
|
1337
|
+
if element.keys.include?('complexType') && !elements.empty?
|
|
1338
|
+
if element['complexType']['all']
|
|
1339
|
+
element = element['complexType']['all']['element']
|
|
1340
|
+
else
|
|
1341
|
+
element = element['complexType']['sequence']['element']
|
|
1342
|
+
end
|
|
1343
|
+
|
|
1344
|
+
get_xsd_path(element, elements)
|
|
1345
|
+
else
|
|
1346
|
+
element
|
|
1347
|
+
end
|
|
1348
|
+
end
|
|
1349
|
+
|
|
1350
|
+
# CHeck if current element is an array
|
|
1351
|
+
#
|
|
1352
|
+
# @param xsd [Hash] XSD information
|
|
1353
|
+
# @param elements [Array] Path to check
|
|
1354
|
+
#
|
|
1355
|
+
# @return [Boolean] True if it's an array, false otherwise
|
|
1356
|
+
def is_array?(xsd, elements)
|
|
1357
|
+
max = get_xsd_path(xsd, elements)
|
|
1358
|
+
max = max['maxOccurs'] if max
|
|
1359
|
+
|
|
1360
|
+
max == 'unbounded' || max.to_i > 1
|
|
1361
|
+
end
|
|
1362
|
+
|
|
1363
|
+
# Check XSD type for especific value
|
|
1364
|
+
#
|
|
1365
|
+
# @param value [Object] Value to check
|
|
1366
|
+
#
|
|
1367
|
+
# @return [Object] nil if the type is not correct, value otherwise
|
|
1368
|
+
def check_type(value)
|
|
1369
|
+
type = yield if block_given?
|
|
1370
|
+
|
|
1371
|
+
# If there is no type, return current value
|
|
1372
|
+
return value unless type
|
|
1373
|
+
|
|
1374
|
+
types = %w[string decimal integer boolean date time]
|
|
1375
|
+
type = type.split(':')[1]
|
|
1376
|
+
|
|
1377
|
+
if types.include?(type)
|
|
1378
|
+
# If the current type is different, return string
|
|
1379
|
+
# because this value doesn't respect the type
|
|
1380
|
+
if (value.is_a? Hash) || (value.is_a? Array)
|
|
1381
|
+
''
|
|
1382
|
+
else
|
|
1383
|
+
value
|
|
1384
|
+
end
|
|
1385
|
+
else
|
|
1386
|
+
value
|
|
1387
|
+
end
|
|
1388
|
+
end
|
|
1067
1389
|
end
|
|
1068
1390
|
|
|
1069
1391
|
def OpenNebulaHelper.rname_to_id(name, poolname)
|
|
@@ -1072,18 +1394,20 @@ EOT
|
|
|
1072
1394
|
client=OneHelper.client
|
|
1073
1395
|
|
|
1074
1396
|
pool = case poolname
|
|
1075
|
-
when "HOST"
|
|
1076
|
-
when "HOOK"
|
|
1077
|
-
when "GROUP"
|
|
1078
|
-
when "USER"
|
|
1079
|
-
when "DATASTORE"
|
|
1080
|
-
when "CLUSTER"
|
|
1081
|
-
when "VNET"
|
|
1082
|
-
when "IMAGE"
|
|
1083
|
-
when "VMTEMPLATE"
|
|
1084
|
-
when "
|
|
1085
|
-
when "
|
|
1086
|
-
when "
|
|
1397
|
+
when "HOST" then OpenNebula::HostPool.new(client)
|
|
1398
|
+
when "HOOK" then OpenNebula::HookPool.new(client)
|
|
1399
|
+
when "GROUP" then OpenNebula::GroupPool.new(client)
|
|
1400
|
+
when "USER" then OpenNebula::UserPool.new(client)
|
|
1401
|
+
when "DATASTORE" then OpenNebula::DatastorePool.new(client)
|
|
1402
|
+
when "CLUSTER" then OpenNebula::ClusterPool.new(client)
|
|
1403
|
+
when "VNET" then OpenNebula::VirtualNetworkPool.new(client)
|
|
1404
|
+
when "IMAGE" then OpenNebula::ImagePool.new(client)
|
|
1405
|
+
when "VMTEMPLATE" then OpenNebula::TemplatePool.new(client)
|
|
1406
|
+
when "VNTEMPLATES" then OpenNebula::VNTemplatePool.new(client)
|
|
1407
|
+
when "VM" then OpenNebula::VirtualMachinePool.new(client)
|
|
1408
|
+
when "ZONE" then OpenNebula::ZonePool.new(client)
|
|
1409
|
+
when "MARKETPLACE" then OpenNebula::MarketPlacePool.new(client)
|
|
1410
|
+
when "FLOWTEMPLATES" then OpenNebula::ServiceTemplatePool.new(client)
|
|
1087
1411
|
end
|
|
1088
1412
|
|
|
1089
1413
|
rc = pool.info
|
|
@@ -1269,6 +1593,43 @@ EOT
|
|
|
1269
1593
|
end
|
|
1270
1594
|
end
|
|
1271
1595
|
|
|
1596
|
+
def OpenNebulaHelper.update_obj(obj, file, plain = false)
|
|
1597
|
+
rc = obj.info(true)
|
|
1598
|
+
|
|
1599
|
+
return rc if OpenNebula.is_error?(rc)
|
|
1600
|
+
|
|
1601
|
+
if file
|
|
1602
|
+
path = file
|
|
1603
|
+
else
|
|
1604
|
+
tmp = Tempfile.new(obj['ID'])
|
|
1605
|
+
path = tmp.path
|
|
1606
|
+
|
|
1607
|
+
tmp.write(yield(obj)) if block_given?
|
|
1608
|
+
tmp.flush
|
|
1609
|
+
|
|
1610
|
+
if ENV['EDITOR']
|
|
1611
|
+
editor_path = ENV['EDITOR']
|
|
1612
|
+
else
|
|
1613
|
+
editor_path = EDITOR_PATH
|
|
1614
|
+
end
|
|
1615
|
+
|
|
1616
|
+
system("#{editor_path} #{path}")
|
|
1617
|
+
|
|
1618
|
+
unless $CHILD_STATUS.exitstatus.zero?
|
|
1619
|
+
STDERR.puts 'Editor not defined'
|
|
1620
|
+
exit(-1)
|
|
1621
|
+
end
|
|
1622
|
+
|
|
1623
|
+
tmp.close
|
|
1624
|
+
end
|
|
1625
|
+
|
|
1626
|
+
if plain
|
|
1627
|
+
obj.update(File.read(path), plain)
|
|
1628
|
+
else
|
|
1629
|
+
obj.update(File.read(path))
|
|
1630
|
+
end
|
|
1631
|
+
end
|
|
1632
|
+
|
|
1272
1633
|
def OpenNebulaHelper.editor_input(contents=nil)
|
|
1273
1634
|
require 'tempfile'
|
|
1274
1635
|
|