opennebula-cli 5.12.6 → 5.13.90.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.
Files changed (103) hide show
  1. checksums.yaml +4 -4
  2. data/bin/oneacct +9 -4
  3. data/bin/oneacl +8 -5
  4. data/bin/onecluster +10 -7
  5. data/bin/onedatastore +10 -7
  6. data/bin/oneflow +85 -13
  7. data/bin/oneflow-template +45 -8
  8. data/bin/onegroup +10 -7
  9. data/bin/onehook +10 -7
  10. data/bin/onehost +10 -7
  11. data/bin/oneimage +100 -9
  12. data/bin/onemarket +10 -7
  13. data/bin/onemarketapp +118 -11
  14. data/bin/onesecgroup +13 -7
  15. data/bin/oneshowback +23 -10
  16. data/bin/onetemplate +16 -9
  17. data/bin/oneuser +30 -7
  18. data/bin/onevcenter +10 -6
  19. data/bin/onevdc +10 -7
  20. data/bin/onevm +147 -12
  21. data/bin/onevmgroup +13 -7
  22. data/bin/onevnet +8 -5
  23. data/bin/onevntemplate +11 -7
  24. data/bin/onevrouter +10 -7
  25. data/bin/onezone +11 -8
  26. data/lib/cli_helper.rb +17 -8
  27. data/lib/command_parser.rb +1 -1
  28. data/lib/one_helper.rb +414 -46
  29. data/lib/one_helper/oneacct_helper.rb +8 -17
  30. data/lib/one_helper/oneacl_helper.rb +1 -1
  31. data/lib/one_helper/onecluster_helper.rb +1 -1
  32. data/lib/one_helper/onedatastore_helper.rb +11 -1
  33. data/lib/one_helper/oneflow_helper.rb +20 -5
  34. data/lib/one_helper/oneflowtemplate_helper.rb +28 -2
  35. data/lib/one_helper/onegroup_helper.rb +1 -1
  36. data/lib/one_helper/onehook_helper.rb +1 -1
  37. data/lib/one_helper/onehost_helper.rb +1 -5
  38. data/lib/one_helper/oneimage_helper.rb +7 -7
  39. data/lib/one_helper/onemarket_helper.rb +1 -1
  40. data/lib/one_helper/onemarketapp_helper.rb +500 -96
  41. data/lib/one_helper/onequota_helper.rb +1 -1
  42. data/lib/one_helper/onesecgroup_helper.rb +1 -1
  43. data/lib/one_helper/onetemplate_helper.rb +16 -4
  44. data/lib/one_helper/oneuser_helper.rb +11 -3
  45. data/lib/one_helper/onevcenter_helper.rb +176 -146
  46. data/lib/one_helper/onevdc_helper.rb +1 -1
  47. data/lib/one_helper/onevm_helper.rb +4 -3
  48. data/lib/one_helper/onevmgroup_helper.rb +1 -1
  49. data/lib/one_helper/onevnet_helper.rb +1 -1
  50. data/lib/one_helper/onevntemplate_helper.rb +1 -1
  51. data/lib/one_helper/onevrouter_helper.rb +1 -20
  52. data/lib/one_helper/onezone_helper.rb +24 -17
  53. data/share/schemas/xsd/acct.xsd +179 -0
  54. data/share/schemas/xsd/acl_pool.xsd +22 -0
  55. data/share/schemas/xsd/api_info.xsd +43 -0
  56. data/share/schemas/xsd/cluster.xsd +34 -0
  57. data/share/schemas/xsd/cluster_pool.xsd +12 -0
  58. data/share/schemas/xsd/datastore.xsd +67 -0
  59. data/share/schemas/xsd/datastore_pool.xsd +12 -0
  60. data/share/schemas/xsd/document.xsd +42 -0
  61. data/share/schemas/xsd/document_pool.xsd +12 -0
  62. data/share/schemas/xsd/group.xsd +179 -0
  63. data/share/schemas/xsd/group_pool.xsd +194 -0
  64. data/share/schemas/xsd/hook.xsd +59 -0
  65. data/share/schemas/xsd/hook_message_api.xsd +14 -0
  66. data/share/schemas/xsd/hook_message_retry.xsd +12 -0
  67. data/share/schemas/xsd/hook_message_state.xsd +25 -0
  68. data/share/schemas/xsd/hook_pool.xsd +12 -0
  69. data/share/schemas/xsd/host.xsd +164 -0
  70. data/share/schemas/xsd/host_pool.xsd +12 -0
  71. data/share/schemas/xsd/image.xsd +123 -0
  72. data/share/schemas/xsd/image_pool.xsd +12 -0
  73. data/share/schemas/xsd/index.xsd +50 -0
  74. data/share/schemas/xsd/marketplace.xsd +44 -0
  75. data/share/schemas/xsd/marketplace_pool.xsd +12 -0
  76. data/share/schemas/xsd/marketplaceapp.xsd +56 -0
  77. data/share/schemas/xsd/marketplaceapp_pool.xsd +12 -0
  78. data/share/schemas/xsd/monitoring_data.xsd +41 -0
  79. data/share/schemas/xsd/opennebula_configuration.xsd +412 -0
  80. data/share/schemas/xsd/raftstatus.xsd +18 -0
  81. data/share/schemas/xsd/security_group.xsd +74 -0
  82. data/share/schemas/xsd/security_group_pool.xsd +12 -0
  83. data/share/schemas/xsd/showback.xsd +29 -0
  84. data/share/schemas/xsd/user.xsd +186 -0
  85. data/share/schemas/xsd/user_pool.xsd +201 -0
  86. data/share/schemas/xsd/vdc.xsd +76 -0
  87. data/share/schemas/xsd/vdc_pool.xsd +12 -0
  88. data/share/schemas/xsd/vm.xsd +251 -0
  89. data/share/schemas/xsd/vm_group.xsd +59 -0
  90. data/share/schemas/xsd/vm_group_pool.xsd +12 -0
  91. data/share/schemas/xsd/vm_pool.xsd +114 -0
  92. data/share/schemas/xsd/vmtemplate.xsd +52 -0
  93. data/share/schemas/xsd/vmtemplate_pool.xsd +12 -0
  94. data/share/schemas/xsd/vnet.xsd +137 -0
  95. data/share/schemas/xsd/vnet_pool.xsd +85 -0
  96. data/share/schemas/xsd/vntemplate.xsd +50 -0
  97. data/share/schemas/xsd/vntemplate_pool.xsd +12 -0
  98. data/share/schemas/xsd/vrouter.xsd +49 -0
  99. data/share/schemas/xsd/vrouter_pool.xsd +12 -0
  100. data/share/schemas/xsd/zone.xsd +40 -0
  101. data/share/schemas/xsd/zone_pool.xsd +36 -0
  102. metadata +80 -18
  103. data/lib/one_helper/oneprovision_helper.rb +0 -362
