opennebula-cli 5.10.5 → 5.12.0.1

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 (54) hide show
  1. checksums.yaml +4 -4
  2. data/bin/oneacct +4 -2
  3. data/bin/oneacl +4 -2
  4. data/bin/onecluster +4 -2
  5. data/bin/onedatastore +4 -2
  6. data/bin/oneflow +151 -552
  7. data/bin/oneflow-template +173 -293
  8. data/bin/onegroup +4 -2
  9. data/bin/onehook +4 -2
  10. data/bin/onehost +78 -10
  11. data/bin/oneimage +4 -2
  12. data/bin/onemarket +4 -2
  13. data/bin/onemarketapp +17 -4
  14. data/bin/onesecgroup +4 -2
  15. data/bin/oneshowback +4 -2
  16. data/bin/onetemplate +4 -2
  17. data/bin/oneuser +4 -2
  18. data/bin/onevcenter +4 -2
  19. data/bin/onevdc +4 -2
  20. data/bin/onevm +90 -17
  21. data/bin/onevmgroup +4 -2
  22. data/bin/onevnet +13 -4
  23. data/bin/onevntemplate +4 -2
  24. data/bin/onevrouter +4 -2
  25. data/bin/onezone +7 -2
  26. data/lib/cli_helper.rb +54 -30
  27. data/lib/command_parser.rb +33 -14
  28. data/lib/one_helper.rb +258 -6
  29. data/lib/one_helper/oneacct_helper.rb +1 -1
  30. data/lib/one_helper/oneacl_helper.rb +1 -1
  31. data/lib/one_helper/onecluster_helper.rb +4 -4
  32. data/lib/one_helper/onedatastore_helper.rb +1 -1
  33. data/lib/one_helper/oneflow_helper.rb +419 -0
  34. data/lib/one_helper/oneflowtemplate_helper.rb +312 -0
  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 +148 -68
  38. data/lib/one_helper/oneimage_helper.rb +2 -2
  39. data/lib/one_helper/onemarket_helper.rb +1 -1
  40. data/lib/one_helper/onemarketapp_helper.rb +1 -1
  41. data/lib/one_helper/oneprovision_helper.rb +104 -60
  42. data/lib/one_helper/onequota_helper.rb +1 -1
  43. data/lib/one_helper/onesecgroup_helper.rb +1 -1
  44. data/lib/one_helper/onetemplate_helper.rb +9 -180
  45. data/lib/one_helper/oneuser_helper.rb +1 -1
  46. data/lib/one_helper/onevcenter_helper.rb +2 -1
  47. data/lib/one_helper/onevdc_helper.rb +1 -1
  48. data/lib/one_helper/onevm_helper.rb +11 -6
  49. data/lib/one_helper/onevmgroup_helper.rb +1 -1
  50. data/lib/one_helper/onevnet_helper.rb +1 -1
  51. data/lib/one_helper/onevntemplate_helper.rb +1 -1
  52. data/lib/one_helper/onevrouter_helper.rb +1 -1
  53. data/lib/one_helper/onezone_helper.rb +3 -1
  54. metadata +15 -13
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  # -------------------------------------------------------------------------- #
4
- # Copyright 2002-2019, OpenNebula Project, OpenNebula Systems #
4
+ # Copyright 2002-2020, 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,7 +27,9 @@ else
27
27
  end
28
28
 
29
29
  if File.directory?(GEMS_LOCATION)
30
- Gem.use_paths(GEMS_LOCATION)
30
+ $LOAD_PATH.reject! {|l| l =~ /vendor_ruby/ }
31
+ require 'rubygems'
32
+ Gem.use_paths(File.realpath(GEMS_LOCATION))
31
33
  end
32
34
 
33
35
  $LOAD_PATH << RUBY_LIB_LOCATION
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  # -------------------------------------------------------------------------- #
4
- # Copyright 2002-2019, OpenNebula Project, OpenNebula Systems #
4
+ # Copyright 2002-2020, 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,7 +27,9 @@ else
27
27
  end
28
28
 
29
29
  if File.directory?(GEMS_LOCATION)
