opennebula-cli 5.10.4 → 5.12.0

Sign up to get free protection for your applications and to get access to all the features.
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