data/bin/onevmgroup CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  # -------------------------------------------------------------------------- #
4
- # Copyright 2002-2020, OpenNebula Project, OpenNebula Systems #
4
+ # Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
5
5
  # #
6
6
  # Licensed under the Apache License, Version 2.0 (the "License"); you may #
7
7
  # not use this file except in compliance with the License. You may obtain #
@@ -27,9 +27,12 @@ else
27
27
  end
28
28
 
29
29
  if File.directory?(GEMS_LOCATION)
30
- $LOAD_PATH.reject! {|l| l =~ /vendor_ruby/ }
31
- require 'rubygems'
32
- Gem.use_paths(File.realpath(GEMS_LOCATION))
30
+ real_gems_path = File.realpath(GEMS_LOCATION)
31
+ if !defined?(Gem) || Gem.path != [real_gems_path]
32
+ $LOAD_PATH.reject! {|l| l =~ /vendor_ruby/ }
33
+ require 'rubygems'
34
+ Gem.use_paths(real_gems_path)
35
+ end
33
36
  end
34
37
 
35
38
  $LOAD_PATH << RUBY_LIB_LOCATION
@@ -77,8 +80,8 @@ CommandParser::CmdParser.new(ARGV) do
77
80
  ########################################################################
78
81
  set :option, CommandParser::OPTIONS + OpenNebulaHelper::CLIENT_OPTIONS
79
82
 