30
- Gem.use_paths(GEMS_LOCATION)
30
+ $LOAD_PATH.reject! {|l| l =~ /vendor_ruby/ }
31
+ require 'rubygems'
32
+ Gem.use_paths(File.realpath(GEMS_LOCATION))
31
33
  end
32
34
 
33
35
  $LOAD_PATH << RUBY_LIB_LOCATION
@@ -71,6 +73,13 @@ CommandParser::CmdParser.new(ARGV) do
71
73
  :description => 'lock all actions'
72
74
  }
73
75
 
76
+ FORCE = {
77
+ :name => 'force',
78
+ :large => '--force',
79
+ :description => 'Force execution of action, ' \
80
+ 'bypass the consistency checks'
81
+ }
82
+
74
83
  ########################################################################
75
84
  # Global Options
76
85
  ########################################################################
@@ -169,9 +178,9 @@ CommandParser::CmdParser.new(ARGV) do
169
178
  Removes an address range from the Virtual Network
170
179
  EOT
171
180
 
172
- command :rmar, rmar_desc, :vnetid, :ar_id do
181
+ command :rmar, rmar_desc, :vnetid, :ar_id, :options => FORCE do
173
182
  helper.perform_action(args[0], options, 'address range removed') do |vn|
174
- vn.rm_ar(args[1])
183
+ vn.rm_ar(args[1], options[:force] || false)
175
184
  end
176
185
  end
177
186
 
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  # -------------------------------------------------------------------------- #
4
- # Copyright 2002-2019, OpenNebula Project, OpenNebula Systems #
4
+ # Copyright 2002-2020, 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,7 +27,9 @@ else
27
27
  end
28
28
 
29
29
  if File.directory?(GEMS_LOCATION)
30
- Gem.use_paths(GEMS_LOCATION)
30
+ $LOAD_PATH.reject! {|l| l =~ /vendor_ruby/ }
31
+ require 'rubygems'
32
+ Gem.use_paths(File.realpath(GEMS_LOCATION))
31
33
  end
32
34
 
33
35
  $LOAD_PATH << RUBY_LIB_LOCATION
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  # -------------------------------------------------------------------------- #
4
- # Copyright 2002-2019, OpenNebula Project, OpenNebula Systems #
4
+ # Copyright 2002-2020, 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,7 +27,9 @@ else
27
27
  end
28
28
 
29
29
  if File.directory?(GEMS_LOCATION)
30
- Gem.use_paths(GEMS_LOCATION)
30
+ $LOAD_PATH.reject! {|l| l =~ /vendor_ruby/ }
31
+ require 'rubygems'
32
+ Gem.use_paths(File.realpath(GEMS_LOCATION))
31
33
  end
32
34
 
33
35
  $LOAD_PATH << RUBY_LIB_LOCATION
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  # -------------------------------------------------------------------------- #
4
- # Copyright 2002-2019, OpenNebula Project, OpenNebula Systems #
4
+ # Copyright 2002-2020, 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,7 +27,9 @@ else
27
27
  end
28
28
 
29
29
  if File.directory?(GEMS_LOCATION)
30
- Gem.use_paths(GEMS_LOCATION)
30
+ $LOAD_PATH.reject! {|l| l =~ /vendor_ruby/ }
31
+ require 'rubygems'
32
+ Gem.use_paths(File.realpath(GEMS_LOCATION))
31
33
  end
32
34
 
33
35
  $LOAD_PATH << RUBY_LIB_LOCATION
@@ -230,6 +232,9 @@ CommandParser::CmdParser.new(ARGV) do
230
232
 
231
233
  command :serversync, sync_desc, :server, :options => [DATABASE] do
232
234
  begin
235
+ # Suppress augeas require warning message
236
+ $VERBOSE = nil
237
+
233
238
  gem 'augeas', '~> 0.6'
234
239
  require 'augeas'
235
240
  rescue Gem::LoadError
@@ -1,5 +1,5 @@
1
1
  # -------------------------------------------------------------------------- #
