opennebula-cli 5.10.4 → 5.12.0

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 +2 -1
  3. data/bin/oneacl +2 -1
  4. data/bin/onecluster +2 -1
  5. data/bin/onedatastore +2 -1
  6. data/bin/oneflow +149 -551
  7. data/bin/oneflow-template +171 -292
  8. data/bin/onegroup +2 -1
  9. data/bin/onehook +2 -1
  10. data/bin/onehost +76 -9
  11. data/bin/oneimage +2 -1
  12. data/bin/onemarket +2 -1
  13. data/bin/onemarketapp +15 -3
  14. data/bin/onesecgroup +2 -1
  15. data/bin/oneshowback +2 -1
  16. data/bin/onetemplate +2 -1
  17. data/bin/oneuser +2 -1
  18. data/bin/onevcenter +2 -1
  19. data/bin/onevdc +2 -1
  20. data/bin/onevm +88 -16
  21. data/bin/onevmgroup +2 -1
  22. data/bin/onevnet +11 -3
  23. data/bin/onevntemplate +2 -1
  24. data/bin/onevrouter +2 -1
  25. data/bin/onezone +5 -1
  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 +8 -6
@@ -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 #
@@ -82,7 +82,7 @@ class OneImageHelper < OpenNebulaHelper::OneHelper
82
82
  :description => 'Path of the image file',
83
83
  :format => String,
84
84
  :proc => lambda do |o, _options|
