opennebula-cli 6.6.1 → 6.6.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/lib/one_helper.rb CHANGED
@@ -21,27 +21,28 @@ require 'io/console'
21
21
  begin
22
22
  require 'opennebula'
23
23
  rescue Exception => e
24
- puts "Error: "+e.message.to_s
24
+ puts 'Error: '+e.message.to_s
25
25
  exit(-1)
26
26
  end
27
27
 
28
28
  include OpenNebula
29
29
 
30
30
  module OpenNebulaHelper
31
- ONE_VERSION=<<-EOT
32
- OpenNebula #{OpenNebula::VERSION}
33
- Copyright 2002-2023, OpenNebula Project, OpenNebula Systems
34
- EOT
31
+
32
+ ONE_VERSION=<<~EOT
33
+ OpenNebula #{OpenNebula::VERSION}
34
+ Copyright 2002-2023, OpenNebula Project, OpenNebula Systems
35
+ EOT
35
36
 
36
37
  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"
38
+ TABLE_CONF_PATH = ONE_LOCATION + '/etc/cli'
39
+ VAR_LOCATION = ONE_LOCATION + '/var' unless defined?(VAR_LOCATION)
40
+ CLI_ADDONS_LOCATION = ONE_LOCATION + '/lib/ruby/cli/addons'
40
41
  XSD_PATH = ONE_LOCATION + '/share/schemas/xsd'
41
42
  else
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"
43
+ TABLE_CONF_PATH = '/etc/one/cli'
44
+ VAR_LOCATION = '/var/lib/one' unless defined?(VAR_LOCATION)
45
+ CLI_ADDONS_LOCATION = '/usr/lib/one/ruby/cli/addons'
45
46
  XSD_PATH = '/usr/share/one/schemas/xsd'
46
47
  end
47
48
 
@@ -51,10 +52,10 @@ EOT
51
52
  # Options
52
53
  ########################################################################
53
54
  XML={
54
- :name => "xml",
55
- :short => "-x",
56
- :large => "--xml",
57
- :description => "Show the resource in xml format"
55
+ :name => 'xml',
56
+ :short => '-x',
57
+ :large => '--xml',
58
+ :description => 'Show the resource in xml format'
58
59
  }
59
60
 
60
61
  JSON = {
@@ -75,30 +76,30 @@ EOT
75
76
  }
76
77
 
77
78
  NUMERIC={
78
- :name => "numeric",
79
- :short => "-n",
80
- :large => "--numeric",
81
- :description => "Do not translate user and group IDs"
79
+ :name => 'numeric',
80
+ :short => '-n',
81
+ :large => '--numeric',
82
+ :description => 'Do not translate user and group IDs'
82
83
  }
83
84
 
84
85
  KILOBYTES={
85
- :name => "kilobytes",
86
- :short => "-k",
87
- :large => "--kilobytes",
88
- :description => "Show units in kilobytes"
86
+ :name => 'kilobytes',
87
+ :short => '-k',
88
+ :large => '--kilobytes',
89
+ :description => 'Show units in kilobytes'
89
90
  }
90
91
 
91
92
  DESCRIBE={
92
- :name => "describe",
93
- :large => "--describe",
94
- :description => "Describe list columns"
93
+ :name => 'describe',
94
+ :large => '--describe',
95
+ :description => 'Describe list columns'
95
96
  }
96
97
 
97
98
  APPEND = {
98
- :name => "append",
99
- :short => "-a",
100
- :large => "--append",
101
- :description => "Append new attributes to the current template"
99
+ :name => 'append',
100
+ :short => '-a',
101
+ :large => '--append',
102
+ :description => 'Append new attributes to the current template'
102
103
  }
103
104
 
104
105
  # Command line VM template options
@@ -122,7 +123,7 @@ EOT
122
123
  :large => '--user name',
123
124
  :description => 'User name used to connect to OpenNebula',
124
125
  :format => String,
125
- :proc => lambda do |o, options|
126
+ :proc => lambda do |o, _options|
126
127
  OneHelper.set_user(o)
127
128
  [0, o]
128
129
  end
@@ -132,7 +133,7 @@ EOT
132
133
  :large => '--password password',
133
134
  :description => 'Password to authenticate with OpenNebula',
134
135
  :format => String,
135
- :proc => lambda do |o, options|
136
+ :proc => lambda do |o, _options|
136
137
  OneHelper.set_password(o)
137
138
  [0, o]
138
139
  end
@@ -142,7 +143,7 @@ EOT
142
143
  :large => '--endpoint endpoint',
143
144
  :description => 'URL of OpenNebula xmlrpc frontend',
144
145
  :format => String,
145
- :proc => lambda do |o, options|
146
+ :proc => lambda do |o, _options|
146
147
  OneHelper.set_endpoint(o)
147
148
  [0, o]
148
149
  end