2
- # Copyright 2002-2019, OpenNebula Project, OpenNebula Systems #
2
+ # Copyright 2002-2020, 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,9 +181,15 @@ module CLIHelper
181
181
  ANSI_YELLOW = "\33[33m"
182
182
 
183
183
  # CLI states
184
- OK_STATES = %w[runn rdy on configured SUCCESS]
185
- BAD_STATES = %w[fail err error ERROR]
186
- REGULAR_STATES = %w[pending]
184
+ OK_STATES = %w[runn rdy on configured SUCCESS RUNNING]
185
+ BAD_STATES = %w[fail
186
+ err
187
+ error
188
+ ERROR
189
+ FAILED_DEPLOYING
190
+ FAILED_UNDEPLOYING
191
+ FAILED_SCALING]
192
+ REGULAR_STATES = %w[pending WARNING]
187
193
 
188
194
  # Set state color
189
195
  #
@@ -350,6 +356,12 @@ module CLIHelper
350
356
  # @param options [Hash] Object with CLI user options
351
357
  # @param top [Boolean] True to not update columns again
352
358
  def show(data, options = {}, top = false)
359
+ if options[:list]
360
+ @cli_columns = options[:list].collect {|o| o.upcase.to_sym }
361
+ else
362
+ @cli_columns = @default_columns
363
+ end
364
+
353
365
  update_columns(options) unless top
354
366
 
355
367
  if data.is_a? Hash
@@ -471,7 +483,7 @@ module CLIHelper
471
483
 
472
484
  # Get header in string format
473
485
  def header_str
474
- @default_columns.collect do |c|
486
+ @cli_columns.collect do |c|
475
487
  if @columns[c]
476
488
  format_str(c, c.to_s)
477
489
  else
@@ -489,12 +501,12 @@ module CLIHelper
489
501
 
490
502
  update_columns_size(options)
491
503
 
504
+ options[:csv_del] ? del = options[:csv_del] : del = ','
505
+
492
506
  if !options[:csv] && (!options.key? :no_header)
493
507
  CLIHelper.print_header(header_str)
494
- end
495
-
496
- if options[:csv] && (!options.key? :no_header)
497
- print_csv_data([@default_columns], options[:csv_del])
508
+ elsif options[:csv] && (!options.key? :no_header)
509
+ puts CSV.generate_line(@cli_columns, :col_sep => del)
498
510
  end
499
511
 
500
512
  @res_data ? print_data(@res_data, options) : puts
@@ -522,7 +534,13 @@ module CLIHelper
522
534
  del ? del = del : del = ','
523
535
 
524
536
  data.each do |l|
525
- puts CSV.generate_line(l, :col_sep => del)
537
+ result = []
538
+
539
+ @cli_columns.each do |col|
540
+ result << l[@default_columns.index(col)]
541
+ end
542
+
543
+ puts CSV.generate_line(result, :col_sep => del)
526
544
  end
527
545
  end
528
546
 
@@ -531,25 +549,26 @@ module CLIHelper
531
549
  # @param data [Array] Array with data to show
532
550
  # @param stat_column [String] Name of the state column
533
551
  def print_normal_data(data, stat_column)
534
- ncolumns = @default_columns.length
535
-
536
552
  if stat_column
537
- stat = stat_column.upcase.to_sym
538
- stat_column = @default_columns.index(stat)
553
+ stat = stat_column.upcase.to_sym
539
554
  else
540
- stat_column = @default_columns.index(:STAT)
555
+ stat = :STAT
541
556
  end
542
557
 
543
558
  data.each do |l|
544
559
  result = []
545
560
 
546
- ncolumns.times do |i|
561
+ @cli_columns.each do |col|
562
+ i = @default_columns.index(col)
563
+
564
+ # Column might not exist
565
+ next unless i
566
+
547
567
  dat = l[i]
548
- col = @default_columns[i]
549
568
 
550
569
  str = format_str(col, dat)
551
570
 
552
- str = CLIHelper.color_state(str) if i == stat_column
571
+ str = CLIHelper.color_state(str) if col == stat
553
572
 
554
573
  result << str
555
574
  end