85
- next [0, o] if o.match(%r{^https?://})
85
+ next [0, o] if o.match(%r{^(https?|docker)://})
86
86
 
87
87
  if o[0, 1]=='/'
88
88
  path=o
@@ -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 #
@@ -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 #
@@ -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 #
@@ -14,11 +14,23 @@
14
14
  # limitations under the License. #
15
15
  #--------------------------------------------------------------------------- #
16
16
 
17
+ require 'nokogiri'
17
18
  require 'securerandom'
18
19
 
19
20
  # OneProvision Helper
20
21
  class OneProvisionHelper < OpenNebulaHelper::OneHelper
21
22
 
23
+ RESOURCES = %w[
24
+ CLUSTERS
25
+ DATASTORES
26
+ HOSTS
27
+ NETWORKS
28
+ IMAGES
29
+ TEMPLATES
30
+ VNTEMPLATES
31
+ FLOWTEMPLATES
32
+ ]
33
+
22
34
  def self.rname
23
35
  'PROVISION'
24
36
  end
@@ -31,6 +43,7 @@ class OneProvisionHelper < OpenNebulaHelper::OneHelper
31
43
  OneProvision::OneProvisionLogger.get_logger(options)
32
44
  OneProvision::Mode.get_run_mode(options)
33
45
  OneProvision::Options.get_run_options(options)
46
+ OneProvision::ObjectOptions.get_obj_options(options)
34
47
  end
35
48
 
36
49
  def format_pool
@@ -46,26 +59,26 @@ class OneProvisionHelper < OpenNebulaHelper::OneHelper
46
59
  end
47
60
 
48
61
  column :CLUSTERS, 'Number of Clusters', :size => 8 do |p|
49
- p['CLUSTERS']['ID'].size
62
+ p['CLUSTERS']['ID'].size rescue 0
50
63
  end
51
64
 
52
65
  column :HOSTS, 'Number of Hosts', :size => 5 do |p|
53
- p['HOSTS']['ID'].size
66
+ p['HOSTS']['ID'].size rescue 0
54
67
  end
55
68
 
56
- column :VNETS, 'Number of Networks', :size => 5 do |p|
57
- p['VNETS']['ID'].size
69
+ column :NETWORKS, 'Number of Networks', :size => 5 do |p|
70
+ p['NETWORKS']['ID'].size rescue 0
58
71
  end
59
72
 
60
73
  column :DATASTORES, 'Number of Datastores', :size => 10 do |p|
61
- p['DATASTORES']['ID'].size
74
+ p['DATASTORES']['ID'].size rescue 0
62
75
  end
63
76
 
64
77
  column :STAT, 'Status of the Provision', :left, :size => 15 do |p|
65
- p['STATUS']
78
+ p['STATUS'] rescue '-'
66
79
  end
67
80
 
68
- default :ID, :NAME, :CLUSTERS, :HOSTS, :VNETS, :DATASTORES, :STAT
81
+ default :ID, :NAME, :CLUSTERS, :HOSTS, :NETWORKS, :DATASTORES, :STAT
69
82
  end
70
83
 
71
84
  table
@@ -75,14 +88,14 @@ class OneProvisionHelper < OpenNebulaHelper::OneHelper
75
88
  # Helper provision functions
76
89
  #######################################################################
77
90
 
78
- def create(config, cleanup, timeout)
91
+ def create(config, cleanup, timeout, virtual)
79
92
  msg = 'OpenNebula is not running'
80
93
 
81
94
  OneProvision::Utils.fail(msg) if OneProvision::Utils.one_running?
82
95
 
83
96
  provision = OneProvision::Provision.new(SecureRandom.uuid)
84
97
 
85
- provision.create(config, cleanup, timeout)
98
+ provision.create(config, cleanup, timeout, virtual)
86
99
  end
87
100
 
88
101
  def configure(provision_id, force)
@@ -105,8 +118,9 @@ class OneProvisionHelper < OpenNebulaHelper::OneHelper
105
118
  # Helper host functions
106
119
  #######################################################################
107
120
 
108
- def host_operation(host, operation, options, args)
109
- host = OneProvision::Host.new(host['ID'])
121
+ def host_operation(id, operation, options, args)
122
+ host = OneProvision::Host.new
123
+ host.info(id)
110
124
 
111
125
  case operation[:operation]
112
126
  when 'resume'
@@ -140,17 +154,17 @@ class OneProvisionHelper < OpenNebulaHelper::OneHelper
140
154
  end
141
155
 
142
156
  #######################################################################
143
- # Helper vnet functions
157
+ # Helper network functions
144
158
  #######################################################################
145
159
 
146
- def vnet_operation(vnet, operation)
160
+ def network_operation(network, operation)
147
161
  case operation[:operation]
148
162
  when 'delete'
149
- msg = "Deleting vnet #{vnet['ID']}"
163
+ msg = "Deleting network #{network['ID']}"
150
164
 
151
165
  OneProvision::OneProvisionLogger.info(msg)
152
166
 
153
- vnet.delete
167
+ network.delete
154
168
  end
155
169
  end
156
170
 
@@ -166,7 +180,7 @@ class OneProvisionHelper < OpenNebulaHelper::OneHelper
166
180
  case type
167
181
  when 'HOST' then helper = OneHostHelper.new
168
182
  when 'DATASTORE' then helper = OneDatastoreHelper.new
169
- when 'VNET' then helper = OneVNetHelper.new
183
+ when 'NETWORK' then helper = OneVNetHelper.new
170
184
  end
171
185
 
172
186
  objects = names_to_ids(args[0], type)
@@ -177,11 +191,11 @@ class OneProvisionHelper < OpenNebulaHelper::OneHelper
177
191
  operation[:message]) do |obj|
178
192
  case type
179
193
  when 'HOST'
180
- host_operation(obj, operation, options, args[1])
194
+ host_operation(obj['ID'], operation, options, args[1])
181
195
  when 'DATASTORE'
182
196
  datastore_operation(obj, operation)
183
- when 'VNET'
184
- vnet_operation(obj, operation)
197
+ when 'NETWORK'
198
+ network_operation(obj, operation)
185
199
  end
186
200
  end
187
201
  end
@@ -221,7 +235,7 @@ class OneProvisionHelper < OpenNebulaHelper::OneHelper
221
235
  objects
222
236
  end
223
237
 
224
- def get_list(columns, provision_list)
238
+ def get_list(provision_list)
225
239
  ret = []
226
240
  ids = provision_ids
227
241
 
@@ -237,12 +251,16 @@ class OneProvisionHelper < OpenNebulaHelper::OneHelper
237
251
  element['NAME'] = provision.name
238
252
  element['STATUS'] = provision.status
239
253
 
240
- columns.each do |c|
241
- element[c.to_s.upcase] = { 'ID' => [] }
242
-
243
- provision.instance_variable_get("@#{c}").each do |v|
244
- element[c.to_s.upcase]['ID'] << v['ID']
254
+ RESOURCES.each do |c|
255
+ obj = OneProvision::Resource.object(c)
256
+ obj_ids = obj.get(i).map do |o|
257
+ o['ID']
245
258
  end
259
+
260
+ next if obj_ids.empty?
261
+
262
+ element[c.to_s.upcase] = { 'ID' => [] }
263
+ element[c.to_s.upcase]['ID'] = obj_ids
246
264
  end
247
265
 
248
266
  ret << element
@@ -252,14 +270,18 @@ class OneProvisionHelper < OpenNebulaHelper::OneHelper
252
270
  end
253
271
 
254
272
  def list(options)
255
- columns = %w[clusters hosts vnets datastores]
273
+ list = get_list(true)
256
274
 
257
- format_pool.show(get_list(columns, true), options)
275
+ if options.key? :xml
276
+ list.map {|e| to_xml(e) }
277
+ else
278
+ format_pool.show(list, options)
279
+ end
258
280
 
259
281
  0
260
282
  end
261
283
 
262
- def show(provision_id)
284
+ def show(provision_id, xml)
263
285
  provision = OneProvision::Provision.new(provision_id)
264
286
 
265
287
  provision.refresh
@@ -267,56 +289,78 @@ class OneProvisionHelper < OpenNebulaHelper::OneHelper
267
289
  OneProvision::Utils.fail('Provision not found.') unless provision.exists
268
290
 
269
291
  ret = {}
270
- ret['id'] = provision_id
271
- ret['name'] = provision.name
272
- ret['status'] = provision.status
292
+ ret['ID'] = provision_id
293
+ ret['NAME'] = provision.name
294
+ ret['STATUS'] = provision.status
273
295
 
274
- %w[clusters datastores hosts vnets].each do |r|
275
- ret["@#{r}_ids"] = []
296
+ RESOURCES.each do |r|
297
+ obj = OneProvision::Resource.object(r)
276
298
 
277
- provision.instance_variable_get("@#{r}").each do |x|
278
- ret["@#{r}_ids"] << (x['ID'])
279
- end
299
+ next unless obj
300
+
301
+ obj_ids = obj.get(provision_id).map {|o| o['ID'] }
302
+
303
+ next if obj_ids.empty?
304
+
305
+ ret[r] = obj_ids
280
306
  end
281
307
 
282
- format_resource(ret)
308
+ if xml
309
+ to_xml(ret)
310
+ else
311
+ format_resource(ret)
312
+ end
283
313
 
284
314
  0
285
315
  end
286
316
 
287
317
  def format_resource(provision)
288
318
  str_h1 = '%-80s'
289
- status = provision['status']
290
- id = provision['id']
319
+ status = provision['STATUS']
320
+ id = provision['ID']
291
321
 
292
322
  CLIHelper.print_header(str_h1 % "PROVISION #{id} INFORMATION")
293
323
  puts format('ID : %<s>s', :s => id)
294
- puts format('NAME : %<s>s', :s => provision['name'])
324
+ puts format('NAME : %<s>s', :s => provision['NAME'])
295
325
  puts format('STATUS : %<s>s', :s => CLIHelper.color_state(status))
296
326
 
297
- puts
298
- CLIHelper.print_header(format('%<s>s', :s => 'CLUSTERS'))
299
- provision['@clusters_ids'].each do |i|
300
- puts format('%<s>s', :s => i)
301
- end
327
+ RESOURCES.each do |r|
328
+ next unless provision[r]
302
329
 
303
- puts
304
- CLIHelper.print_header(format('%<s>s', :s => 'HOSTS'))
305
- provision['@hosts_ids'].each do |i|
306
- puts format('%<s>s', :s => i)
330
+ puts
331
+ CLIHelper.print_header(format('%<s>s', :s => r.upcase))
332
+ provision[r].each do |i|
333
+ puts format('%<s>s', :s => i)
334
+ end
307
335
  end
336
+ end
308
337
 
309
- puts
310
- CLIHelper.print_header(format('%<s>s', :s => 'VNETS'))
311
- provision['@vnets_ids'].each do |i|
312
- puts format('%<s>s', :s => i)
313
- end
338
+ private
314
339
 
315
- puts
316
- CLIHelper.print_header(format('%<s>s', :s => 'DATASTORES'))
317
- provision['@datastores_ids'].each do |i|
318
- puts format('%<s>s', :s => i)
319
- end
340
+ def to_xml(provision)
341
+ xml = "<PROVISION>
342
+ <ID>#{provision['ID']}</ID>
343
+ <NAME>#{provision['NAME']}</NAME>
344
+ <STATUS>#{provision['STATUS']}</STATUS>
345
+ #{
346
+ RESOURCES.map do |r|
347
+ next unless provision[r]
348
+
349
+ provision[r] = provision[r]['ID'] if provision[r].is_a? Hash
350
+
351
+ ids = provision[r].map do |id|
352
+ "<ID>#{id}</ID>"
353
+ end.join("\n")
354
+
355
+ "<#{r.upcase}>
356
+ #{ids}
357
+ </#{r.upcase}"
358
+ end.join("\n")
359
+ }
360
+ </PROVISION>"
361
+
362
+ doc = Nokogiri.XML(xml) {|config| config.default_xml.noblanks }
363
+ puts doc.root.to_xml(:indent => 2)
320
364
  end
321
365
 
322
366
  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 #
@@ -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 #
@@ -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 #
@@ -131,192 +131,21 @@ EOT
131
131
  def self.get_user_inputs(template, get_defaults = false)
132
132
  user_inputs = template['VMTEMPLATE']['TEMPLATE']['USER_INPUTS']
133
133
 
134
- return "" if !user_inputs
134
+ return '' unless user_inputs
135
135
 
136
- answers = ""
137
-
138
- unless get_defaults
139
- puts 'There are some parameters that require user input. ' \
140
- 'Use the string <<EDITOR>> to launch an editor ' \
141
- '(e.g. for multi-line inputs)'
142
- end
143
-
144
- user_inputs.each do |key, val|
145
- input_cfg = val.split('|', -1)
146
-
147
- if input_cfg.length < 3
148
- STDERR.puts "Malformed user input. It should have at least 3 parts separated by '|':"
149
- STDERR.puts " #{key}: #{val}"
150
- exit(-1)
151
- end
152
-
153
- mandatory, type, description, params, initial = input_cfg
154
- optional = mandatory.strip == "O"
155
- type.strip!
156
- description.strip!
157
-
158
- if input_cfg.length > 3
159
- if input_cfg.length != 5
160
- STDERR.puts "Malformed user input. It should have 5 parts separated by '|':"
161
- STDERR.puts " #{key}: #{val}"
162
- exit(-1)
163
- end
164
-
165
- params.strip!
166
- initial.strip!
167
- end
168
-
169
- if get_defaults
170
- answers << "#{key}=\"#{initial}\"" unless mandatory == 'M'
171
- next
172
- end
173
-
174
- puts " * (#{key}) #{description}"
175
-
176
- header = " "
177
- if initial != nil && initial != ""
178
- header += "Press enter for default (#{initial}). "
179
- end
180
-
181
- case type
182
- when 'text', 'text64'
183
- print header
184
-
185
- answer = STDIN.readline.chop
186
-
187
- if answer == "<<EDITOR>>"
188
- answer = OpenNebulaHelper.editor_input()
189
- end
190
-
191
- if type == 'text64'
192
- answer = Base64::encode64(answer).strip.delete("\n")
193
- end
194
-
195
- when 'boolean'
196
- print header
197
-
198
- answer = STDIN.readline.chop
199
-
200
- # use default in case it's empty
201
- answer = initial if answer.empty?
202
-
203
- unless %w[YES NO].include?(answer)
204
- STDERR.puts "Invalid boolean '#{answer}'"
205
- STDERR.puts 'Boolean has to be YES or NO'
206
- exit(-1)
207
- end
208
-
209
- when 'password'
210
- print header
211
-
212
- answer = OpenNebulaHelper::OneHelper.get_password
213
-
214
- when 'number', 'number-float'
215
- if type == "number"
216
- header += "Integer: "
217
- exp = INT_EXP
218
- else
219
- header += "Float: "
220
- exp = FLOAT_EXP
221
- end
222
-
223
- begin
224
- print header
225
- answer = STDIN.readline.chop
226
-
227
- answer = initial if (answer == "")
228
-
229
- noanswer = ((answer == "") && optional)
230
- end while !noanswer && (answer =~ exp) == nil
231
-
232
- if noanswer
233
- next
234
- end
235
-
236
- when 'range', 'range-float'
237
- min,max = params.split('..')
238
-
239
- if min.nil? || max.nil?
240
- STDERR.puts "Malformed user input. Parameters should be 'min..max':"
241
- STDERR.puts " #{key}: #{val}"
242
- exit(-1)
243
- end
244
-
245
- if type == "range"
246
- exp = INT_EXP
247
- min = min.to_i
248
- max = max.to_i
249
-
250
- header += "Integer in the range [#{min}..#{max}]: "
251
- else
252
- exp = FLOAT_EXP
253
- min = min.to_f
254
- max = max.to_f
255
-
256
- header += "Float in the range [#{min}..#{max}]: "
257
- end
258
-
259
- begin
260
- print header
261
- answer = STDIN.readline.chop
262
-
263
- answer = initial if (answer == "")
264
-
265
- noanswer = ((answer == "") && optional)
266
- end while !noanswer && ((answer =~ exp) == nil || answer.to_f < min || answer.to_f > max)
267
-
268
- if noanswer
269
- next
270
- end
271
-
272
- when 'list'
273
- options = params.split(",")
274
-
275
- options.each_with_index {|opt,i|
276
- puts " #{i} #{opt}"
277
- }
278
-
279
- puts
280
-
281
- header += "Please type the selection number: "
282
-
283
- begin
284
- print header
285
- answer = STDIN.readline.chop
286
-
287
- if (answer == "")
288
- answer = initial
289
- else
290
- answer = options[answer.to_i]
291
- end
292
-
293
- noanswer = ((answer == "") && optional)
294
-
295
- end while !noanswer && (!options.include?(answer))
296
-
297
- if noanswer
298
- next
299
- end
300
-
301
- when 'fixed'
302
- puts " Fixed value of (#{initial}). Cannot be changed"
303
- answer = initial
304
-
305
- else
306
- STDERR.puts "Wrong type for user input:"
307
- STDERR.puts " #{key}: #{val}"
308
- exit(-1)
309
- end
136
+ answers = OpenNebulaHelper.parse_user_inputs(user_inputs, get_defaults)
310
137
 
138
+ answers_s = ''
139
+ answers.each do |key, val|
311
140
  # Do not replace values that are equal to the ones already in the
312
141
  # template. Useful for cpu, mem, vcpu
313
- if answer != template['VMTEMPLATE']['TEMPLATE'][key]
314
- answers << "#{key} = \""
315
- answers << answer.gsub('"', "\\\"") << "\"\n"
142
+ if key != template['VMTEMPLATE']['TEMPLATE'][key]
143
+ answers_s << "#{key} = \""
144
+ answers_s << val.gsub('"', "\\\"") << "\"\n"
316
145
  end
317
146
  end
318
147
 
319
- answers
148
+ answers_s
320
149
  end
321
150
 
322
151
  private