opennebula-cli 5.12.10 → 5.13.80.pre
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/oneacct +9 -4
- data/bin/oneacl +8 -5
- data/bin/onecluster +10 -7
- data/bin/onedatastore +10 -7
- data/bin/oneflow +85 -13
- data/bin/oneflow-template +45 -8
- data/bin/onegroup +10 -7
- data/bin/onehook +10 -7
- data/bin/onehost +8 -5
- data/bin/oneimage +99 -8
- data/bin/onemarket +10 -7
- data/bin/onemarketapp +117 -10
- data/bin/onesecgroup +13 -7
- data/bin/oneshowback +18 -10
- data/bin/onetemplate +12 -8
- data/bin/oneuser +30 -7
- data/bin/onevcenter +10 -18
- data/bin/onevdc +10 -7
- data/bin/onevm +146 -11
- data/bin/onevmgroup +13 -7
- data/bin/onevnet +8 -5
- data/bin/onevntemplate +11 -7
- data/bin/onevrouter +10 -7
- data/bin/onezone +10 -7
- data/lib/cli_helper.rb +4 -6
- data/lib/command_parser.rb +1 -1
- data/lib/one_helper/oneacct_helper.rb +8 -17
- 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 +4 -3
- 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 +68 -7
- data/lib/one_helper/oneprovision_helper.rb +0 -362
@@ -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 #
|
@@ -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 #
|
@@ -252,7 +252,7 @@ class OneVMHelper < OpenNebulaHelper::OneHelper
|
|
252
252
|
end
|
253
253
|
|
254
254
|
vm_nics.each do |nic|
|
255
|
-
%w[IP IP6_GLOBAL IP6_ULA IP6
|
255
|
+
%w[IP EXTERNAL_IP IP6_GLOBAL IP6_ULA IP6
|
256
256
|
VROUTER_IP VROUTER_IP6_GLOBAL VROUTER_IP6_ULA].each do |attr|
|
257
257
|
if nic.key?(attr)
|
258
258
|
ips.push(nic[attr])
|
@@ -985,7 +985,7 @@ class OneVMHelper < OpenNebulaHelper::OneHelper
|
|
985
985
|
vm_nics.each do |nic|
|
986
986
|
next if nic.key?('CLI_DONE')
|
987
987
|
|
988
|
-
%w[IP6_LINK IP6_ULA IP6_GLOBAL IP6].each do |attr|
|
988
|
+
%w[EXTERNAL_IP IP6_LINK IP6_ULA IP6_GLOBAL IP6].each do |attr|
|
989
989
|
next unless nic.key?(attr)
|
990
990
|
|
991
991
|
shown_ips << nic[attr]
|
@@ -1013,6 +1013,7 @@ class OneVMHelper < OpenNebulaHelper::OneHelper
|
|
1013
1013
|
end
|
1014
1014
|
|
1015
1015
|
shown_ips << nic['IP'] if nic.key?('IP')
|
1016
|
+
shown_ips << nic['EXTERNAL_IP'] if nic.key?('EXTERNAL_IP')
|
1016
1017
|
|
1017
1018
|
nic.merge!(nic_default) {|_k, v1, _v2| v1 }
|
1018
1019
|
array_id += 1
|
@@ -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 #
|
@@ -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 #
|
@@ -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 #
|
@@ -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 #
|
@@ -38,25 +38,6 @@ class OneVirtualRouterHelper < OpenNebulaHelper::OneHelper
|
|
38
38
|
"onevrouter.yaml"
|
39
39
|
end
|
40
40
|
|
41
|
-
def show_resource(id, options)
|
42
|
-
resource = retrieve_resource(id)
|
43
|
-
|
44
|
-
if !options[:extended].nil?
|
45
|
-
rc = resource.info(options[:extended])
|
46
|
-
else
|
47
|
-
rc = resource.info
|
48
|
-
end
|
49
|
-
|
50
|
-
return -1, rc.message if OpenNebula.is_error?(rc)
|
51
|
-
|
52
|
-
if options[:xml]
|
53
|
-
return 0, resource.to_xml(true)
|
54
|
-
else
|
55
|
-
format_resource(resource, options)
|
56
|
-
return 0
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
41
|
def format_pool(options)
|
61
42
|
config_file = self.class.table_conf
|
62
43
|
|
@@ -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 #
|
@@ -470,6 +470,17 @@ class OneZoneHelper < OpenNebulaHelper::OneHelper
|
|
470
470
|
|
471
471
|
if options[:xml]
|
472
472
|
return 0, resource.to_xml(true)
|
473
|
+
elsif options[:json]
|
474
|
+
# If body is set, the resource contains a JSON inside
|
475
|
+
if options[:body]
|
476
|
+
return 0, check_resource_xsd(resource)
|
477
|
+
else
|
478
|
+
return 0, ::JSON.pretty_generate(
|
479
|
+
check_resource_xsd(resource)
|
480
|
+
)
|
481
|
+
end
|
482
|
+
elsif options[:yaml]
|
483
|
+
return 0, check_resource_xsd(resource).to_yaml(:indent => 4)
|
473
484
|
else
|
474
485
|
format_resource(resource, options)
|
475
486
|
return 0
|
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
|
|