@@ -564,8 +583,17 @@ module CLIHelper
564
583
  #
565
584
  # @return [Array] Array with selected columns information
566
585
  def data_array(data, options)
586
+ # Take default table columns and desired ones by the user
587
+ cols = @default_columns
588
+
589
+ @cli_columns.each do |col|
590
+ next if @default_columns.include?(col)
591
+
592
+ @default_columns.insert(@cli_columns.index(col) + 1, col)
593
+ end
594
+
567
595
  res_data = data.collect do |d|
568
- @default_columns.collect do |c|
596
+ cols.collect do |c|
569
597
  @columns[c][:proc].call(d).to_s if @columns[c]
570
598
  end
571
599
  end
@@ -602,7 +630,7 @@ module CLIHelper
602
630
  def config_expand_data
603
631
  ret = []
604
632
 
605
- @default_columns.each do |column|
633
+ @cli_columns.each do |column|
606
634
  expand_c = @columns[column][:expand]
607
635
 
608
636
  next unless expand_c
@@ -623,7 +651,7 @@ module CLIHelper
623
651
  def config_adjust_data
624
652
  ret = []
625
653
 
626
- @default_columns.each do |column|
654
+ @cli_columns.each do |column|
627
655
  next unless @columns[column][:adjust]
628
656
 
629
657
  ret << column.to_s.downcase
@@ -647,13 +675,13 @@ module CLIHelper
647
675
 
648
676
  return if terminal_size.nil?
649
677
 
650
- default_columns = columns_info(@default_columns)
678
+ default_columns = columns_info(@cli_columns)
651
679
  expand_columns = columns_info(expand_columns)
652
680
 
653
681
  total_size = total_columns_size(default_columns)
654
682
  columns_size = total_columns_size(expand_columns)
655
683
 
656
- terminal_size -= (@default_columns.size - 1)
684
+ terminal_size -= (@cli_columns.size - 1)
657
685
  left_size = terminal_size - total_size
658
686
  remaining_size = left_size
659
687
 
@@ -725,7 +753,7 @@ module CLIHelper
725
753
  expand_data = []
726
754
 
727
755
  if expand_all
728
- expand_data = @default_columns
756
+ expand_data = @cli_columns
729
757
  elsif expand
730
758
  expand_data += options[:expand]
731
759
  end
@@ -739,7 +767,7 @@ module CLIHelper
739
767
  unless expand_all
740
768
  adjust.each do |column|
741
769
  column = column.upcase.to_sym
742
- size = max_size(@default_columns.index(column))
770
+ size = max_size(@cli_columns.index(column))
743
771
 
744
772
  if size && size > @columns[column][:size]
745
773
  @columns[column][:adjust] = true
@@ -791,10 +819,6 @@ module CLIHelper
791
819
  rescue StandardError => e
792
820
  CLIHelper.fail(e.message)
793
821
  end
794
-
795
- return unless options[:list]
796
-
797
- @default_columns = options[:list].collect {|o| o.upcase.to_sym }
798
822
  end
799
823
 
800
824
  # Filter data