@@ -153,7 +154,7 @@ EOT
153
154
  {
154
155
  :name => 'name',
155
156
  :large => '--name name',
156
- :short => "-n",
157
+ :short => '-n',
157
158
  :description =>
158
159
  'Name for the new group',
159
160
  :format => String
@@ -161,7 +162,7 @@ EOT
161
162
  {
162
163
  :name => 'admin_user',
163
164
  :large => '--admin_user name',
164
- :short => "-u",
165
+ :short => '-u',
165
166
  :description =>
166
167
  'Creates an admin user for the group with name',
167
168
  :format => String
@@ -169,7 +170,7 @@ EOT
169
170
  {
170
171
  :name => 'admin_password',
171
172
  :large => '--admin_password pass',
172
- :short => "-p",
173
+ :short => '-p',
173
174
  :description =>
174
175
  'Password for the admin user of the group',
175
176
  :format => String
@@ -177,7 +178,7 @@ EOT
177
178
  {
178
179
  :name => 'admin_driver',
179
180
  :large => '--admin_driver driver',
180
- :short => "-d",
181
+ :short => '-d',
181
182
  :description =>
182
183
  'Auth driver for the admin user of the group',
183
184
  :format => String
@@ -185,43 +186,43 @@ EOT
185
186
  {
186
187
  :name => 'resources',
187
188
  :large => '--resources res_str',
188
- :short => "-r",
189
+ :short => '-r',
189
190
  :description =>
190
- "Which resources can be created by group users "<<
191
- "(VM+NET+IMAGE+TEMPLATE by default)",
191
+ 'Which resources can be created by group users '<<
192
+ '(VM+NET+IMAGE+TEMPLATE by default)',
192
193
  :format => String
193
194
  }
194
195
  ]
195
196
 
196
197
  AS_USER = {
197
- :name => 'as_uid',
198
+ :name => 'as_uid',
198
199
  :large => '--as_uid uid',
199
200
  :format => Integer,
200
201
  :description => 'The User ID to instantiate the VM'
201
202
  }
202
203
 
203
204
  AS_GROUP = {
204
- :name => 'as_gid',
205
+ :name => 'as_gid',
205
206
  :large => '--as_gid gid',
206
207
  :format => Integer,
207
208
  :description => 'The Group ID to instantiate the VM'
208
209
  }
209
210
 
210
- #NOTE: Other options defined using this array, add new options at the end
211
+ # NOTE: Other options defined using this array, add new options at the end
211
212
  TEMPLATE_OPTIONS=[
212
213
  {
213
214
  :name => 'cpu',
214
215
  :large => '--cpu cpu',
215
216
  :description =>
216
217
  "CPU percentage reserved for the VM (1=100% one\n"<<
217
- " "*31<<"CPU)",
218
+ ' '*31<<'CPU)',
218
219
  :format => Float
219
220
  },
220
221
  {
221
222
  :name => 'vcpu',
222
223
  :large => '--vcpu vcpu',
223
224
  :description =>
224
- "Number of virtualized CPUs",
225
+ 'Number of virtualized CPUs',
225
226
  :format => Integer
226
227
  },
227
228
  {
@@ -236,20 +237,20 @@ EOT
236
237
  :large => '--memory memory',
237
238
  :description => 'Memory amount given to the VM. By default the '<<
238
239
  "unit is megabytes. To use gigabytes add a 'g', floats "<<
239
- "can be used: 8g=8192, 0.5g=512",
240
+ 'can be used: 8g=8192, 0.5g=512',
240
241
  :format => String,
241
- :proc => lambda do |o,options|
242
+ :proc => lambda do |o, _options|
242
243
  m=o.strip.match(/^(\d+(?:\.\d+)?)(m|mb|g|gb)?$/i)
243
244
 
244
245
  if !m
245
246
  [-1, 'Memory value malformed']
246
247
  else
247
248
  multiplier=case m[2]
248
- when /(g|gb)/i
249
- 1024
250
- else
251
- 1
252
- end
249
+ when /(g|gb)/i
250
+ 1024
251
+ else
252
+ 1
253
+ end
253
254
 
254
255
  value=m[1].to_f*multiplier
255
256
 
@@ -260,29 +261,29 @@ EOT
260
261
  {
261
262
  :name => 'disk',
262
263
  :large => '--disk image0,image1',
263
- :description => "Disks to attach. To use an image owned by"<<
264
- " other user use user[disk]. Add any additional"<<
264
+ :description => 'Disks to attach. To use an image owned by'<<
265
+ ' other user use user[disk]. Add any additional'<<
265
266
  " attributes separated by ':' and in the shape of"<<
266
- " KEY=VALUE. For example, if the disk must be"<<
267
- " resized, use image0:size=1000 . Or"<<
268
- " image0:size=1000:target=vda,image1:target=vdb",
267
+ ' KEY=VALUE. For example, if the disk must be'<<
268
+ ' resized, use image0:size=1000 . Or'<<
269
+ ' image0:size=1000:target=vda,image1:target=vdb',
269
270
  :format => Array
270
271
  },
271
272
  {
272
273
  :name => 'nic',
273
274
  :large => '--nic network0,network1',
274
- :description => "Networks to attach. To use a network owned by"<<
275
- " other user use user[network]. Additional"<<
276
- " attributes are supported like with the --disk"<<
277
- " option. Also you can use auto if you want that" <<
278
- " OpenNebula select automatically the network",
275
+ :description => 'Networks to attach. To use a network owned by'<<
276
+ ' other user use user[network]. Additional'<<
277
+ ' attributes are supported like with the --disk'<<
278
+ ' option. Also you can use auto if you want that' <<
279
+ ' OpenNebula select automatically the network',
279
280
  :format => Array
280
281
  },
281
282
  {
282
283
  :name => 'raw',
283
284
  :large => '--raw string',
284
285
  :description => "Raw string to add to the template. Not to be\n"<<
285
- " "*31<<"confused with the RAW attribute",
286
+ ' '*31<<'confused with the RAW attribute',
286
287
  :format => String
287
288
  },
288
289
  {
@@ -338,9 +339,9 @@ EOT
338
339
  :large => '--ssh [file]',
339
340
  :description => "Add an ssh public key to the context. If the \n"<<
340
341
  (' '*31) << "file is omited then the user variable \n"<<
341
- (' '*31) << "SSH_PUBLIC_KEY will be used.",
342
+ (' '*31) << 'SSH_PUBLIC_KEY will be used.',
342
343
  :format => String,
343
- :proc => lambda do |o, options|
344
+ :proc => lambda do |o, _options|
344
345
  if !o
345
346
  [0, true]
346
347
  else
@@ -393,8 +394,8 @@ EOT
393
394
  :name => 'vcenter_vm_folder',
394
395
  :large => '--vcenter_vm_folder path',
395
396
  :format => String,
396
- :description => "In a vCenter environment sets the the VMs and Template folder where the VM will be placed in." \
397
- " The path uses slashes to separate folders. For example: --vcenter_vm_folder \"/Management/VMs\""
397
+ :description => 'In a vCenter environment sets the the VMs and Template folder where the VM will be placed in.' \
398
+ ' The path uses slashes to separate folders. For example: --vcenter_vm_folder "/Management/VMs"'
398
399
  },
399
400
  {
400
401
  :name => 'user_inputs',
@@ -442,19 +443,20 @@ EOT
442
443
  TEMPLATE_OPTIONS_VM = [TEMPLATE_NAME_VM] + TEMPLATE_OPTIONS + [DRY]
443
444
 
444
445
  CAPACITY_OPTIONS_VM = [TEMPLATE_OPTIONS[0], TEMPLATE_OPTIONS[1],
445
- TEMPLATE_OPTIONS[3]]
446
+ TEMPLATE_OPTIONS[3]]
446
447
 
447
448
  UPDATECONF_OPTIONS_VM = TEMPLATE_OPTIONS[6..15] + [TEMPLATE_OPTIONS[2],
448
- TEMPLATE_OPTIONS[17], TEMPLATE_OPTIONS[18]]
449
+ TEMPLATE_OPTIONS[17], TEMPLATE_OPTIONS[18]]
449
450
 
450
451
  FORMAT = [XML, JSON, YAML]
451
452
 
452
453
  OPTIONS = FORMAT, EXTENDED, NUMERIC, KILOBYTES
453
454
 
454
455
  class OneHelper
456
+
455
457
  attr_accessor :client
456
458
 
457
- def self.get_client(options={}, force=false)
459
+ def self.get_client(options = {}, force = false)
458
460
  if !force && defined?(@@client)
459
461
  @@client
460
462
  else
@@ -470,7 +472,7 @@ EOT
470
472
  end
471
473
 
472
474
  if user
473
- password=password||options[:password]||self.get_password
475
+ password=password||options[:password]||get_password
474
476
  secret="#{user}:#{password}"
475
477
  end
476
478
 
@@ -497,7 +499,7 @@ EOT
497
499
  if defined?(@@client)
498
500
  @@client
499
501
  else
500
- self.get_client
502
+ get_client
501
503
  end
502
504
  end
503
505
 
@@ -513,10 +515,10 @@ EOT
513
515
  @@endpoint=endpoint
514
516
  end
515
517
 
516
- if RUBY_VERSION>="1.9.3"
518
+ if RUBY_VERSION>='1.9.3'
517
519
  require 'io/console'
518
520
  def self.get_password
519
- print "Password: "
521
+ print 'Password: '
520
522
  pass=nil
521
523
  STDIN.noecho {|io| pass=io.gets }
522
524
  puts
@@ -528,25 +530,29 @@ EOT
528
530
  else
529
531
  # This function is copied from ruby net/imap.rb
530
532
  def self.get_password
531
- print "Password: "
532
- system("stty", "-echo")
533
+ print 'Password: '
534
+ system('stty', '-echo')
533
535
  begin
534
536
  @@password = STDIN.gets.chop
535
- return @@password
537
+ @@password
536
538
  ensure
537
- system("stty", "echo")
539
+ system('stty', 'echo')
538
540
  print "\n"
539
541
  end
540
542
  end
541
543
  end
542
544
 
543
- def initialize(secret=nil, endpoint=nil)
545
+ def self.list_layout_help
546
+ "The default columns and their layout can be configured in #{conf_file}"
547
+ end
548
+
549
+ def initialize(_secret = nil, _endpoint = nil)
544
550
  @client=nil
545
551
 
546
552
  @translation_hash = nil
547
553
  end
548
554
 
549
- def set_client(options, client=nil)
555
+ def set_client(options, client = nil)
550
556
  if client.nil?
551
557
  @client=OpenNebulaHelper::OneHelper.get_client(options, true)
552
558
  else
@@ -554,15 +560,15 @@ EOT
554
560
  end
555
561
  end
556
562
 
557
- def create_resource(options, &block)
563
+ def create_resource(_options, &block)
558
564
  resource = factory
559
565
 
560
566
  rc = block.call(resource)
561
567
  if OpenNebula.is_error?(rc)
562
- return -1, rc.message
568
+ [-1, rc.message]
563
569
  else
564
- puts "ID: #{resource.id.to_s}"
565
- return 0
570
+ puts "ID: #{resource.id}"
571
+ 0
566
572
  end
567
573
  end
568
574
 
@@ -596,7 +602,7 @@ EOT
596
602
  p_w.close
597
603
  p_r.close
598
604
 
599
- return lpid
605
+ lpid
600
606
  end
601
607
 
602
608
  def stop_pager(lpid)
@@ -605,7 +611,7 @@ EOT
605
611
  begin
606
612
  Process.wait(lpid)
607
613
  rescue Interrupt
608
- Process.kill("TERM", lpid)
614
+ Process.kill('TERM', lpid)
609
615
  Process.wait(lpid)
610
616
  rescue Errno::ECHILD
611
617
  end
@@ -613,7 +619,7 @@ EOT
613
619
 
614
620
  def print_page(pool, options)
615
621
  elements = 0
616
- page = ""
622
+ page = ''
617
623
 
618
624
  if options[:xml]
619
625
  elements += 1
@@ -640,20 +646,20 @@ EOT
640
646
  end
641
647
  end
642
648
 
643
- return elements, page
649
+ [elements, page]
644
650
  end
645
651
 
646
652
  #-----------------------------------------------------------------------
647
653
  # List the pool in table form, it uses pagination for interactive
648
654
  # output
649
655
  #-----------------------------------------------------------------------
650
- def list_pool_table(table, pool, options, filter_flag)
651
- if $stdout.isatty and (!options.key?:no_pager)
656
+ def list_pool_table(table, pool, options, _filter_flag)
657
+ if $stdout.isatty and (!options.key? :no_pager)
652
658
  size = $stdout.winsize[0] - 1
653
659
 
654
660
  # ----------- First page, check if pager is needed -------------
655
661
  rc = pool.get_page(size, 0, false, options[:state])
656
- ps = ""
662
+ ps = ''
657
663
 
658
664
  return -1, rc.message if OpenNebula.is_error?(rc)
659
665
 
@@ -719,21 +725,21 @@ EOT
719
725
  table.show(hash, options)
720
726
  end
721
727
 
722
- return 0
728
+ 0
723
729
  end
724
730
 
725
731
  #-----------------------------------------------------------------------
726
732
  # List pool in XML format, pagination is used in interactive output
727
733
  #-----------------------------------------------------------------------
728
- def list_pool_xml(pool, options, filter_flag)
734
+ def list_pool_xml(pool, options, _filter_flag)
729
735
  extended = options.include?(:extended) && options[:extended]
730
736
 
731
- if $stdout.isatty and (!options.key?:no_pager)
737
+ if $stdout.isatty and (!options.key? :no_pager)
732
738
  size = $stdout.winsize[0] - 1
733
739
 
734
740
  # ----------- First page, check if pager is needed -------------
735
741
  rc = pool.get_page(size, 0, extended, options[:state])
736
- ps = ""
742
+ ps = ''
737
743
 
738
744
  return -1, rc.message if OpenNebula.is_error?(rc)
739
745
 
@@ -789,7 +795,7 @@ EOT
789
795
 
790
796
  stop_pager(ppid)
791
797
  else
792
- if pool.pool_name == "VM_POOL" && extended
798
+ if pool.pool_name == 'VM_POOL' && extended
793
799
  rc = pool.info_all_extended
794
800
  else
795
801
  rc = pool.info
@@ -800,21 +806,21 @@ EOT
800
806
  puts pool.to_xml(true)
801
807
  end
802
808
 
803
- return 0
809
+ 0
804
810
  end
805
811
 
806
812
  #-----------------------------------------------------------------------
807
813
  # List pool in JSON format, pagination is used in interactive output
808
814
  #-----------------------------------------------------------------------
809
- def list_pool_format(pool, options, filter_flag)
815
+ def list_pool_format(pool, options, _filter_flag)
810
816
  extended = options.include?(:extended) && options[:extended]
811
817
 
812
- if $stdout.isatty and (!options.key?:no_pager)
818
+ if $stdout.isatty and (!options.key? :no_pager)
813
819
  size = $stdout.winsize[0] - 1
814
820
 
815
821
  # ----------- First page, check if pager is needed -------------
816
822
  rc = pool.get_page(size, 0, extended, options[:state])
817
- ps = ""
823
+ ps = ''
818
824
 
819
825
  return -1, rc.message if OpenNebula.is_error?(rc)
820
826
 
@@ -865,7 +871,7 @@ EOT
865
871
 
866
872
  stop_pager(ppid)
867
873
  else
868
- if pool.pool_name == "VM_POOL" && extended
874
+ if pool.pool_name == 'VM_POOL' && extended
869
875
  rc = pool.info_all_extended
870
876
  else
871
877
  rc = pool.info
@@ -876,26 +882,25 @@ EOT
876
882
  yield(pool) if block_given?
877
883
  end
878
884
 
879
- return 0
885
+ 0
880
886
  end
881
887
 
882
888
  #-----------------------------------------------------------------------
883
889
  # List pool table in top-like form
884
890
  #-----------------------------------------------------------------------
885
891
  def list_pool_top(table, pool, options)
886
- table.top(options) {
892
+ table.top(options) do
887
893
  array = pool.get_hash
888
894
 
889
895
  return -1, array.message if OpenNebula.is_error?(array)
890
896
 
891
897
  array
892
- }
898
+ end
893
899
 
894
- return 0
900
+ 0
895
901
  end
896
902
 
897
-
898
- def list_pool(options, top=false, filter_flag=nil)
903
+ def list_pool(options, top = false, filter_flag = nil)
899
904
  # Capture Broken pipe
900
905
  Signal.trap('PIPE', 'EXIT')
901
906
 
@@ -919,19 +924,19 @@ EOT
919
924
  return list_pool_xml(pool, options, filter_flag)
920
925
  elsif options[:json]
921
926
  list_pool_format(pool, options, filter_flag) do |pool|
922
- hash = check_resource_xsd(pool, pname)
927
+ hash = check_resource_xsd(pool, pname)
923
928
  puts ::JSON.pretty_generate(hash)
924
929
  end
925
930
  elsif options[:yaml]
926
931
  list_pool_format(pool, options, filter_flag) do |pool|
927
- hash = check_resource_xsd(pool, pname)
932
+ hash = check_resource_xsd(pool, pname)
928
933
  puts hash.to_yaml(:indent => 4)
929
934
  end
930
935
  else
931
936
  return list_pool_table(table, pool, options, filter_flag)
932
937
  end
933
938
 
934
- return 0
939
+ 0
935
940
  rescue SystemExit, Interrupt
936
941
  # Rescue ctrl + c when paginated
937
942
  0
@@ -972,21 +977,21 @@ EOT
972
977
  return -1, rc.message if OpenNebula.is_error?(rc)
973
978
 
974
979
  if options[:xml]
975
- return 0, resource.to_xml(true)
980
+ [0, resource.to_xml(true)]
976
981
  elsif options[:json]
977
982
  # If body is set, the resource contains a JSON inside
978
983
  if options[:body]
979
- return 0, check_resource_xsd(resource)
984
+ [0, check_resource_xsd(resource)]
980
985
  else
981
- return 0, ::JSON.pretty_generate(
986
+ [0, ::JSON.pretty_generate(
982
987
  check_resource_xsd(resource)
983
- )
988
+ )]
984
989
  end
985
990
  elsif options[:yaml]
986
- return 0, check_resource_xsd(resource).to_yaml(:indent => 4)
991
+ [0, check_resource_xsd(resource).to_yaml(:indent => 4)]
987
992
  else
988
993
  format_resource(resource, options)
989
- return 0
994
+ 0
990
995
  end
991
996
  end
992
997
 
@@ -995,19 +1000,19 @@ EOT
995
1000
 
996
1001
  rc = block.call(resource)
997
1002
  if OpenNebula.is_error?(rc)
998
- return -1, rc.message
1003
+ [-1, rc.message]
999
1004
  else
1000
1005
  if options[:verbose]
1001
1006
  puts "#{self.class.rname} #{id}: #{verbose}"
1002
1007
  end
1003
- return 0
1008
+ 0
1004
1009
  end
1005
1010
  end
1006
1011
 
1007
- def perform_actions(ids,options,verbose,&block)
1012
+ def perform_actions(ids, options, verbose, &block)
1008
1013
  exit_code = 0
1009
1014
  ids.each do |id|
1010
- rc = perform_action(id,options,verbose,&block)
1015
+ rc = perform_action(id, options, verbose, &block)
1011
1016
 
1012
1017
  unless rc[0]==0
1013
1018
  STDERR.puts rc[1]
@@ -1021,7 +1026,7 @@ EOT
1021
1026
  ########################################################################
1022
1027
  # Id translation
1023
1028
  ########################################################################
1024
- def user_name(resource, options={})
1029
+ def user_name(resource, options = {})
1025
1030
  if options[:numeric]
1026
1031
  resource['UID']
1027
1032
  else
@@ -1029,7 +1034,7 @@ EOT
1029
1034
  end
1030
1035
  end
1031
1036
 
1032
- def group_name(resource, options={})
1037
+ def group_name(resource, options = {})
1033
1038
  if options[:numeric]
1034
1039
  resource['GID']
1035
1040
  else
@@ -1053,7 +1058,7 @@ EOT
1053
1058
  end
1054
1059
 
1055
1060
  def self.to_id_desc
1056
- "OpenNebula #{self.rname} name or id"
1061
+ "OpenNebula #{rname} name or id"
1057
1062
  end
1058
1063
 
1059
1064
  def list_to_id(names)
@@ -1063,7 +1068,7 @@ EOT
1063
1068
  pool = rc[1]
1064
1069
  poolname = self.class.rname
1065
1070
 
1066
- result = names.split(',').collect { |name|
1071
+ result = names.split(',').collect do |name|
1067
1072
  if name.match(/^[0123456789]+$/)
1068
1073
  name.to_i
1069
1074
  else
@@ -1075,76 +1080,70 @@ EOT
1075
1080
 
1076
1081
  rc[1]
1077
1082
  end
1078
- }
1083
+ end
1079
1084
 
1080
- return 0, result
1085
+ [0, result]
1081
1086
  end
1082
1087
 
1083
1088
  def self.list_to_id_desc
1084
- "Comma-separated list of OpenNebula #{self.rname} names or ids"
1089
+ "Comma-separated list of OpenNebula #{rname} names or ids"
1085
1090
  end
1086
1091
 
1087
1092
  def self.name_to_id(name, pool, ename)
1088
- if ename=="CLUSTER" and name.upcase=="ALL"
1089
- return 0, "ALL"
1093
+ if ename=='CLUSTER' and name.upcase=='ALL'
1094
+ return 0, 'ALL'
1090
1095
  end
1091
1096
 
1092
1097
  objects=pool.select {|object| object.name==name }
1093
1098
 
1094
- if objects.length>0
1095
- if objects.length>1
1096
- return -1, "There are multiple #{ename}s with name #{name}."
1097
- else
1098
- result = objects.first.id
1099
- end
1100
- else
1101
- return -1, "#{ename} named #{name} not found."
1102
- end
1099
+ return -1, "#{ename} named #{name} not found." unless objects.length>0
1100
+ return -1, "There are multiple #{ename}s with name #{name}." if objects.length>1
1103
1101
 
1104
- return 0, result
1102
+ result = objects.first.id
1103
+
1104
+ [0, result]
1105
1105
  end
1106
1106
 
1107
1107
  def filterflag_to_i(str)
1108
1108
  filter_flag = case str
1109
- when "a", "all" then OpenNebula::Pool::INFO_ALL
1110
- when "m", "mine" then OpenNebula::Pool::INFO_MINE
1111
- when "g", "group" then OpenNebula::Pool::INFO_GROUP
1112
- when "G", "primary group" then OpenNebula::Pool::INFO_PRIMARY_GROUP
1113
- else
1114
- if str.match(/^[0123456789]+$/)
1115
- str.to_i
1116
- else
1117
- rc = OpenNebulaHelper.rname_to_id(str, "USER")
1118
- if rc.first==-1
1119
- return rc
1120
- else
1121
- rc[1]
1122
- end
1123
- end
1124
- end
1109
+ when 'a', 'all' then OpenNebula::Pool::INFO_ALL
1110
+ when 'm', 'mine' then OpenNebula::Pool::INFO_MINE
1111
+ when 'g', 'group' then OpenNebula::Pool::INFO_GROUP
1112
+ when 'G', 'primary group' then OpenNebula::Pool::INFO_PRIMARY_GROUP
1113
+ else
1114
+ if str.match(/^[0123456789]+$/)
1115
+ str.to_i
1116
+ else
1117
+ rc = OpenNebulaHelper.rname_to_id(str, 'USER')
1118
+ return rc if rc.first==-1
1119
+
1120
+ rc[1]
1125
1121
 
1126
- return 0, filter_flag
1122
+ end
1123
+ end
1124
+
1125
+ [0, filter_flag]
1127
1126
  end
1128
1127
 
1129
1128
  def self.filterflag_to_i_desc
1130
- desc=<<-EOT
1131
- a, all all the known #{self.rname}s
1132
- m, mine the #{self.rname} belonging to the user in ONE_AUTH
1133
- g, group 'mine' plus the #{self.rname} belonging to the groups
1134
- the user is member of
1135
- G, primary group the #{self.rname} owned the user's primary group
1136
- uid #{self.rname} of the user identified by this uid
1137
- user #{self.rname} of the user identified by the username
1138
- EOT
1139
- end
1140
-
1141
- def self.table_conf(conf_file=self.conf_file)
1142
- path = "#{ENV["HOME"]}/.one/cli/#{conf_file}"
1143
-
1144
- if File.exists?(path)
1145
- return path
1129
+ desc=<<~EOT
1130
+ a, all all the known #{rname}s
1131
+ m, mine the #{rname} belonging to the user in ONE_AUTH
1132
+ g, group 'mine' plus the #{rname} belonging to the groups
1133
+ the user is member of
1134
+ G, primary group the #{rname} owned the user's primary group
1135
+ uid #{rname} of the user identified by this uid
1136
+ user #{rname} of the user identified by the username
1137
+ EOT
1138
+ end
1139
+
1140
+ def self.table_conf(conf_file = self.conf_file)
1141
+ path = "#{ENV['HOME']}/.one/cli/#{conf_file}"
1142
+
1143
+ if File.exist?(path)
1144
+ path
1146
1145
  else
1147
- return "#{TABLE_CONF_PATH}/#{conf_file}"
1146
+ "#{TABLE_CONF_PATH}/#{conf_file}"
1148
1147
  end
1149
1148
  end
1150
1149
 
@@ -1171,7 +1170,7 @@ EOT
1171
1170
  phash = [phash["#{rname}_POOL"]["#{rname}"]]
1172
1171
  end
1173
1172
  else
1174
- phash = Array.new
1173
+ phash = []
1175
1174
  end
1176
1175
 
1177
1176
  phash
@@ -1183,15 +1182,14 @@ EOT
1183
1182
 
1184
1183
  rc = pool.info
1185
1184
  if OpenNebula.is_error?(rc)
1186
- if rc.message.empty?
1187
- return -1, "OpenNebula #{self.class.rname} name not " <<
1188
- "found, use the ID instead"
1189
- else
1190
- return -1,rc.message
1191
- end
1185
+ return -1, rc.message unless rc.message.empty?
1186
+
1187
+ return -1, "OpenNebula #{self.class.rname} name not " <<
1188
+ 'found, use the ID instead'
1189
+
1192
1190
  end
1193
1191
 
1194
- return 0, pool
1192
+ [0, pool]
1195
1193
  end
1196
1194
 
1197
1195
  def get_format_size(pool, options)
@@ -1217,7 +1215,7 @@ EOT
1217
1215
  # @return [Object] Hash with correct values
1218
1216
  def check_resource_xsd(resource, ename = nil)
1219
1217
  hash = resource.to_hash
1220
- ename = hash.keys.first unless ename
1218
+ ename ||= hash.keys.first
1221
1219
  xsd = read_xsd(ename)
1222
1220
 
1223
1221
  return hash unless xsd
@@ -1228,14 +1226,13 @@ EOT
1228
1226
  xsd = xsd['element']
1229
1227
  end
1230
1228
 
1231
- xsd = [ xsd ] unless xsd.is_a? Array
1229
+ xsd = [xsd] unless xsd.is_a? Array
1232
1230
 
1233
1231
  check_xsd(hash[ename], xsd)
1234
1232
 
1235
1233
  hash
1236
1234
  end
1237
1235
 
1238
-
1239
1236
  # Replaces refs in xsd definition
1240
1237
  # limited func: only traverse hashes (not arrays), but works well for pools
1241
1238
  #
@@ -1248,15 +1245,15 @@ EOT
1248
1245
  if h.keys.include? 'ref'
1249
1246
  ref_xsd = read_xsd(h['ref'])
1250
1247
  return ref_xsd unless ref_xsd.nil?
1251
- return h
1248
+
1249
+ h
1252
1250
  else
1253
- h.each do |k,v|
1251
+ h.each do |k, v|
1254
1252
  h[k] = replace_refs(v)
1255
1253
  end
1256
1254
  end
1257
1255
  end
1258
1256
 
1259
-
1260
1257
  # Read XSD file and parse to XML
1261
1258
  #
1262
1259
  # @param ename [String] Element name to read XSD
@@ -1275,16 +1272,14 @@ EOT
1275
1272
 
1276
1273
  unless File.exist?(file)
1277
1274
  STDERR.puts "WARNING: XSD for #{ename} not found, skipping check"
1278
- return nil
1275
+ return
1279
1276
  end
1280
1277
 
1281
1278
  hash = Hash.from_xml(Nokogiri::XML(File.read(file)).to_s)
1282
1279
 
1283
1280
  hash = hash['schema']['element']
1284
1281
 
1285
- hash = replace_refs(hash)
1286
-
1287
- hash
1282
+ replace_refs(hash)
1288
1283
  end
1289
1284
 
1290
1285
  # Decides if given xsd definiton should be array in xml
@@ -1298,6 +1293,7 @@ EOT
1298
1293
  def is_array?(e)
1299
1294
  return false if e.nil?
1300
1295
  return false unless e.is_a? Hash
1296
+
1301
1297
  e['maxOccurs'] == 'unbounded' || e['maxOccurs'].to_i > 1
1302
1298
  end
1303
1299
 
@@ -1338,16 +1334,15 @@ EOT
1338
1334
  return unless hash or hash.empty?
1339
1335
 
1340
1336
  hash.each do |k, v|
1341
-
1342
1337
  # find the elem definition in xsd array
1343
- xsd_elem = xsd.select { |e| e['name'] == k }.first unless xsd.nil?
1338
+ xsd_elem = xsd.select {|e| e['name'] == k }.first unless xsd.nil?
1344
1339
 
1345
1340
  if xsd_complex_sequence?(xsd_elem) || xsd_complex_all?(xsd_elem)
1346
1341
 
1347
1342
  # go deeper in xsd, xsd is ehter complex sequence or all
1348
1343
  begin
1349
1344
  inner_xsd = xsd_elem['complexType']['sequence']['element']
1350
- rescue
1345
+ rescue StandardError
1351
1346
  inner_xsd = xsd_elem['complexType']['all']['element']
1352
1347
  end
1353
1348
 
@@ -1365,81 +1360,82 @@ EOT
1365
1360
  end
1366
1361
 
1367
1362
  # if XSD requires array, do so in resource if missing
1368
- if is_array?(xsd_elem) && (! v.is_a? Array)
1369
- hash[k] = [ v ]
1363
+ if is_array?(xsd_elem) && (!v.is_a? Array)
1364
+ hash[k] = [v]
1370
1365
  end
1371
1366
  end
1372
1367
  end
1368
+
1373
1369
  end
1374
1370
 
1375
- def OpenNebulaHelper.rname_to_id(name, poolname)
1371
+ def self.rname_to_id(name, poolname)
1376
1372
  return 0, name.to_i if name.match(/^[0123456789]+$/)
1377
1373
 
1378
1374
  client=OneHelper.client
1379
1375
 
1380
1376
  pool = case poolname
1381
- when "HOST" then OpenNebula::HostPool.new(client)
1382
- when "HOOK" then OpenNebula::HookPool.new(client)
1383
- when "GROUP" then OpenNebula::GroupPool.new(client)
1384
- when "USER" then OpenNebula::UserPool.new(client)
1385
- when "DATASTORE" then OpenNebula::DatastorePool.new(client)
1386
- when "CLUSTER" then OpenNebula::ClusterPool.new(client)
1387
- when "VNET" then OpenNebula::VirtualNetworkPool.new(client)
1388
- when "IMAGE" then OpenNebula::ImagePool.new(client)
1389
- when "VMTEMPLATE" then OpenNebula::TemplatePool.new(client)
1390
- when "VNTEMPLATES" then OpenNebula::VNTemplatePool.new(client)
1391
- when "VM" then OpenNebula::VirtualMachinePool.new(client)
1392
- when "ZONE" then OpenNebula::ZonePool.new(client)
1393
- when "MARKETPLACE" then OpenNebula::MarketPlacePool.new(client)
1394
- when "FLOWTEMPLATES" then OpenNebula::ServiceTemplatePool.new(client)
1395
- end
1377
+ when 'HOST' then OpenNebula::HostPool.new(client)
1378
+ when 'HOOK' then OpenNebula::HookPool.new(client)
1379
+ when 'GROUP' then OpenNebula::GroupPool.new(client)
1380
+ when 'USER' then OpenNebula::UserPool.new(client)
1381
+ when 'DATASTORE' then OpenNebula::DatastorePool.new(client)
1382
+ when 'CLUSTER' then OpenNebula::ClusterPool.new(client)
1383
+ when 'VNET' then OpenNebula::VirtualNetworkPool.new(client)
1384
+ when 'IMAGE' then OpenNebula::ImagePool.new(client)
1385
+ when 'VMTEMPLATE' then OpenNebula::TemplatePool.new(client)
1386
+ when 'VNTEMPLATES' then OpenNebula::VNTemplatePool.new(client)
1387
+ when 'VM' then OpenNebula::VirtualMachinePool.new(client)
1388
+ when 'ZONE' then OpenNebula::ZonePool.new(client)
1389
+ when 'MARKETPLACE' then OpenNebula::MarketPlacePool.new(client)
1390
+ when 'FLOWTEMPLATES' then OpenNebula::ServiceTemplatePool.new(client)
1391
+ end
1396
1392
 
1397
1393
  rc = pool.info
1398
1394
  if OpenNebula.is_error?(rc)
1399
1395
  return -1, "OpenNebula #{poolname} name not found," <<
1400
- " use the ID instead"
1396
+ ' use the ID instead'
1401
1397
  end
1402
1398
 
1403
1399
  OneHelper.name_to_id(name, pool, poolname)
1404
1400
  end
1405
1401
 
1406
- def OpenNebulaHelper.size_in_mb(size)
1402
+ def self.size_in_mb(size)
1407
1403
  m = size.match(/^(\d+(?:\.\d+)?)(t|tb|m|mb|g|gb)?$/i)
1408
1404
 
1409
1405
  if !m
1410
1406
  # return OpenNebula::Error.new('Size value malformed')
1411
- return -1, 'Size value malformed'
1407
+ [-1, 'Size value malformed']
1412
1408
  else
1413
1409
  multiplier=case m[2]
1414
- when /(t|tb)/i
1415
- 1024*1024
1416
- when /(g|gb)/i
1417
- 1024
1418
- else
1419
- 1
1420
- end
1410
+ when /(t|tb)/i
1411
+ 1024*1024
1412
+ when /(g|gb)/i
1413
+ 1024
1414
+ else
1415
+ 1
1416
+ end
1421
1417
 
1422
1418
  value=m[1].to_f*multiplier
1423
1419
 
1424
1420
  # return value.ceil
1425
- return 0, value.ceil
1421
+ [0, value.ceil]
1426
1422
  end
1427
1423
  end
1428
1424
 
1429
- def OpenNebulaHelper.rname_to_id_desc(poolname)
1425
+ def self.rname_to_id_desc(poolname)
1430
1426
  "OpenNebula #{poolname} name or id"
1431
1427
  end
1432
1428
 
1433
- def OpenNebulaHelper.boolean_to_str(str)
1429
+ def self.boolean_to_str(str)
1434
1430
  if str.to_i == 1
1435
- "Yes"
1431
+ 'Yes'
1436
1432
  else
1437
- "No"
1433
+ 'No'
1438
1434
  end
1439
1435
  end
1440
1436
 
1441
- def OpenNebulaHelper.time_to_str(time, print_seconds=true,
1442
- print_hours=true, print_years=false)
1437
+ def self.time_to_str(time, print_seconds = true,
1438
+ print_hours = true, print_years = false)
1443
1439
 
1444
1440
  value = time.to_i
1445
1441
 
@@ -1449,63 +1445,63 @@ EOT
1449
1445
  if print_hours
1450
1446
  if print_seconds
1451
1447
  if print_years
1452
- value=Time.at(value).strftime("%m/%d/%y %H:%M:%S")
1448
+ value=Time.at(value).strftime('%m/%d/%y %H:%M:%S')
1453
1449
  else
1454
- value=Time.at(value).strftime("%m/%d %H:%M:%S")
1450
+ value=Time.at(value).strftime('%m/%d %H:%M:%S')
1455
1451
  end
1456
1452
  else
1457
1453
  if print_years
1458
- value=Time.at(value).strftime("%m/%d/%y %H:%M")
1454
+ value=Time.at(value).strftime('%m/%d/%y %H:%M')
1459
1455
  else
1460
- value=Time.at(value).strftime("%m/%d %H:%M")
1456
+ value=Time.at(value).strftime('%m/%d %H:%M')
1461
1457
  end
1462
1458
  end
1463
1459
  else
1464
1460
  if print_years
1465
- value=Time.at(value).strftime("%m/%d/%y")
1461
+ value=Time.at(value).strftime('%m/%d/%y')
1466
1462
  else
1467
- value=Time.at(value).strftime("%m/%d")
1463
+ value=Time.at(value).strftime('%m/%d')
1468
1464
  end
1469
1465
  end
1470
1466
  end
1471
1467
 
1472
- return value
1468
+ value
1473
1469
  end
1474
1470
 
1475
- def OpenNebulaHelper.period_to_str(time, print_seconds=true)
1471
+ def self.period_to_str(time, print_seconds = true)
1476
1472
  seconds=time.to_i
1477
1473
  minutes, seconds=seconds.divmod(60)
1478
1474
  hours, minutes=minutes.divmod(60)
1479
1475
  days, hours=hours.divmod(24)
1480
1476
 
1481
1477
  if print_seconds
1482
- "%3dd %02dh%02dm%02ds" % [days, hours, minutes, seconds]
1478
+ format('%3dd %02dh%02dm%02ds', days, hours, minutes, seconds)
1483
1479
  else
1484
- "%3dd %02dh%02dm" % [days, hours, minutes]
1480
+ format('%3dd %02dh%02dm', days, hours, minutes)
1485
1481
  end
1486
1482
  end
1487
1483
 
1488
- def OpenNebulaHelper.short_period_to_str(time, print_seconds=true)
1484
+ def self.short_period_to_str(time, print_seconds = true)
1489
1485
  seconds=time.to_i
1490
1486
  minutes, seconds=seconds.divmod(60)
1491
1487
  hours, minutes=minutes.divmod(60)
1492
1488
 
1493
1489
  if print_seconds
1494
- "%3dh%02dm%02ds" % [hours, minutes, seconds]
1490
+ format('%3dh%02dm%02ds', hours, minutes, seconds)
1495
1491
  else
1496
- "%3dh%02dm" % [hours, minutes]
1492
+ format('%3dh%02dm', hours, minutes)
1497
1493
  end
1498
1494
  end
1499
1495
 
1500
- BinarySufix = ["K", "M", "G", "T" ]
1496
+ BinarySufix = ['K', 'M', 'G', 'T']
1501
1497
 
1502
- def OpenNebulaHelper.unit_to_str(value, options, unit="K")
1498
+ def self.unit_to_str(value, options, unit = 'K')
1503
1499
  if options[:kilobytes]
1504
1500
  value
1505
1501
  else
1506
1502
  i=BinarySufix.index(unit).to_i
1507
1503
 
1508
- while value > 1024 && i < 3 do
1504
+ while value > 1024 && i < 3
1509
1505
  value /= 1024.0
1510
1506
  i+=1
1511
1507
  end
@@ -1517,11 +1513,11 @@ EOT
1517
1513
  end
1518
1514
  end
1519
1515
 
1520
- def OpenNebulaHelper.bytes_to_unit(value, unit = 'K')
1516
+ def self.bytes_to_unit(value, unit = 'K')
1521
1517
  j = 0
1522
1518
  i = BinarySufix.index(unit).to_i
1523
1519
 
1524
- while j < i do
1520
+ while j < i
1525
1521
  value /= 1024.0
1526
1522
  j += 1
1527
1523
  end
@@ -1533,51 +1529,50 @@ EOT
1533
1529
  #
1534
1530
  # @param str [String || Hash] Cluster name, or empty Hash (when <CLUSTER/>)
1535
1531
  # @return [String] the same Cluster name, or '-' if it is empty
1536
- def OpenNebulaHelper.cluster_str(str)
1537
- if str != nil && !str.empty?
1532
+ def self.cluster_str(str)
1533
+ if !str.nil? && !str.empty?
1538
1534
  str
1539
1535
  else
1540
- "-"
1536
+ '-'
1541
1537
  end
1542
1538
  end
1543
1539
 
1544
- def OpenNebulaHelper.clusters_str(clusters)
1540
+ def self.clusters_str(clusters)
1545
1541
  if clusters.nil?
1546
- "-"
1542
+ '-'
1547
1543
  else
1548
1544
  [clusters].flatten.join(',')
1549
1545
  end
1550
-
1551
1546
  end
1552
1547
 
1553
- def OpenNebulaHelper.update_template(id, resource, path=nil, xpath='TEMPLATE')
1554
- return update_template_helper(false, id, resource, path, xpath)
1548
+ def self.update_template(id, resource, path = nil, xpath = 'TEMPLATE')
1549
+ update_template_helper(false, id, resource, path, xpath)
1555
1550
  end
1556
1551
 
1557
- def OpenNebulaHelper.append_template(id, resource, path=nil, xpath='TEMPLATE')
1558
- return update_template_helper(true, id, resource, path, xpath)
1552
+ def self.append_template(id, resource, path = nil, xpath = 'TEMPLATE')
1553
+ update_template_helper(true, id, resource, path, xpath)
1559
1554
  end
1560
1555
 
1561
- def OpenNebulaHelper.update_template_helper(append, id, resource, path, xpath, update=true)
1556
+ def self.update_template_helper(append, _id, resource, path, xpath, update = true)
1562
1557
  if path
1563
- return File.read(path)
1558
+ File.read(path)
1564
1559
  elsif append
1565
- return editor_input()
1560
+ editor_input
1566
1561
  else
1567
1562
  if update
1568
1563
  rc = resource.info
1569
1564
 
1570
1565
  if OpenNebula.is_error?(rc)
1571
1566
  puts rc.message
1572
- exit -1
1567
+ exit(-1)
1573
1568
  end
1574
1569
  end
1575
1570
 
1576
- return editor_input(resource.template_like_str(xpath))
1571
+ editor_input(resource.template_like_str(xpath))
1577
1572
  end
1578
1573
  end
1579
1574
 
1580
- def OpenNebulaHelper.update_obj(obj, file, plain = false)
1575
+ def self.update_obj(obj, file, plain = false)
1581
1576
  rc = obj.info(true)
1582
1577
 
1583
1578
  return rc if OpenNebula.is_error?(rc)
@@ -1614,28 +1609,27 @@ EOT
1614
1609
  end
1615
1610
  end
1616
1611
 
1617
- def OpenNebulaHelper.editor_input(contents=nil)
1612
+ def self.editor_input(contents = nil)
1618
1613
  require 'tempfile'
1619
1614
 
1620
- tmp = Tempfile.new("one_cli")
1615
+ tmp = Tempfile.new('one_cli')
1621
1616
 
1622
1617
  if contents
1623
1618
  tmp << contents
1624
1619
  tmp.flush
1625
1620
  end
1626
1621
 
1627
- editor_path = ENV["EDITOR"] ? ENV["EDITOR"] : EDITOR_PATH
1622
+ editor_path = ENV['EDITOR'] ? ENV['EDITOR'] : EDITOR_PATH
1628
1623
  system("#{editor_path} #{tmp.path}")
1629
1624
 
1630
1625
  unless $?.exitstatus == 0
1631
- puts "Editor not defined"
1632
- exit -1
1626
+ puts 'Editor not defined'
1627
+ exit(-1)
1633
1628
  end
1634
1629
 
1635
1630
  tmp.close
1636
1631
 
1637
- str = File.read(tmp.path)
1638
- return str
1632
+ File.read(tmp.path)
1639
1633
  end
1640
1634
 
1641
1635
  def self.parse_user_object(user_object)
@@ -1643,7 +1637,7 @@ EOT
1643
1637
 
1644
1638
  m=user_object.match(reg)
1645
1639
 
1646
- return nil if !m
1640
+ return unless m
1647
1641
 
1648
1642
  user=nil
1649
1643
  if m[2]
@@ -1660,7 +1654,7 @@ EOT
1660
1654
  template=''
1661
1655
 
1662
1656
  objects.each do |obj|
1663
- obj, *extra_attributes = obj.split(":")
1657
+ obj, *extra_attributes = obj.split(':')
1664
1658
 
1665
1659
  # When extra attributes do not contain = character include
1666
1660
  # them in the previous value. Fixes adding MAC addresses. These
@@ -1673,26 +1667,27 @@ EOT
1673
1667
  #
1674
1668
  attrs = []
1675
1669
  extra_attributes.each do |str|
1676
- if str.include?("=")
1670
+ if str.include?('=')
1677
1671
  attrs << str
1678
1672
  else
1679
1673
  attrs.last << ":#{str}"
1680
- end
1674
+ end
1681
1675
  end
1682
1676
 
1683
1677
  extra_attributes = attrs
1684
1678
 
1685
1679
  res=parse_user_object(obj)
1686
- return [-1, "#{section.capitalize} \"#{obj}\" malformed"] if !res
1680
+ return [-1, "#{section.capitalize} \"#{obj}\" malformed"] unless res
1681
+
1687
1682
  user, object=*res
1688
1683
 
1689
1684
  template<<"#{section.upcase}=[\n"
1690
- if object.downcase == "auto"
1685
+ if object.downcase == 'auto'
1691
1686
  template<<" NETWORK_MODE=\"#{object}\"\n"
1692
1687
  else
1693
1688
  template<<" #{name.upcase}_UNAME=\"#{user}\",\n" if user
1694
1689
  extra_attributes.each do |extra_attribute|
1695
- key, value = extra_attribute.split("=")
1690
+ key, value = extra_attribute.split('=')
1696
1691
  template<<" #{key.upcase}=\"#{value}\",\n"
1697
1692
  end
1698
1693
  if object.match(/^\d+$/)
@@ -1708,13 +1703,14 @@ EOT
1708
1703
  end
1709
1704
 
1710
1705
  def self.create_context(options)
1711
- context_options = [:ssh, :net_context, :context, :init, :files_ds, :startscript, :report_ready]
1706
+ context_options = [:ssh, :net_context, :context, :init, :files_ds, :startscript,
1707
+ :report_ready]
1712
1708
  if !(options.keys & context_options).empty?
1713
1709
  lines=[]
1714
1710
 
1715
1711
  if options[:ssh]
1716
1712
  if options[:ssh]==true
1717
- lines<<"SSH_PUBLIC_KEY=\"$USER[SSH_PUBLIC_KEY]\""
1713
+ lines<<'SSH_PUBLIC_KEY="$USER[SSH_PUBLIC_KEY]"'
1718
1714
  else
1719
1715
  begin
1720
1716
  key=File.read(options[:ssh]).strip
@@ -1727,7 +1723,7 @@ EOT
1727
1723
  end
1728
1724
 
1729
1725
  if options[:net_context]
1730
- lines << "NETWORK = \"YES\""
1726
+ lines << 'NETWORK = "YES"'
1731
1727
  end
1732
1728
 
1733
1729
  lines+=options[:context] if options[:context]
@@ -1735,7 +1731,7 @@ EOT
1735
1731
  if options[:files_ds]
1736
1732
  text='FILES_DS="'
1737
1733
  text << options[:files_ds].map do |file|
1738
- %Q<$FILE[IMAGE=\\"#{file}\\"]>
1734
+ %($FILE[IMAGE=\\"#{file}\\"])
1739
1735
  end.join(' ')
1740
1736
  text << '"'
1741
1737
 
@@ -1743,7 +1739,7 @@ EOT
1743
1739
  end
1744
1740
 
1745
1741
  if options[:init]
1746
- lines << %Q<INIT_SCRIPTS="#{options[:init].join(' ')}">
1742
+ lines << %(INIT_SCRIPTS="#{options[:init].join(' ')}")
1747
1743
  end
1748
1744
 
1749
1745
  if options[:startscript]
@@ -1754,16 +1750,16 @@ EOT
1754
1750
  STDERR.puts e.message
1755
1751
  exit(-1)
1756
1752
  end
1757
- script = Base64::strict_encode64(script)
1753
+ script = Base64.strict_encode64(script)
1758
1754
  lines<<"START_SCRIPT_BASE64=\"#{script}\""
1759
1755
  end
1760
1756
 
1761
1757
  if options[:report_ready]
1762
- lines << "REPORT_READY = \"YES\""
1758
+ lines << 'REPORT_READY = "YES"'
1763
1759
  end
1764
1760
 
1765
1761
  if !lines.empty?
1766
- "CONTEXT=[\n" << lines.map{|l| " " << l }.join(",\n") << "\n]\n"
1762
+ "CONTEXT=[\n" << lines.map {|l| ' ' << l }.join(",\n") << "\n]\n"
1767
1763
  else
1768
1764
  nil
1769
1765
  end
@@ -1772,7 +1768,7 @@ EOT
1772
1768
  end
1773
1769
  end
1774
1770
 
1775
- def self.create_template(options, template_obj=nil)
1771
+ def self.create_template(options, template_obj = nil)
1776
1772
  template=''
1777
1773
 
1778
1774
  template<<"NAME=\"#{options[:name]}\"\n" if options[:name]
@@ -1812,7 +1808,7 @@ EOT
1812
1808
  end
1813
1809
 
1814
1810
  if options[:vnc]
1815
- vnc_listen=options[:vnc_listen] || "0.0.0.0"
1811
+ vnc_listen=options[:vnc_listen] || '0.0.0.0'
1816
1812
  template<<"GRAPHICS=[ TYPE=\"vnc\", LISTEN=\"#{vnc_listen}\""
1817
1813
  if options[:vnc_password]
1818
1814
  template << ", PASSWD=\"#{options[:vnc_password]}\""
@@ -1824,7 +1820,7 @@ EOT
1824
1820
  end
1825
1821
 
1826
1822
  if options[:spice]
1827
- spice_listen=options[:spice_listen] || "0.0.0.0"
1823
+ spice_listen=options[:spice_listen] || '0.0.0.0'
1828
1824
  template<<"GRAPHICS=[ TYPE=\"spice\", LISTEN=\"#{spice_listen}\""
1829
1825
  if options[:spice_password]
1830
1826
  template << ", PASSWD=\"#{options[:spice_password]}\""
@@ -1840,15 +1836,15 @@ EOT
1840
1836
  context=create_context(options)
1841
1837
  template<<context if context
1842
1838
 
1843
- if options[:userdata] && !template_obj.nil?
1844
- if template_obj.has_elements?('TEMPLATE/EC2')
1845
- template_obj.add_element(
1846
- 'TEMPLATE/EC2',
1847
- 'USERDATA' => options[:userdata])
1839
+ if options[:userdata] && !template_obj.nil? && template_obj.has_elements?('TEMPLATE/EC2')
1840
+ template_obj.add_element(
1841
+ 'TEMPLATE/EC2',
1842
+ 'USERDATA' => options[:userdata]
1843
+ )
1848
1844
 
1849
- template << template_obj.template_like_str(
1850
- 'TEMPLATE', false, 'EC2')
1851
- end
1845
+ template << template_obj.template_like_str(
1846
+ 'TEMPLATE', false, 'EC2'
1847
+ )
1852
1848
  end
1853
1849
 
1854
1850
  [0, template]
@@ -1946,21 +1942,21 @@ EOT
1946
1942
 
1947
1943
  def self.sunstone_url
1948
1944
  if (one_sunstone = ENV['ONE_SUNSTONE'])
1949
- one_sunstone
1945
+ one_sunstone
1950
1946
  elsif (one_xmlrpc = ENV['ONE_XMLRPC'])
1951
1947
  uri = URI(one_xmlrpc)
1952
1948
  "#{uri.scheme}://#{uri.host}:9869"
1953
1949
  else
1954
- "http://localhost:9869"
1950
+ 'http://localhost:9869'
1955
1951
  end
1956
1952
  end
1957
1953
 
1958
- def self.download_resource_sunstone(kind, id, path, force)
1954
+ def self.download_resource_sunstone(kind, id, path, _force)
1959
1955
  client = OneHelper.client
1960
- user, password = client.one_auth.split(":", 2)
1956
+ user, password = client.one_auth.split(':', 2)
1961
1957
 
1962
1958
  # Step 1: Build Session to get Cookie
1963
- uri = URI(File.join(sunstone_url,"login"))
1959
+ uri = URI(File.join(sunstone_url, 'login'))
1964
1960
 
1965
1961
  req = Net::HTTP::Post.new(uri)
1966
1962
  req.basic_auth user, password
@@ -1969,14 +1965,14 @@ EOT
1969
1965
  res = Net::HTTP.start(uri.hostname, uri.port) do |http|
1970
1966
  http.request(req)
1971
1967
  end
1972
- rescue
1968
+ rescue StandardError
1973
1969
  return OpenNebula::Error.new("Error connecting to '#{uri}'.")
1974
1970
  end
1975
1971
 
1976
1972
  cookie = res.response['set-cookie'].split('; ')[0]
1977
1973
 
1978
1974
  if cookie.nil?
1979
- return OpenNebula::Error.new("Unable to get Cookie. Is OpenNebula running?")
1975
+ return OpenNebula::Error.new('Unable to get Cookie. Is OpenNebula running?')
1980
1976
  end
1981
1977
 
1982
1978
  # Step 2: Open '/' to get the csrftoken
@@ -1989,7 +1985,7 @@ EOT
1989
1985
  res = Net::HTTP.start(uri.hostname, uri.port) do |http|
1990
1986
  http.request(req)
1991
1987
  end
1992
- rescue
1988
+ rescue StandardError
1993
1989
  return OpenNebula::Error.new("Error connecting to '#{uri}'.")
1994
1990
  end
1995
1991
 
@@ -1997,7 +1993,7 @@ EOT
1997
1993
  csrftoken = m[1] rescue nil
1998
1994
 
1999
1995
  if csrftoken.nil?
2000
- return OpenNebula::Error.new("Unable to get csrftoken.")
1996
+ return OpenNebula::Error.new('Unable to get csrftoken.')
2001
1997
  end
2002
1998
 
2003
1999
  # Step 3: Download resource
@@ -2009,7 +2005,7 @@ EOT
2009
2005
  req = Net::HTTP::Get.new(uri)
2010
2006
 
2011
2007
  req['Cookie'] = cookie
2012
- req['User-Agent'] = "OpenNebula CLI"
2008
+ req['User-Agent'] = 'OpenNebula CLI'
2013
2009
 
2014
2010
  begin
2015
2011
  File.open(path, 'wb') do |f|
@@ -2022,7 +2018,7 @@ EOT
2022
2018
  end
2023
2019
  end
2024
2020
  rescue Errno::EACCES
2025
- return OpenNebula::Error.new("Target file not writable.")
2021
+ return OpenNebula::Error.new('Target file not writable.')
2026
2022
  end
2027
2023
 
2028
2024
  error_message = nil
@@ -2039,30 +2035,30 @@ EOT
2039
2035
  error_message = m[1] if m
2040
2036
  end
2041
2037
 
2042
- if error_message
2043
- File.unlink(path)
2044
- return OpenNebula::Error.new("Remote server error: #{error_message}")
2045
- end
2038
+ return unless error_message
2039
+
2040
+ File.unlink(path)
2041
+ OpenNebula::Error.new("Remote server error: #{error_message}")
2046
2042
  end
2047
2043
 
2048
- def OpenNebulaHelper.level_lock_to_str(str)
2044
+ def self.level_lock_to_str(str)
2049
2045
  level = str.to_i
2050
2046
  if level == 0
2051
- "None"
2047
+ 'None'
2052
2048
  elsif level == 1
2053
- "Use"
2049
+ 'Use'
2054
2050
  elsif level == 2
2055
- "Manage"
2051
+ 'Manage'
2056
2052
  elsif level == 3
2057
- "Admin"
2053
+ 'Admin'
2058
2054
  elsif level == 4
2059
- "All"
2055
+ 'All'
2060
2056
  else
2061
- "-"
2057
+ '-'
2062
2058
  end
2063
2059
  end
2064
2060
 
2065
- def OpenNebulaHelper.parse_user_inputs(inputs, keys = [])
2061
+ def self.parse_user_inputs(inputs, keys = [])
2066
2062
  unless inputs.keys == keys
2067
2063
  puts 'There are some parameters that require user input. ' \
2068
2064
  'Use the string <<EDITOR>> to launch an editor ' \
@@ -2132,7 +2128,7 @@ EOT
2132
2128
  # use default in case it's empty
2133
2129
  answer = initial if answer.empty?
2134
2130
 
2135
- unless %w[YES NO].include?(answer)
2131
+ unless ['YES', 'NO'].include?(answer)
2136
2132
  STDERR.puts "Invalid boolean '#{answer}'"
2137
2133
  STDERR.puts 'Boolean has to be YES or NO'
2138
2134
  exit(-1)
@@ -2160,8 +2156,8 @@ EOT
2160
2156
  answer = STDIN.readline.chop
2161
2157
 
2162
2158
  answer = initial if answer == ''
2163
- noanswer = ((answer == '') && optional)
2164
- end while !noanswer && (answer =~ exp) == nil
2159
+ noanswer = ((answer == '') && optional)
2160
+ end while !noanswer && (answer =~ exp).nil?
2165
2161
 
2166
2162
  if noanswer
2167
2163
  next
@@ -2198,7 +2194,7 @@ EOT
2198
2194
  answer = initial if answer == ''
2199
2195
 
2200
2196
  noanswer = (answer == '') && optional
2201
- end while !noanswer && ((answer =~ exp) == nil ||
2197
+ end while !noanswer && ((answer =~ exp).nil? ||
2202
2198
  answer.to_f < min || answer.to_f > max)
2203
2199
 
2204
2200
  if noanswer
@@ -2257,7 +2253,7 @@ EOT
2257
2253
  # @param title [String] Plot title
2258
2254
  #
2259
2255
  # @return Gnuplot plot object
2260
- def OpenNebulaHelper.get_plot(x, y, attr, title)
2256
+ def self.get_plot(x, y, attr, title)
2261
2257
  # Require gnuplot gem only here
2262
2258
  begin
2263
2259
  require 'gnuplot'
@@ -2307,7 +2303,7 @@ EOT
2307
2303
  # @param perm [String] Permissions in human readbale format
2308
2304
  #
2309
2305
  # @return [String] Permissions in octet format
2310
- def OpenNebulaHelper.to_octet(perm)
2306
+ def self.to_octet(perm)
2311
2307
  begin
2312
2308
  Integer(perm)
2313
2309
  perm