80
- list_options = CLIHelper::OPTIONS
81
- list_options << OpenNebulaHelper::XML
83
+ list_options = CLIHelper::OPTIONS
84
+ list_options += OpenNebulaHelper::FORMAT
82
85
  list_options << OpenNebulaHelper::NUMERIC
83
86
  list_options << OpenNebulaHelper::DESCRIBE
84
87
 
@@ -148,7 +151,10 @@ CommandParser::CmdParser.new(ARGV) do
148
151
  Shows information for the given VM Group
149
152
  EOT
150
153
 
151
- command :show, show_desc, :vmgroupid, :options => OpenNebulaHelper::XML do
154
+ command :show,
155
+ show_desc,
156
+ :vmgroupid,
157
+ :options => OpenNebulaHelper::FORMAT do
152
158
  helper.show_resource(args[0], options)
153
159
  end
154
160
 
data/bin/onevnet CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  # -------------------------------------------------------------------------- #
4
- # Copyright 2002-2020, OpenNebula Project, OpenNebula Systems #
4
+ # Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
5
5
  # #
6
6
  # Licensed under the Apache License, Version 2.0 (the "License"); you may #
7
7
  # not use this file except in compliance with the License. You may obtain #
@@ -27,9 +27,12 @@ else
27
27
  end
28
28
 
29
29
  if File.directory?(GEMS_LOCATION)
30
- $LOAD_PATH.reject! {|l| l =~ /vendor_ruby/ }
31
- require 'rubygems'
32
- Gem.use_paths(File.realpath(GEMS_LOCATION))
30
+ real_gems_path = File.realpath(GEMS_LOCATION)
31
+ if !defined?(Gem) || Gem.path != [real_gems_path]
32
+ $LOAD_PATH.reject! {|l| l =~ /vendor_ruby/ }
33
+ require 'rubygems'
34
+ Gem.use_paths(real_gems_path)
35
+ end
33
36
  end
34
37
 
35
38
  $LOAD_PATH << RUBY_LIB_LOCATION
@@ -320,7 +323,7 @@ CommandParser::CmdParser.new(ARGV) do
320
323
  EOT
321
324
 
322
325
  command :show, show_desc, :vnetid,
