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,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 #
@@ -63,15 +63,15 @@ class OneClusterHelper < OpenNebulaHelper::OneHelper
63
63
  end
64
64
 
65
65
  column :HOSTS, "Number of Hosts", :size=>5 do |d|
66
- @ext.element_size(d,"HOSTS")
66
+ @ext.element_size(d,"HOSTS") rescue 0
67
67
  end
68
68
 
69
69
  column :VNETS, "Number of Networks", :size=>5 do |d|
70
- @ext.element_size(d,"VNETS")
70
+ @ext.element_size(d,"VNETS") rescue 0
71
71
  end
72
72
 
73
73
  column :DATASTORES, "Number of Datastores", :size=>10 do |d|
74
- @ext.element_size(d,"DATASTORES")
74
+ @ext.element_size(d,"DATASTORES") rescue 0
75
75
  end
76
76
 
77
77
  default :ID, :NAME, :HOSTS, :VNETS, :DATASTORES
@@ -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 #
@@ -0,0 +1,419 @@
1
+ # -------------------------------------------------------------------------- #
2
+ # Copyright 2002-2020, OpenNebula Project, OpenNebula Systems #
3
+ # #
4
+ # Licensed under the Apache License, Version 2.0 (the "License"); you may #
5
+ # not use this file except in compliance with the License. You may obtain #
6
+ # a copy of the License at #
7
+ # #
8
+ # http://www.apache.org/licenses/LICENSE-2.0 #
9
+ # #
10
+ # Unless required by applicable law or agreed to in writing, software #
11
+ # distributed under the License is distributed on an "AS IS" BASIS, #
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
13
+ # See the License for the specific language governing permissions and #
14
+ # limitations under the License. #
15
+ #--------------------------------------------------------------------------- #
16
+
17
+ require 'one_helper'
18
+
19
+ # Oneflow command helper
20
+ class OneFlowHelper < OpenNebulaHelper::OneHelper
21
+
22
+ # Configuration file
23
+ def self.conf_file
24
+ 'oneflow.yaml'
25
+ end
26
+
27
+ # Get client to make request
28
+ #
29
+ # @options [Hash] CLI options
30
+ def client(options)
31
+ Service::Client.new(
32
+ :username => options[:username],
33
+ :password => options[:password],
34
+ :url => options[:server],
35
+ :user_agent => USER_AGENT
36
+ )
37
+ end
38
+
39
+ # Get service pool table
40
+ def format_service_pool
41
+ config_file = self.class.table_conf
42
+
43
+ CLIHelper::ShowTable.new(config_file, self) do
44
+ column :ID, 'ID', :size => 10 do |d|
45
+ d['ID']
46
+ end
47
+
48
+ column :USER, 'Username', :left, :size => 15 do |d|
49
+ d['UNAME']
50
+ end
51
+
52
+ column :GROUP, 'Group', :left, :size => 15 do |d|
53
+ d['GNAME']
54
+ end
55
+
56
+ column :NAME, 'Name', :expand => true, :left => true do |d|
57
+ d['NAME']
58
+ end
59
+
60
+ column :STAT, 'State', :size => 11, :left => true do |d|
61
+ Service.state_str(d['TEMPLATE']['BODY']['state'])
62
+ end
63
+
64
+ default :ID, :USER, :GROUP, :NAME, :STAT
65
+ end
66
+ end
67
+
68
+ # List service pool
69
+ #
70
+ # @param client [Service::Client] Petition client
71
+ # @param options [Hash] CLI options
72
+ def list_service_pool(client, options)
73
+ response = client.get(RESOURCE_PATH)
74
+
75
+ if CloudClient.is_error?(response)
76
+ [response.code.to_i, response.to_s]
77
+ else
78
+ array_list = JSON.parse(response.body)
79
+ array_list = array_list['DOCUMENT_POOL']['DOCUMENT']
80
+
81
+ array_list = [] if array_list.nil?
82
+
83
+ unless options.key? :done
84
+ # remove from list flows in DONE state
85
+ array_list.reject! do |value|
86
+ value['TEMPLATE']['BODY']['state'] == 5
87
+ end
88
+ end
89
+
90
+ if options[:json]
91
+ if array_list.empty?
92
+ 0
93
+ else
94
+ [0, JSON.pretty_generate(array_list)]
95
+ end
96
+ else
97
+ format_service_pool.show(array_list)
98
+
99
+ 0
100
+ end
101
+ end
102
+ end
103
+
104
+ # List service pool continiously
105
+ #
106
+ # @param client [Service::Client] Petition client
107
+ # @param options [Hash] CLI options
108
+ def top_service_pool(client, options)
109
+ # TODO: make default delay configurable
110
+ options[:delay] ? delay = options[:delay] : delay = 4
111
+
112
+ begin
113
+ loop do
114
+ CLIHelper.scr_cls
115
+ CLIHelper.scr_move(0, 0)
116
+
117
+ list_service_pool(client, options)
118
+
119
+ sleep delay
120
+ end
121
+ rescue StandardError => e
122
+ STDERR.puts e.message
123
+ exit(-1)
124
+ end
125
+
126
+ 0
127
+ end
128
+
129
+ # Show service detailed information
130
+ #
131
+ # @param client [Service::Client] Petition client
132
+ # @param service [Integer] Service ID
133
+ # @param options [Hash] CLI options
134
+ def format_resource(client, service, options)
135
+ response = client.get("#{RESOURCE_PATH}/#{service}")
136
+
137
+ if CloudClient.is_error?(response)
138
+ [response.code.to_i, response.to_s]
139
+ else
140
+ if options[:json]
141
+ [0, response.body]
142
+ else
143
+ str_h1 = '%-80s'
144
+ document = JSON.parse(response.body)['DOCUMENT']
145
+ template = document['TEMPLATE']['BODY']
146
+
147
+ CLIHelper.print_header(
148
+ str_h1 % "SERVICE #{document['ID']} INFORMATION"
149
+ )
150
+
151
+ print_service_info(document)
152
+
153
+ print_roles_info(template['roles'])
154
+
155
+ return 0 unless template['log']
156
+
157
+ CLIHelper.print_header(str_h1 % 'LOG MESSAGES', false)
158
+
159
+ template['log'].each do |log|
160
+ t = Time.at(log['timestamp']).strftime('%m/%d/%y %H:%M')
161
+ puts "#{t} [#{log['severity']}] #{log['message']}"
162
+ end
163
+
164
+ 0
165
+ end
166
+ end
167
+ end
168
+
169
+ # Get policy adjust information in str format
170
+ #
171
+ # @param policy [Hash] Policy information
172
+ def self.adjust_str(policy)
173
+ policy['adjust'].to_i >= 0 ? sign = '+' : sign = '-'
174
+ adjust = policy['adjust'].to_i.abs
175
+
176
+ case policy['type']
177
+ when 'CARDINALITY'
178
+ "= #{adjust}"
179
+ when 'PERCENTAGE_CHANGE'
180
+ st = "#{sign} #{adjust} %"
181
+
182
+ if policy['min_adjust_step']
183
+ st << " (#{policy['min_adjust_step']})"
184
+ end
185
+
186
+ st
187
+ else
188
+ "#{sign} #{adjust}"
189
+ end
190
+ end
191
+
192
+ private
193
+
194
+ # Get nodes pool table
195
+ def format_node_pool
196
+ # TODO: config file
197
+ CLIHelper::ShowTable.new(nil, self) do
198
+ column :VM_ID,
199
+ 'ONE identifier for Virtual Machine',
200
+ :size => 6 do |d|
201
+ st = ''
202
+
203
+ if d['scale_up']
204
+ st << '\u2191 '
205
+ elsif d['disposed']
206
+ st << '\u2193 '
207
+ end
208
+
209
+ if d['vm_info'].nil?
210
+ st << d['deploy_id'].to_s
211
+ else
212
+ st << d['vm_info']['VM']['ID']
213
+ end
214
+
215
+ st
216
+ end
217
+
218
+ column :NAME,
219
+ 'Name of the Virtual Machine',
220
+ :left,
221
+ :size => 24 do |d|
222
+ if !d['vm_info'].nil?
223
+ if d['vm_info']['VM']['RESCHED'] == '1'
224
+ "*#{d['NAME']}"
225
+ else
226
+ d['vm_info']['VM']['NAME']
227
+ end
228
+ else
229
+ ''
230
+ end
231
+ end
232
+
233
+ column :USER,
234
+ 'Username of the Virtual Machine owner',
235
+ :left,
236
+ :size => 15 do |d|
237
+ if !d['vm_info'].nil?
238
+ d['vm_info']['VM']['UNAME']
239
+ else
240
+ ''
241
+ end
242
+ end
243
+
244
+ column :GROUP,
245
+ 'Group of the Virtual Machine',
246
+ :left,
247
+ :size => 15 do |d|
248
+ if !d['vm_info'].nil?
249
+ d['vm_info']['VM']['GNAME']
250
+ else
251
+ ''
252
+ end
253
+ end
254
+
255
+ default :VM_ID, :NAME, :USER, :GROUP
256
+ end
257
+ end
258
+
259
+ # Print service information
260
+ #
261
+ # @param document [Hash] Service document information
262
+ def print_service_info(document)
263
+ str = '%-20s: %-20s'
264
+ str_h1 = '%-80s'
265
+ template = document['TEMPLATE']['BODY']
266
+
267
+ puts Kernel.format(str, 'ID', document['ID'])
268
+ puts Kernel.format(str, 'NAME', document['NAME'])
269
+ puts Kernel.format(str, 'USER', document['UNAME'])
270
+ puts Kernel.format(str, 'GROUP', document['GNAME'])
271
+
272
+ puts Kernel.format(str, 'STRATEGY', template['deployment'])
273
+ puts Kernel.format(str,
274
+ 'SERVICE STATE',
275
+ Service.state_str(template['state']))
276
+
277
+ if template['shutdown_action']
278
+ puts Kernel.format(str, 'SHUTDOWN', template['shutdown_action'])
279
+ end
280
+
281
+ puts
282
+
283
+ CLIHelper.print_header(str_h1 % 'PERMISSIONS', false)
284
+
285
+ %w[OWNER GROUP OTHER].each do |e|
286
+ mask = '---'
287
+ permissions_hash = document['PERMISSIONS']
288
+ mask[0] = 'u' if permissions_hash["#{e}_U"] == '1'
289
+ mask[1] = 'm' if permissions_hash["#{e}_M"] == '1'
290
+ mask[2] = 'a' if permissions_hash["#{e}_A"] == '1'
291
+
292
+ puts Kernel.format(str, e, mask)
293
+ end
294
+
295
+ puts
296
+ end
297
+
298
+ # Print service roles information
299
+ #
300
+ # @param roles [Array] Service roles information
301
+ def print_roles_info(roles)
302
+ str = '%-20s: %-20s'
303
+
304
+ roles.each do |role|
305
+ CLIHelper.print_header("ROLE #{role['name']}", false)
306
+
307
+ puts Kernel.format(str,
308
+ 'ROLE STATE',
309
+ Role.state_str(role['state']))
310
+
311
+ if role['parents']
312
+ puts Kernel.format(str,
313
+ 'PARENTS',
314
+ role['parents'].join(', '))
315
+ end
316
+
317
+ puts Kernel.format(str, 'VM TEMPLATE', role['vm_template'])
318
+ puts Kernel.format(str, 'CARDINALITY', role['cardinality'])
319
+
320
+ if role['min_vms']
321
+ puts Kernel.format(str, 'MIN VMS', role['min_vms'])
322
+ end
323
+
324
+ if role['max_vms']
325
+ puts Kernel.format(str, 'MAX VMS', role['max_vms'])
326
+ end
327
+
328
+ if role['coolddown']
329
+ puts Kernel.format(str, 'COOLDOWN', "#{role['cooldown']}s")
330
+ end
331
+
332
+ if role['shutdown_action']
333
+ puts Kernel.format(str, 'SHUTDOWN', role['shutdown_action'])
334
+ end
335
+
336
+ if role['elasticity_policies'] &&
337
+ !role['elasticity_policies'].empty?
338
+ print_elasticity_info(role)
339
+ end
340
+
341
+ if role['scheduled_policies'] &&
342
+ !role['scheduled_policies'].empty?
343
+ print_scheduled_info(role)
344
+ end
345
+
346
+ puts
347
+ CLIHelper.print_header('NODES INFORMATION', false)
348
+
349
+ format_node_pool.show(role['nodes'])
350
+ puts
351
+ end
352
+ end
353
+
354
+ # Print role elasticity info
355
+ #
356
+ # @param role [OpenNebula::Role] Role information
357
+ def print_elasticity_info(role)
358
+ puts
359
+ CLIHelper.print_header('ROLE ELASTICITY', false)
360
+
361
+ CLIHelper::ShowTable.new(nil, self) do
362
+ column :ADJUST, '', :left, :size => 12 do |d|
363
+ OneFlowHelper.adjust_str(d)
364
+ end
365
+
366
+ column :EXPRESSION, '', :left, :size => 48 do |d|
367
+ if !d['expression_evaluated'].nil?
368
+ d['expression_evaluated']
369
+ else
370
+ d['expression']
371
+ end
372
+ end
373
+
374
+ column :EVALS, '', :right, :size => 5 do |d|
375
+ if d['period_number']
376
+ "#{d['true_evals'].to_i}/"\
377
+ "#{d['period_number']}"
378
+ else
379
+ '-'
380
+ end
381
+ end
382
+
383
+ column :PERIOD, '', :size => 6 do |d|
384
+ d['period'] ? "#{d['period']}s" : '-'
385
+ end
386
+
387
+ column :COOL, '', :size => 5 do |d|
388
+ d['cooldown'] ? "#{d['cooldown']}s" : '-'
389
+ end
390
+
391
+ default :ADJUST, :EXPRESSION, :EVALS, :PERIOD, :COOL
392
+ end.show([role['elasticity_policies']].flatten, {})
393
+ end
394
+
395
+ # Print role schedule info
396
+ #
397
+ # @param role [OpenNebula::Role] Role information
398
+ def print_scheduled_info(role)
399
+ puts
400
+ CLIHelper.print_header('ROLE ELASTICITY SCHEDULE', false)
401
+
402
+ CLIHelper::ShowTable.new(nil, self) do
403
+ column :ADJUST, '', :left, :size => 12 do |d|
404
+ OneFlowHelper.adjust_str(d)
405
+ end
406
+
407
+ column :TIME, '', :left, :size => 67 do |d|
408
+ if d['start_time']
409
+ Time.parse(d['start_time']).to_s
410
+ else
411
+ d['recurrence']
412
+ end
413
+ end
414
+
415
+ default :ADJUST, :TIME
416
+ end.show([role['scheduled_policies']].flatten, {})
417
+ end
418
+
419
+ end