@@ -815,7 +839,7 @@ module CLIHelper
815
839
  m = s.match(/^(.*?)#{operators}(.*?)$/)
816
840
 
817
841
  if m
818
- index = @default_columns.index(m[1].to_sym)
842
+ index = @default_columns.index(m[1].upcase.to_sym)
819
843
 
820
844
  if index
821
845
  {
@@ -1,5 +1,5 @@
1
1
  # -------------------------------------------------------------------------- #
2
- # Copyright 2002-2019, OpenNebula Project, OpenNebula Systems #
2
+ # Copyright 2002-2020, 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 #
@@ -140,6 +140,7 @@ module CommandParser
140
140
  # @option options [String] :name
141
141
  # @option options [String] :short
142
142
  # @option options [String] :large
143
+ # @option options [Boolean] :multiple
143
144
  # @option options [String] :description
144
145
  # @option options [Class] :format
145
146
  # @option options [Block] :proc The block receives the value of the
@@ -452,7 +453,7 @@ module CommandParser
452
453
 
453
454
  if comm.nil?
454
455
  print_help
455
- exit -1
456
+ exit 0
456
457
  end
457
458
 
458
459
  if comm[:deprecated]
@@ -463,16 +464,27 @@ module CommandParser
463
464
  parse(extra_options)
464
465
 
465
466
  if comm
466
- @before_proc.call if @before_proc
467
+ begin
468
+ @before_proc.call if @before_proc
469
+ rescue StandardError => e
470
+ STDERR.puts e.message
471
+ exit(-1)
472
+ end
467
473
 
468
474
  check_args!(comm_name, comm[:arity], comm[:args_format])
469
475
 
470
- rc = comm[:proc].call
471
- if rc.instance_of?(Array)
472
- puts rc[1]
473
- exit rc.first
474
- else
475
- exit(@exit_code || rc)
476
+ begin
477
+ rc = comm[:proc].call
478
+
479
+ if rc.instance_of?(Array)
480
+ puts rc[1]
481
+ exit rc.first
482
+ else
483
+ exit(@exit_code || rc)
484
+ end
485
+ rescue StandardError => e
486
+ STDERR.puts e.message
487
+ exit(-1)
476
488
  end
477
489
  end
478
490
  end
@@ -490,21 +502,28 @@ module CommandParser
490
502
  args = []
491
503
  args << e[:short] if e[:short]
492
504
  args << e[:large]
505
+ args << e[:multiple] if e[:multiple]
493
506
  args << e[:format]
494
507
  args << e[:description]
495
508
 
496
509
  opts.on(*args) do |o|
497
- if e[:proc]
510
+ if e[:proc] && !e[:multiple]
498
511
  @options[e[:name].to_sym]=o
499
512
  with_proc<<e
500
513
  elsif e[:name]=="help"
501
514
  print_help
502
- exit
515
+ exit 0
503
516
  elsif e[:name]=="version"
504
517
  puts @version
505
- exit
506
- else
518
+ exit 0
519
+ elsif !e[:multiple]
507
520
  @options[e[:name].to_sym]=o
521
+ else
522
+ if @options[e[:name].to_sym].nil?
523
+ @options[e[:name].to_sym] = []
524
+ end
525
+
526
+ @options[e[:name].to_sym] << o
508
527
  end
509
528
  end
510
529
  end
@@ -630,7 +649,7 @@ module CommandParser
630
649
  print_formatters
631
650
  puts
632
651
  if @version
633
- puts "## LICENSE"
652
+ puts "## VERSION"
634
653
  puts @version
635
654
  end
636
655
  end
@@ -1,5 +1,5 @@
1
1
  # -------------------------------------------------------------------------- #
2
- # Copyright 2002-2019, OpenNebula Project, OpenNebula Systems #
2
+ # Copyright 2002-2020, 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,11 +30,7 @@ include OpenNebula
30
30
  module OpenNebulaHelper
31
31
  ONE_VERSION=<<-EOT
32
32
  OpenNebula #{OpenNebula::VERSION}
33
- Copyright 2002-2019, OpenNebula Project, OpenNebula Systems
34
-
35
- Licensed under the Apache License, Version 2.0 (the "License"); you may
36
- not use this file except in compliance with the License. You may obtain
37
- a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
33
+ Copyright 2002-2020, OpenNebula Project, OpenNebula Systems
38
34
  EOT
39
35
 
40
36
  if ONE_LOCATION
@@ -1203,6 +1199,18 @@ EOT
1203
1199
  end
1204
1200
  end
1205
1201
 
1202
+ def OpenNebulaHelper.bytes_to_unit(value, unit = 'K')
1203
+ j = 0
1204
+ i = BinarySufix.index(unit).to_i
1205
+
1206
+ while j < i do
1207
+ value /= 1024.0
1208
+ j += 1
1209
+ end
1210
+
1211
+ value
1212
+ end
1213
+
1206
1214
  # If the cluster name is empty, returns a '-' char.
1207
1215
  #
1208
1216
  # @param str [String || Hash] Cluster name, or empty Hash (when <CLUSTER/>)
@@ -1696,4 +1704,248 @@ EOT
1696
1704
  "-"
1697
1705
  end
1698
1706
  end
1707
+
1708
+ def OpenNebulaHelper.parse_user_inputs(inputs, get_defaults = false)
1709
+ unless get_defaults
1710
+ puts 'There are some parameters that require user input. ' \
1711
+ 'Use the string <<EDITOR>> to launch an editor ' \
1712
+ '(e.g. for multi-line inputs)'
1713
+ end
1714
+
1715
+ answers = {}
1716
+
1717
+ inputs.each do |key, val|
1718
+ input_cfg = val.split('|', -1)
1719
+
1720
+ if input_cfg.length < 3
1721
+ STDERR.puts 'Malformed user input. It should have at least 3 '\
1722
+ "parts separated by '|':"
1723
+ STDERR.puts " #{key}: #{val}"
1724
+ exit(-1)
1725
+ end
1726
+
1727
+ mandatory, type, description, params, initial = input_cfg
1728
+ optional = mandatory.strip == 'O'
1729
+ type.strip!
1730
+ description.strip!
1731
+
1732
+ if input_cfg.length > 3
1733
+ if input_cfg.length != 5
1734
+ STDERR.puts 'Malformed user input. It should have 5 parts'\
1735
+ " separated by '|':"
1736
+ STDERR.puts " #{key}: #{val}"
1737
+ exit(-1)
1738
+ end
1739
+
1740
+ params.strip!
1741
+ initial.strip!
1742
+ end
1743
+
1744
+ if get_defaults
1745
+ answers[key]= initial unless mandatory == 'M'
1746
+ next
1747
+ end
1748
+
1749
+ puts " * (#{key}) #{description}"
1750
+
1751
+ header = ' '
1752
+ if !initial.nil? && initial != ''
1753
+ header += "Press enter for default (#{initial}). "
1754
+ end
1755
+
1756
+ case type
1757
+ when 'text', 'text64'
1758
+ print header
1759
+
1760
+ answer = STDIN.readline.chop
1761
+
1762
+ if answer == '<<EDITOR>>'
1763
+ answer = OpenNebulaHelper.editor_input
1764
+ end
1765
+
1766
+ # use default in case it's empty
1767
+ answer = initial if answer.empty?
1768
+
1769
+ if type == 'text64'
1770
+ answer = Base64.encode64(answer).strip.delete("\n")
1771
+ end
1772
+
1773
+ when 'boolean'
1774
+ print header
1775
+
1776
+ answer = STDIN.readline.chop
1777
+
1778
+ # use default in case it's empty
1779
+ answer = initial if answer.empty?
1780
+
1781
+ unless %w[YES NO].include?(answer)
1782
+ STDERR.puts "Invalid boolean '#{answer}'"
1783
+ STDERR.puts 'Boolean has to be YES or NO'
1784
+ exit(-1)
1785
+ end
1786
+
1787
+ when 'password'
1788
+ print header
1789
+
1790
+ answer = OpenNebulaHelper::OneHelper.get_password
1791
+
1792
+ # use default in case it's empty
1793
+ answer = initial if answer.empty?
1794
+
1795
+ when 'number', 'number-float'
1796
+ if type == 'number'
1797
+ header += 'Integer: '
1798
+ exp = INT_EXP
1799
+ else
1800
+ header += 'Float: '
1801
+ exp = FLOAT_EXP
1802
+ end
1803
+
1804
+ begin
1805
+ print header
1806
+ answer = STDIN.readline.chop
1807
+
1808
+ answer = initial if answer == ''
1809
+ noanswer = ((answer == '') && optional)
1810
+ end while !noanswer && (answer =~ exp) == nil
1811
+
1812
+ if noanswer
1813
+ next
1814
+ end
1815
+
1816
+ when 'range', 'range-float'
1817
+ min, max = params.split('..')
1818
+
1819
+ if min.nil? || max.nil?
1820
+ STDERR.puts 'Malformed user input. '\
1821
+ "Parameters should be 'min..max':"
1822
+ STDERR.puts " #{key}: #{val}"
1823
+ exit(-1)
1824
+ end
1825
+
1826
+ if type == 'range'
1827
+ exp = INT_EXP
1828
+ min = min.to_i
1829
+ max = max.to_i
1830
+
1831
+ header += "Integer in the range [#{min}..#{max}]: "
1832
+ else
1833
+ exp = FLOAT_EXP
1834
+ min = min.to_f
1835
+ max = max.to_f
1836
+
1837
+ header += "Float in the range [#{min}..#{max}]: "
1838
+ end
1839
+
1840
+ begin
1841
+ print header
1842
+ answer = STDIN.readline.chop
1843
+
1844
+ answer = initial if answer == ''
1845
+
1846
+ noanswer = (answer == '') && optional
1847
+ end while !noanswer && ((answer =~ exp) == nil ||
1848
+ answer.to_f < min || answer.to_f > max)
1849
+
1850
+ if noanswer
1851
+ next
1852
+ end
1853
+
1854
+ when 'list'
1855
+ options = params.split(',')
1856
+
1857
+ options.each_with_index do |opt, i|
1858
+ puts " #{i} #{opt}"
1859
+ end
1860
+
1861
+ puts
1862
+
1863
+ header += 'Please type the selection number: '
1864
+
1865
+ begin
1866
+ print header
1867
+ answer = STDIN.readline.chop
1868
+
1869
+ if answer == ''
1870
+ answer = initial
1871
+ else
1872
+ answer = options[answer.to_i]
1873
+ end
1874
+
1875
+ noanswer = ((answer == '') && optional)
1876
+ end while !noanswer && !options.include?(answer)
1877
+
1878
+ if noanswer
1879
+ next
1880
+ end
1881
+
1882
+ when 'fixed'
1883
+ puts " Fixed value of (#{initial}). Cannot be changed"
1884
+ answer = initial
1885
+
1886
+ else
1887
+ STDERR.puts 'Wrong type for user input:'
1888
+ STDERR.puts " #{key}: #{val}"
1889
+ exit(-1)
1890
+ end
1891
+
1892
+ answers[key] = answer
1893
+ end
1894
+
1895
+ answers
1896
+ end
1897
+
1898
+ # Returns plot object to print it on the CLI
1899
+ #
1900
+ # @param x [Array] Data to x axis (Time axis)
1901
+ # @param y [Array] Data to y axis
1902
+ # @param attr [String] Parameter to y axis
1903
+ # @param title [String] Plot title
1904
+ #
1905
+ # @return Gnuplot plot object
1906
+ def OpenNebulaHelper.get_plot(x, y, attr, title)
1907
+ # Require gnuplot gem only here
1908
+ begin
1909
+ require 'gnuplot'
1910
+ rescue LoadError, Gem::LoadError
1911
+ STDERR.puts(
1912
+ 'Gnuplot gem is not installed, run `gem install gnuplot` '\
1913
+ 'to install it'
1914
+ )
1915
+ exit(-1)
1916
+ end
1917
+
1918
+ # Check if gnuplot is installed on the system
1919
+ unless system('gnuplot --version')
1920
+ STDERR.puts(
1921
+ 'Gnuplot is not installed, install it depending on your distro'
1922
+ )
1923
+ exit(-1)
1924
+ end
1925
+
1926
+ Gnuplot.open do |gp|
1927
+ Gnuplot::Plot.new(gp) do |p|
1928
+ p.title title
1929
+
1930
+ p.xlabel 'Time'
1931
+ p.ylabel attr
1932
+
1933
+ p.xdata 'time'
1934
+ p.timefmt "'%H:%M'"
1935
+ p.format "x '%H:%M'"
1936
+
1937
+ p.style 'data lines'
1938
+ p.terminal 'dumb'
1939
+
1940
+ p.data << Gnuplot::DataSet.new([x, y]) do |ds|
1941
+ ds.with = 'linespoints'
1942
+ ds.linewidth = '3'
1943
+ ds.using = '1:2'
1944
+
1945
+ ds.notitle
1946
+ end
1947
+ end
1948
+ end
1949
+ end
1950
+
1699
1951
  end