323
- :options => [OpenNebulaHelper::XML,
326
+ :options => [OpenNebulaHelper::FORMAT,
324
327
  OpenNebulaHelper::DECRYPT,
325
328
  OneVNetHelper::SHOW_AR] do
326
329
  helper.show_resource(args[0], options)
data/bin/onevntemplate CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  # -------------------------------------------------------------------------- #
4
- # Copyright 2002-2020, OpenNebula Project, OpenNebula Systems #
4
+ # Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
5
5
  # #
6
6
  # Licensed under the Apache License, Version 2.0 (the "License"); you may #
7
7
  # not use this file except in compliance with the License. You may obtain #
@@ -27,9 +27,12 @@ else
27
27
  end
28
28
 
29
29
  if File.directory?(GEMS_LOCATION)
30
- $LOAD_PATH.reject! {|l| l =~ /vendor_ruby/ }
31
- require 'rubygems'
32
- Gem.use_paths(File.realpath(GEMS_LOCATION))
30
+ real_gems_path = File.realpath(GEMS_LOCATION)
31
+ if !defined?(Gem) || Gem.path != [real_gems_path]
32
+ $LOAD_PATH.reject! {|l| l =~ /vendor_ruby/ }
33
+ require 'rubygems'
34
+ Gem.use_paths(real_gems_path)
35
+ end
33
36
  end
34
37
 
35
38
  $LOAD_PATH << RUBY_LIB_LOCATION
@@ -78,8 +81,8 @@ CommandParser::CmdParser.new(ARGV) do
78
81
  ########################################################################
79
82
  set :option, CommandParser::OPTIONS + OpenNebulaHelper::CLIENT_OPTIONS
80
83
 
81
- list_options = CLIHelper::OPTIONS
82
- list_options << OpenNebulaHelper::XML
84
+ list_options = CLIHelper::OPTIONS
85
+ list_options += OpenNebulaHelper::FORMAT
83
86
  list_options << OpenNebulaHelper::NUMERIC
84
87
  list_options << OpenNebulaHelper::DESCRIBE
85
88
 
@@ -313,7 +316,8 @@ CommandParser::CmdParser.new(ARGV) do
313
316
  EOT
314
317
 
315
318
  command :show, show_desc, :templateid,
316
- :options => [OpenNebulaHelper::XML, OneTemplateHelper::EXTENDED] do
319
+ :options => [OpenNebulaHelper::FORMAT,
320
+ OneTemplateHelper::EXTENDED] do
317
321
  helper.show_resource(args[0], options)
318
322
  end
319
323
 
data/bin/onevrouter CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  # -------------------------------------------------------------------------- #
4
- # Copyright 2002-2020, OpenNebula Project, OpenNebula Systems #
4
+ # Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
5
5
  # #
6
6
  # Licensed under the Apache License, Version 2.0 (the "License"); you may #
7
7
  # not use this file except in compliance with the License. You may obtain #
@@ -27,9 +27,12 @@ else
27
27
  end
28
28
 
29
29
  if File.directory?(GEMS_LOCATION)
30
- $LOAD_PATH.reject! {|l| l =~ /vendor_ruby/ }
31
- require 'rubygems'
32
- Gem.use_paths(File.realpath(GEMS_LOCATION))
30
+ real_gems_path = File.realpath(GEMS_LOCATION)
31
+ if !defined?(Gem) || Gem.path != [real_gems_path]
32
+ $LOAD_PATH.reject! {|l| l =~ /vendor_ruby/ }
33
+ require 'rubygems'
34
+ Gem.use_paths(real_gems_path)
35
+ end
33
36
  end
34
37
 
35
38
  $LOAD_PATH << RUBY_LIB_LOCATION
@@ -79,8 +82,8 @@ CommandParser::CmdParser.new(ARGV) do
79
82
  ########################################################################
80
83
  set :option, CommandParser::OPTIONS + OpenNebulaHelper::CLIENT_OPTIONS
81
84
 
82
- list_options = CLIHelper::OPTIONS
83
- list_options << OpenNebulaHelper::XML
85
+ list_options = CLIHelper::OPTIONS
86
+ list_options += OpenNebulaHelper::FORMAT
84
87
  list_options << OpenNebulaHelper::NUMERIC
85
88
  list_options << OpenNebulaHelper::DESCRIBE
86
89
 
@@ -339,7 +342,7 @@ CommandParser::CmdParser.new(ARGV) do
339
342
  EOT
340
343
 
341
344
  command :show, show_desc, :vrouterid,
342
- :options => [OpenNebulaHelper::XML, OneVMHelper::ALL_TEMPLATE] do
345
+ :options => [OpenNebulaHelper::FORMAT, OneVMHelper::ALL_TEMPLATE] do
343
346
  helper.show_resource(args[0], options)
344
347
  end
345
348
 
data/bin/onezone CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  # -------------------------------------------------------------------------- #
4
- # Copyright 2002-2020, OpenNebula Project, OpenNebula Systems #
4
+ # Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
5
5
  # #
6
6
  # Licensed under the Apache License, Version 2.0 (the "License"); you may #
7
7
  # not use this file except in compliance with the License. You may obtain #
@@ -27,9 +27,12 @@ else
27
27
  end
28
28
 
29
29
  if File.directory?(GEMS_LOCATION)
30
- $LOAD_PATH.reject! {|l| l =~ /vendor_ruby/ }
31
- require 'rubygems'
32
- Gem.use_paths(File.realpath(GEMS_LOCATION))
30
+ real_gems_path = File.realpath(GEMS_LOCATION)
31
+ if !defined?(Gem) || Gem.path != [real_gems_path]
32
+ $LOAD_PATH.reject! {|l| l =~ /vendor_ruby/ }
33
+ require 'rubygems'
34
+ Gem.use_paths(real_gems_path)
35
+ end
33
36
  end
34
37
 
35
38
  $LOAD_PATH << RUBY_LIB_LOCATION
@@ -54,7 +57,7 @@ CommandParser::CmdParser.new(ARGV) do
54
57
  }
55
58
 
56
59
  DATABASE = {
57
- :name => 'database',
60
+ :name => 'db',
58
61
  :large => '--db',
59
62
  :description => 'Also sync database'
60
63
  }
@@ -68,8 +71,8 @@ CommandParser::CmdParser.new(ARGV) do
68
71
  ########################################################################
69
72
  set :option, CommandParser::OPTIONS + OpenNebulaHelper::CLIENT_OPTIONS
70
73
 
71
- list_options = CLIHelper::OPTIONS
72
- list_options << OpenNebulaHelper::XML
74
+ list_options = CLIHelper::OPTIONS
75
+ list_options += OpenNebulaHelper::FORMAT
73
76
  list_options << OpenNebulaHelper::NUMERIC
74
77
  list_options << OpenNebulaHelper::DESCRIBE
75
78
 
@@ -208,7 +211,7 @@ CommandParser::CmdParser.new(ARGV) do
208
211
  Shows information for the given Zone
209
212
  EOT
210
213
 
211
- command :show, show_desc, :zoneid, :options => OpenNebulaHelper::XML do
214
+ command :show, show_desc, :zoneid, :options => OpenNebulaHelper::FORMAT do
212
215
  helper.show_resource(args[0], options)
213
216
  end
214
217
 
data/lib/cli_helper.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # -------------------------------------------------------------------------- #
2
- # Copyright 2002-2020, OpenNebula Project, OpenNebula Systems #
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 #
@@ -181,7 +181,7 @@ module CLIHelper
181
181
  ANSI_YELLOW = "\33[33m"
182
182
 
183
183
  # CLI states
184
- OK_STATES = %w[runn rdy on configured SUCCESS RUNNING]
184
+ OK_STATES = %w[runn rdy on SUCCESS RUNNING]
185
185
  BAD_STATES = %w[fail
186
186
  err
187
187
  error
@@ -189,7 +189,7 @@ module CLIHelper
189
189
  FAILED_DEPLOYING
190
190
  FAILED_UNDEPLOYING
191
191
  FAILED_SCALING]
192
- REGULAR_STATES = %w[pending WARNING]
192
+ REGULAR_STATES = %w[PENDING DEPLOYING CONFIGURING WARNING]
193
193
 
194
194
  # Set state color
195
195
  #
@@ -211,6 +211,17 @@ module CLIHelper
211
211
  end
212
212
  end
213
213
 
214
+ # Get text in green colour
215
+ #
216
+ # @param text [String] String to print
217
+ def self.green(text)
218
+ if $stdout.tty?
219
+ ANSI_GREEN + text + ANSI_RESET
220
+ else
221
+ text
222
+ end
223
+ end
224
+
214
225
  # Print header
215
226
  #
216
227
  # @param str [String] String with header content
@@ -357,14 +368,14 @@ module CLIHelper
357
368
  # @param options [Hash] Object with CLI user options
358
369
  # @param top [Boolean] True to not update columns again
359
370
  def show(data, options = {}, top = false)
371
+ update_columns(options) unless top
372
+
360
373
  if options[:list]
361
374
  @cli_columns = options[:list].collect {|o| o.upcase.to_sym }
362
375
  else
363
376
  @cli_columns = @default_columns
364
377
  end
365
378
 
366
- update_columns(options) unless top
367
-
368
379
  if data.is_a? Hash
369
380
  @data = data
370
381
 
@@ -599,9 +610,7 @@ module CLIHelper
599
610
  end
600
611
  end
601
612
 
602
- if options
603
- filter_data!(res_data, options) if options[:filter]
604
- end
613
+ filter_data!(res_data, options) if options && options[:filter]
605
614
 
606
615
  res_data
607
616
  end
@@ -1,5 +1,5 @@
1
1
  # -------------------------------------------------------------------------- #
2
- # Copyright 2002-2020, OpenNebula Project, OpenNebula Systems #
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 #
data/lib/one_helper.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # -------------------------------------------------------------------------- #
2
- # Copyright 2002-2020, OpenNebula Project, OpenNebula Systems #
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-2020, OpenNebula Project, OpenNebula Systems
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",
@@ -383,9 +402,15 @@ EOT
383
402
  :format => Array,
384
403
  :description => 'Specify the user inputs values when instantiating',
385
404
  :proc => lambda do |o, options|
405
+ # Store user inputs that has been already processed
406
+ options[:user_inputs_keys] = []
407
+
386
408
  # escape values
387
409
  options[:user_inputs].map! do |user_input|
388
410
  user_input_split = user_input.split('=')
411
+
412
+ options[:user_inputs_keys] << user_input_split[0]
413
+
389
414
  "#{user_input_split[0]}=\"#{user_input_split[1]}\""
390
415
  end
391
416
 
@@ -422,7 +447,9 @@ EOT
422
447
  UPDATECONF_OPTIONS_VM = TEMPLATE_OPTIONS[6..15] + [TEMPLATE_OPTIONS[2],
423
448
  TEMPLATE_OPTIONS[17], TEMPLATE_OPTIONS[18]]
424
449
 
425
- OPTIONS = XML, EXTENDED, NUMERIC, KILOBYTES
450
+ FORMAT = [XML, JSON, YAML]
451
+
452
+ OPTIONS = FORMAT, EXTENDED, NUMERIC, KILOBYTES
426
453
 
427
454
  class OneHelper
428
455
  attr_accessor :client
@@ -519,8 +546,12 @@ EOT
519
546
  @translation_hash = nil
520
547
  end
521
548
 
522
- def set_client(options)
523
- @client=OpenNebulaHelper::OneHelper.get_client(options, true)
549
+ def set_client(options, client=nil)
550
+ if client.nil?
551
+ @client=OpenNebulaHelper::OneHelper.get_client(options, true)
552
+ else
553
+ @client = client
554
+ end
524
555
  end
525
556
 
526
557
  def create_resource(options, &block)
@@ -580,12 +611,10 @@ EOT
580
611
  end
581
612
 
582
613
  def print_page(pool, options)
583
- page = nil
614
+ elements = 0
615
+ page = ""
584
616
 
585
617
  if options[:xml]
586
- elements = 0
587
- page = ""
588
-
589
618
  pool.each {|e|
590
619
  elements += 1
591
620
  page << e.to_xml(true) << "\n"
@@ -594,8 +623,15 @@ EOT
594
623
  pname = pool.pool_name
595
624
  ename = pool.element_name
596
625
 
597
- page = pool.to_hash
598
- elems = page["#{pname}"]["#{ename}"]
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
599
635
 
600
636
  if elems.class == Array
601
637
  elements = elems.length
@@ -616,7 +652,7 @@ EOT
616
652
  size = $stdout.winsize[0] - 1
617
653
 
618
654
  # ----------- First page, check if pager is needed -------------
619
- rc = pool.get_page(size, 0, false)
655
+ rc = pool.get_page(size, 0, false, options[:state])
620
656
  ps = ""
621
657
 
622
658
  return -1, rc.message if OpenNebula.is_error?(rc)
@@ -644,7 +680,7 @@ EOT
644
680
  options[:no_header] = true
645
681
 
646
682
  loop do
647
- rc = pool.get_page(size, current, false)
683
+ rc = pool.get_page(size, current, false, options[:state])
648
684
 
649
685
  return -1, rc.message if OpenNebula.is_error?(rc)
650
686
 
@@ -667,19 +703,19 @@ EOT
667
703
 
668
704
  stop_pager(ppid)
669
705
  else
670
- array = pool.get_hash
671
- return -1, array.message if OpenNebula.is_error?(array)
706
+ rc = pool.info
707
+
708
+ return -1, rc.message if OpenNebula.is_error?(rc)
672
709
 
673
- rname = self.class.rname
674
- elements = array["#{rname}_POOL"][rname]
710
+ _, hash = print_page(pool, options)
675
711
 
676
712
  if options[:ids] && elements
677
- elements.reject! do |element|
713
+ hash.reject! do |element|
678
714
  !options[:ids].include?(element['ID'].to_i)
679
715
  end
680
716
  end
681
717
 
682
- table.show(array, options)
718
+ table.show(hash, options)
683
719
  end
684
720
 
685
721
  return 0
@@ -695,7 +731,7 @@ EOT
695
731
  size = $stdout.winsize[0] - 1
696
732
 
697
733
  # ----------- First page, check if pager is needed -------------
698
- rc = pool.get_page(size, 0, extended)
734
+ rc = pool.get_page(size, 0, extended, options[:state])
699
735
  ps = ""
700
736
 
701
737
  return -1, rc.message if OpenNebula.is_error?(rc)
@@ -730,7 +766,7 @@ EOT
730
766
  current = size
731
767
 
732
768
  loop do
733
- rc = pool.get_page(size, current, extended)
769
+ rc = pool.get_page(size, current, extended, options[:state])
734
770
 
735
771
  return -1, rc.message if OpenNebula.is_error?(rc)
736
772
 
@@ -769,6 +805,82 @@ EOT
769
805
  return 0
770
806
  end
771
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
+
772
884
  #-----------------------------------------------------------------------
773
885
  # List pool table in top-like form
774
886
  #-----------------------------------------------------------------------
@@ -797,11 +909,27 @@ EOT
797
909
  filter_flag ||= OpenNebula::Pool::INFO_ALL
798
910
 
799
911
  pool = factory_pool(filter_flag)
912
+ pname = pool.pool_name
913
+ ename = pool.element_name
800
914
 
801
915
  if top
802
916
  return list_pool_top(table, pool, options)
803
917
  elsif options[:xml]
804
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
805
933
  else
806
934
  return list_pool_table(table, pool, options, filter_flag)
807
935
  end
@@ -845,6 +973,17 @@ EOT
845
973
 
846
974
  if options[:xml]
847
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)
848
987
  else
849
988
  format_resource(resource, options)
850
989
  return 0
@@ -1054,6 +1193,199 @@ EOT
1054
1193
 
1055
1194
  return 0, pool
1056
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
1057
1389
  end
1058
1390
 
1059
1391
  def OpenNebulaHelper.rname_to_id(name, poolname)
@@ -1062,18 +1394,20 @@ EOT
1062
1394
  client=OneHelper.client
1063
1395
 
1064
1396
  pool = case poolname
1065
- when "HOST" then OpenNebula::HostPool.new(client)
1066
- when "HOOK" then OpenNebula::HookPool.new(client)
1067
- when "GROUP" then OpenNebula::GroupPool.new(client)
1068
- when "USER" then OpenNebula::UserPool.new(client)
1069
- when "DATASTORE" then OpenNebula::DatastorePool.new(client)
1070
- when "CLUSTER" then OpenNebula::ClusterPool.new(client)
1071
- when "VNET" then OpenNebula::VirtualNetworkPool.new(client)
1072
- when "IMAGE" then OpenNebula::ImagePool.new(client)
1073
- when "VMTEMPLATE" then OpenNebula::TemplatePool.new(client)
1074
- when "VM" then OpenNebula::VirtualMachinePool.new(client)
1075
- when "ZONE" then OpenNebula::ZonePool.new(client)
1076
- when "MARKETPLACE" then OpenNebula::MarketPlacePool.new(client)
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)
1077
1411
  end
1078
1412
 
1079
1413
  rc = pool.info
@@ -1259,6 +1593,43 @@ EOT
1259
1593
  end
1260
1594
  end
1261
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
+
1262
1633
  def OpenNebulaHelper.editor_input(contents=nil)
1263
1634
  require 'tempfile'
1264
1635
 
@@ -1705,8 +2076,8 @@ EOT
1705
2076
  end
1706
2077
  end
1707
2078
 
1708
- def OpenNebulaHelper.parse_user_inputs(inputs, get_defaults = false)
1709
- unless get_defaults
2079
+ def OpenNebulaHelper.parse_user_inputs(inputs, keys = [])
2080
+ unless inputs.keys == keys
1710
2081
  puts 'There are some parameters that require user input. ' \
1711
2082
  'Use the string <<EDITOR>> to launch an editor ' \
1712
2083
  '(e.g. for multi-line inputs)'
@@ -1715,6 +2086,8 @@ EOT
1715
2086
  answers = {}
1716
2087
 
1717
2088
  inputs.each do |key, val|
2089
+ next if keys.include? key
2090
+
1718
2091
  input_cfg = val.split('|', -1)
1719
2092
 
1720
2093
  if input_cfg.length < 3
@@ -1741,11 +2114,6 @@ EOT
1741
2114
  initial.strip!
1742
2115
  end
1743
2116
 
1744
- if get_defaults
1745
- answers[key]= initial unless mandatory == 'M'
1746
- next
1747
- end
1748
-
1749
2117
  puts " * (#{key}) #{description}"
1750
2118
 
1751
2119
  header = ' '