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.
- checksums.yaml +4 -4
- data/bin/oneacct +2 -1
- data/bin/oneacl +2 -1
- data/bin/onecluster +2 -1
- data/bin/onedatastore +2 -1
- data/bin/oneflow +149 -551
- data/bin/oneflow-template +171 -292
- data/bin/onegroup +2 -1
- data/bin/onehook +2 -1
- data/bin/onehost +76 -9
- data/bin/oneimage +2 -1
- data/bin/onemarket +2 -1
- data/bin/onemarketapp +15 -3
- data/bin/onesecgroup +2 -1
- data/bin/oneshowback +2 -1
- data/bin/onetemplate +2 -1
- data/bin/oneuser +2 -1
- data/bin/onevcenter +2 -1
- data/bin/onevdc +2 -1
- data/bin/onevm +88 -16
- data/bin/onevmgroup +2 -1
- data/bin/onevnet +11 -3
- data/bin/onevntemplate +2 -1
- data/bin/onevrouter +2 -1
- data/bin/onezone +5 -1
- data/lib/cli_helper.rb +54 -30
- data/lib/command_parser.rb +33 -14
- data/lib/one_helper.rb +258 -6
- data/lib/one_helper/oneacct_helper.rb +1 -1
- data/lib/one_helper/oneacl_helper.rb +1 -1
- data/lib/one_helper/onecluster_helper.rb +4 -4
- data/lib/one_helper/onedatastore_helper.rb +1 -1
- data/lib/one_helper/oneflow_helper.rb +419 -0
- data/lib/one_helper/oneflowtemplate_helper.rb +312 -0
- data/lib/one_helper/onegroup_helper.rb +1 -1
- data/lib/one_helper/onehook_helper.rb +1 -1
- data/lib/one_helper/onehost_helper.rb +148 -68
- data/lib/one_helper/oneimage_helper.rb +2 -2
- data/lib/one_helper/onemarket_helper.rb +1 -1
- data/lib/one_helper/onemarketapp_helper.rb +1 -1
- data/lib/one_helper/oneprovision_helper.rb +104 -60
- data/lib/one_helper/onequota_helper.rb +1 -1
- data/lib/one_helper/onesecgroup_helper.rb +1 -1
- data/lib/one_helper/onetemplate_helper.rb +9 -180
- data/lib/one_helper/oneuser_helper.rb +1 -1
- data/lib/one_helper/onevcenter_helper.rb +2 -1
- data/lib/one_helper/onevdc_helper.rb +1 -1
- data/lib/one_helper/onevm_helper.rb +11 -6
- data/lib/one_helper/onevmgroup_helper.rb +1 -1
- data/lib/one_helper/onevnet_helper.rb +1 -1
- data/lib/one_helper/onevntemplate_helper.rb +1 -1
- data/lib/one_helper/onevrouter_helper.rb +1 -1
- data/lib/one_helper/onezone_helper.rb +3 -1
- metadata +8 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d3699c3c2d650493465035066057a79c20a59f40
|
4
|
+
data.tar.gz: 1577fe3f9e9ca3af5db399a0d9bc3587ad81cea4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7c85e13cf698bcb599380d24b4eff94fc8c5ea157947ba42ec4bf2cd56bbf83043a4bc660fe78da567e35b3c4f0b9780fcbc1105886d79bc05d21e6495fdb295
|
7
|
+
data.tar.gz: 334c79870dd8a1dde30dfd971f0007d8f925cb1bccc870d863a0e86509f9840671754a4a4b17ec51d21f29cd458997e4a99140c3aa325c210018120e6e8012a9
|
data/bin/oneacct
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
3
|
# -------------------------------------------------------------------------- #
|
4
|
-
# Copyright 2002-
|
4
|
+
# Copyright 2002-2020, OpenNebula Project, OpenNebula Systems #
|
5
5
|
# #
|
6
6
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may #
|
7
7
|
# not use this file except in compliance with the License. You may obtain #
|
@@ -28,6 +28,7 @@ end
|
|
28
28
|
|
29
29
|
if File.directory?(GEMS_LOCATION)
|
30
30
|
Gem.use_paths(GEMS_LOCATION)
|
31
|
+
$LOAD_PATH.reject! {|l| l =~ /(vendor|site)_ruby/ }
|
31
32
|
end
|
32
33
|
|
33
34
|
$LOAD_PATH << RUBY_LIB_LOCATION
|
data/bin/oneacl
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
3
|
# -------------------------------------------------------------------------- #
|
4
|
-
# Copyright 2002-
|
4
|
+
# Copyright 2002-2020, OpenNebula Project, OpenNebula Systems #
|
5
5
|
# #
|
6
6
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may #
|
7
7
|
# not use this file except in compliance with the License. You may obtain #
|
@@ -28,6 +28,7 @@ end
|
|
28
28
|
|
29
29
|
if File.directory?(GEMS_LOCATION)
|
30
30
|
Gem.use_paths(GEMS_LOCATION)
|
31
|
+
$LOAD_PATH.reject! {|l| l =~ /(vendor|site)_ruby/ }
|
31
32
|
end
|
32
33
|
|
33
34
|
$LOAD_PATH << RUBY_LIB_LOCATION
|
data/bin/onecluster
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
3
|
# -------------------------------------------------------------------------- #
|
4
|
-
# Copyright 2002-
|
4
|
+
# Copyright 2002-2020, OpenNebula Project, OpenNebula Systems #
|
5
5
|
# #
|
6
6
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may #
|
7
7
|
# not use this file except in compliance with the License. You may obtain #
|
@@ -28,6 +28,7 @@ end
|
|
28
28
|
|
29
29
|
if File.directory?(GEMS_LOCATION)
|
30
30
|
Gem.use_paths(GEMS_LOCATION)
|
31
|
+
$LOAD_PATH.reject! {|l| l =~ /(vendor|site)_ruby/ }
|
31
32
|
end
|
32
33
|
|
33
34
|
$LOAD_PATH << RUBY_LIB_LOCATION
|
data/bin/onedatastore
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
3
|
# -------------------------------------------------------------------------- #
|
4
|
-
# Copyright 2002-
|
4
|
+
# Copyright 2002-2020, OpenNebula Project, OpenNebula Systems #
|
5
5
|
# #
|
6
6
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may #
|
7
7
|
# not use this file except in compliance with the License. You may obtain #
|
@@ -28,6 +28,7 @@ end
|
|
28
28
|
|
29
29
|
if File.directory?(GEMS_LOCATION)
|
30
30
|
Gem.use_paths(GEMS_LOCATION)
|
31
|
+
$LOAD_PATH.reject! {|l| l =~ /(vendor|site)_ruby/ }
|
31
32
|
end
|
32
33
|
|
33
34
|
$LOAD_PATH << RUBY_LIB_LOCATION
|
data/bin/oneflow
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
3
|
# -------------------------------------------------------------------------- #
|
4
|
-
# Copyright 2002-
|
4
|
+
# Copyright 2002-2020, OpenNebula Project, OpenNebula Systems #
|
5
5
|
# #
|
6
6
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may #
|
7
7
|
# not use this file except in compliance with the License. You may obtain #
|
@@ -28,375 +28,23 @@ end
|
|
28
28
|
|
29
29
|
if File.directory?(GEMS_LOCATION)
|
30
30
|
Gem.use_paths(GEMS_LOCATION)
|
31
|
+
$LOAD_PATH.reject! {|l| l =~ /(vendor|site)_ruby/ }
|
31
32
|
end
|
32
33
|
|
33
34
|
$LOAD_PATH << RUBY_LIB_LOCATION
|
34
35
|
$LOAD_PATH << RUBY_LIB_LOCATION + '/cli'
|
35
36
|
|
37
|
+
require 'json'
|
38
|
+
|
36
39
|
require 'command_parser'
|
37
40
|
require 'opennebula/oneflow_client'
|
38
|
-
|
39
|
-
require 'cli_helper'
|
40
|
-
require 'one_helper/onevm_helper'
|
41
|
-
|
42
|
-
require 'json'
|
41
|
+
require 'one_helper/oneflow_helper'
|
43
42
|
|
44
43
|
USER_AGENT = 'CLI'
|
45
44
|
|
46
45
|
# Base Path representing the resource to be used in the requests
|
47
46
|
RESOURCE_PATH = '/service'
|
48
47
|
|
49
|
-
#
|
50
|
-
# Table
|
51
|
-
#
|
52
|
-
|
53
|
-
SERVICE_TABLE = CLIHelper::ShowTable.new(nil, self) do
|
54
|
-
column :ID, 'ID', :size => 10 do |d|
|
55
|
-
d['ID']
|
56
|
-
end
|
57
|
-
|
58
|
-
column :USER, 'Username', :left, :size => 15 do |d|
|
59
|
-
d['UNAME']
|
60
|
-
end
|
61
|
-
|
62
|
-
column :GROUP, 'Group', :left, :size => 15 do |d|
|
63
|
-
d['GNAME']
|
64
|
-
end
|
65
|
-
|
66
|
-
column :NAME, 'Name', :size => 25, :left => true do |d|
|
67
|
-
d['NAME']
|
68
|
-
end
|
69
|
-
|
70
|
-
column :STATE, 'State', :size => 11, :left => true do |d|
|
71
|
-
Service.state_str(d['TEMPLATE']['BODY']['state'])
|
72
|
-
end
|
73
|
-
|
74
|
-
default :ID, :USER, :GROUP, :NAME, :STATE
|
75
|
-
end
|
76
|
-
|
77
|
-
NODE_TABLE = CLIHelper::ShowTable.new(nil, self) do
|
78
|
-
column :VM_ID, 'ONE identifier for Virtual Machine', :size => 6 do |d|
|
79
|
-
st = ''
|
80
|
-
if d['scale_up']
|
81
|
-
st << '\u2191 '
|
82
|
-
elsif d['disposed']
|
83
|
-
st << '\u2193 '
|
84
|
-
end
|
85
|
-
|
86
|
-
if d['vm_info'].nil?
|
87
|
-
st << d['deploy_id'].to_s
|
88
|
-
else
|
89
|
-
st << d['vm_info']['VM']['ID']
|
90
|
-
end
|
91
|
-
|
92
|
-
st
|
93
|
-
end
|
94
|
-
|
95
|
-
column :NAME, 'Name of the Virtual Machine', :left,
|
96
|
-
:size => 23 do |d|
|
97
|
-
if !d['vm_info'].nil?
|
98
|
-
if d['vm_info']['VM']['RESCHED'] == '1'
|
99
|
-
"*#{d['NAME']}"
|
100
|
-
else
|
101
|
-
d['vm_info']['VM']['NAME']
|
102
|
-
end
|
103
|
-
else
|
104
|
-
''
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
|
-
column :USER, 'Username of the Virtual Machine owner', :left,
|
109
|
-
:size => 8 do |d|
|
110
|
-
if !d['vm_info'].nil?
|
111
|
-
d['vm_info']['VM']['UNAME']
|
112
|
-
else
|
113
|
-
''
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
|
-
column :GROUP, 'Group of the Virtual Machine', :left,
|
118
|
-
:size => 8 do |d|
|
119
|
-
if !d['vm_info'].nil?
|
120
|
-
d['vm_info']['VM']['GNAME']
|
121
|
-
else
|
122
|
-
''
|
123
|
-
end
|
124
|
-
end
|
125
|
-
|
126
|
-
column :STAT, 'Actual status', :size => 4 do |d, _|
|
127
|
-
if !d['vm_info'].nil?
|
128
|
-
OneVMHelper.state_to_str(d['vm_info']['VM']['STATE'],
|
129
|
-
d['vm_info']['VM']['LCM_STATE'])
|
130
|
-
else
|
131
|
-
''
|
132
|
-
end
|
133
|
-
end
|
134
|
-
|
135
|
-
column :UCPU, 'CPU percentage used by the VM', :size => 4 do |d|
|
136
|
-
if !d['vm_info'].nil?
|
137
|
-
d['vm_info']['VM']['CPU']
|
138
|
-
else
|
139
|
-
''
|
140
|
-
end
|
141
|
-
end
|
142
|
-
|
143
|
-
column :UMEM, 'Memory used by the VM', :size => 7 do |d|
|
144
|
-
if !d['vm_info'].nil?
|
145
|
-
OpenNebulaHelper.unit_to_str(d['vm_info']['VM']['MEMORY'].to_i, {})
|
146
|
-
else
|
147
|
-
''
|
148
|
-
end
|
149
|
-
end
|
150
|
-
|
151
|
-
column :HOST, 'Host where the VM is running', :left, :size => 20 do |d|
|
152
|
-
if !d['vm_info'].nil?
|
153
|
-
if d['vm_info']['VM']['HISTORY_RECORDS'] &&
|
154
|
-
d['vm_info']['VM']['HISTORY_RECORDS']['HISTORY']
|
155
|
-
state_str =
|
156
|
-
VirtualMachine::VM_STATE[d['vm_info']['VM']['STATE'].to_i]
|
157
|
-
history = d['vm_info']['VM']['HISTORY_RECORDS']['HISTORY']
|
158
|
-
if %w[ACTIVE SUSPENDED].include? state_str
|
159
|
-
history = history.last if history.instance_of?(Array)
|
160
|
-
history['HOSTNAME']
|
161
|
-
end
|
162
|
-
end
|
163
|
-
else
|
164
|
-
''
|
165
|
-
end
|
166
|
-
end
|
167
|
-
|
168
|
-
column :TIME, 'Time since the VM was submitted', :size => 10 do |d|
|
169
|
-
if !d['vm_info'].nil?
|
170
|
-
stime = d['vm_info']['VM']['STIME'].to_i
|
171
|
-
if d['vm_info']['VM']['ETIME'] == '0'
|
172
|
-
etime = Time.now.to_i
|
173
|
-
else
|
174
|
-
etime = d['vm_info']['VM']['ETIME'].to_i
|
175
|
-
end
|
176
|
-
dtime = etime - stime
|
177
|
-
OpenNebulaHelper.period_to_str(dtime, false)
|
178
|
-
else
|
179
|
-
''
|
180
|
-
end
|
181
|
-
end
|
182
|
-
|
183
|
-
default :VM_ID, :NAME, :STAT, :UCPU, :UMEM, :HOST, :TIME
|
184
|
-
end
|
185
|
-
|
186
|
-
# List the services. This method is used in top and list commands
|
187
|
-
# @param [Service::Client] client
|
188
|
-
# @param [Hash] options
|
189
|
-
# @return [[Integer, String], Integer] Returns the exit_code and optionally
|
190
|
-
# a String to be printed
|
191
|
-
def list_services(client, options)
|
192
|
-
response = client.get(RESOURCE_PATH)
|
193
|
-
|
194
|
-
if CloudClient.is_error?(response)
|
195
|
-
[response.code.to_i, response.to_s]
|
196
|
-
else
|
197
|
-
# [0,response.body]
|
198
|
-
if options[:json]
|
199
|
-
[0, response.body]
|
200
|
-
else
|
201
|
-
array_list = JSON.parse(response.body)
|
202
|
-
SERVICE_TABLE.show(array_list['DOCUMENT_POOL']['DOCUMENT'])
|
203
|
-
0
|
204
|
-
end
|
205
|
-
end
|
206
|
-
end
|
207
|
-
|
208
|
-
# Show the service information. This method is used in top and show commands
|
209
|
-
# @param [Service::Client] client
|
210
|
-
# @param [Array] args
|
211
|
-
# @param [Hash] options
|
212
|
-
# @return [[Integer, String], Integer] Returns the exit_code and optionally
|
213
|
-
# a String to be printed
|
214
|
-
def show_service(client, args, options)
|
215
|
-
response = client.get("#{RESOURCE_PATH}/#{args[0]}")
|
216
|
-
|
217
|
-
if CloudClient.is_error?(response)
|
218
|
-
[response.code.to_i, response.to_s]
|
219
|
-
else
|
220
|
-
# [0,response.body]
|
221
|
-
if options[:json]
|
222
|
-
[0, response.body]
|
223
|
-
else
|
224
|
-
str = '%-20s: %-20s'
|
225
|
-
str_h1 = '%-80s'
|
226
|
-
|
227
|
-
document_hash = JSON.parse(response.body)
|
228
|
-
template = document_hash['DOCUMENT']['TEMPLATE']['BODY']
|
229
|
-
str_header = "SERVICE #{document_hash['DOCUMENT']['ID']} "\
|
230
|
-
'INFORMATION'
|
231
|
-
CLIHelper.print_header(str_h1 % str_header)
|
232
|
-
|
233
|
-
puts Kernel.format(str, 'ID', document_hash['DOCUMENT']['ID'])
|
234
|
-
puts Kernel.format(str, 'NAME', document_hash['DOCUMENT']['NAME'])
|
235
|
-
puts Kernel.format(str, 'USER', document_hash['DOCUMENT']['UNAME'])
|
236
|
-
puts Kernel.format(str, 'GROUP', document_hash['DOCUMENT']['GNAME'])
|
237
|
-
|
238
|
-
puts Kernel.format(str, 'STRATEGY', template['deployment'])
|
239
|
-
puts Kernel.format(str,
|
240
|
-
'SERVICE STATE',
|
241
|
-
Service.state_str(template['state']))
|
242
|
-
if template['shutdown_action']
|
243
|
-
puts Kernel.format(str, 'SHUTDOWN', template['shutdown_action'])
|
244
|
-
end
|
245
|
-
|
246
|
-
puts
|
247
|
-
|
248
|
-
CLIHelper.print_header(str_h1 % 'PERMISSIONS', false)
|
249
|
-
|
250
|
-
%w[OWNER GROUP OTHER].each do |e|
|
251
|
-
mask = '---'
|
252
|
-
permissions_hash = document_hash['DOCUMENT']['PERMISSIONS']
|
253
|
-
mask[0] = 'u' if permissions_hash["#{e}_U"] == '1'
|
254
|
-
mask[1] = 'm' if permissions_hash["#{e}_M"] == '1'
|
255
|
-
mask[2] = 'a' if permissions_hash["#{e}_A"] == '1'
|
256
|
-
|
257
|
-
puts Kernel.format(str, e, mask)
|
258
|
-
end
|
259
|
-
|
260
|
-
puts
|
261
|
-
|
262
|
-
template['roles'].each do |role|
|
263
|
-
CLIHelper.print_header("ROLE #{role['name']}", false)
|
264
|
-
|
265
|
-
puts Kernel.format(str,
|
266
|
-
'ROLE STATE',
|
267
|
-
Role.state_str(role['state']))
|
268
|
-
if role['parents']
|
269
|
-
puts Kernel.format(str,
|
270
|
-
'PARENTS',
|
271
|
-
role['parents'].join(', '))
|
272
|
-
end
|
273
|
-
puts Kernel.format(str, 'VM TEMPLATE', role['vm_template'])
|
274
|
-
puts Kernel.format(str, 'CARDINALITY', role['cardinality'])
|
275
|
-
if role['min_vms']
|
276
|
-
puts Kernel.format(str, 'MIN VMS', role['min_vms'])
|
277
|
-
end
|
278
|
-
if role['max_vms']
|
279
|
-
puts Kernel.format(str, 'MAX VMS', role['max_vms'])
|
280
|
-
end
|
281
|
-
if role['coolddown']
|
282
|
-
puts Kernel.format(str, 'COOLDOWN', "#{role['cooldown']}s")
|
283
|
-
end
|
284
|
-
if role['shutdown_action']
|
285
|
-
puts Kernel.format(str, 'SHUTDOWN', role['shutdown_action'])
|
286
|
-
end
|
287
|
-
|
288
|
-
puts 'NODES INFORMATION'
|
289
|
-
NODE_TABLE.show(role['nodes'])
|
290
|
-
|
291
|
-
if !role['elasticity_policies'].nil? &&
|
292
|
-
!role['elasticity_policies'].empty? ||
|
293
|
-
!role['scheduled_policies'].nil? &&
|
294
|
-
!role['scheduled_policies'].empty?
|
295
|
-
puts
|
296
|
-
puts 'ELASTICITY RULES'
|
297
|
-
|
298
|
-
if role['elasticity_policies'] &&
|
299
|
-
!role['elasticity_policies'].empty?
|
300
|
-
puts
|
301
|
-
# puts 'ELASTICITY POLICIES'
|
302
|
-
CLIHelper::ShowTable.new(nil, self) do
|
303
|
-
column :ADJUST, '', :left, :size => 12 do |d|
|
304
|
-
adjust_str(d)
|
305
|
-
end
|
306
|
-
|
307
|
-
column :EXPRESSION, '', :left, :size => 48 do |d|
|
308
|
-
if !d['expression_evaluated'].nil?
|
309
|
-
d['expression_evaluated']
|
310
|
-
else
|
311
|
-
d['expression']
|
312
|
-
end
|
313
|
-
end
|
314
|
-
|
315
|
-
column :EVALS, '', :right, :size => 5 do |d|
|
316
|
-
if d['period_number']
|
317
|
-
"#{d['true_evals'].to_i}/"\
|
318
|
-
"#{d['period_number']}"
|
319
|
-
else
|
320
|
-
'-'
|
321
|
-
end
|
322
|
-
end
|
323
|
-
|
324
|
-
column :PERIOD, '', :size => 6 do |d|
|
325
|
-
d['period'] ? "#{d['period']}s" : '-'
|
326
|
-
end
|
327
|
-
|
328
|
-
column :COOL, '', :size => 5 do |d|
|
329
|
-
d['cooldown'] ? "#{d['cooldown']}s" : '-'
|
330
|
-
end
|
331
|
-
|
332
|
-
default :ADJUST, :EXPRESSION, :EVALS, :PERIOD, :COOL
|
333
|
-
end.show([role['elasticity_policies']].flatten, {})
|
334
|
-
end
|
335
|
-
|
336
|
-
if role['scheduled_policies'] &&
|
337
|
-
!role['scheduled_policies'].empty?
|
338
|
-
puts
|
339
|
-
# puts 'SCHEDULED POLICIES'
|
340
|
-
CLIHelper::ShowTable.new(nil, self) do
|
341
|
-
column :ADJUST, '', :left, :size => 12 do |d|
|
342
|
-
adjust_str(d)
|
343
|
-
end
|
344
|
-
|
345
|
-
column :TIME, '', :left, :size => 67 do |d|
|
346
|
-
if d['start_time']
|
347
|
-
Time.parse(d['start_time']).to_s
|
348
|
-
else
|
349
|
-
d['recurrence']
|
350
|
-
end
|
351
|
-
end
|
352
|
-
|
353
|
-
default :ADJUST, :TIME
|
354
|
-
end.show([role['scheduled_policies']].flatten, {})
|
355
|
-
end
|
356
|
-
end
|
357
|
-
|
358
|
-
puts
|
359
|
-
end
|
360
|
-
|
361
|
-
puts
|
362
|
-
|
363
|
-
CLIHelper.print_header(str_h1 % 'LOG MESSAGES', false)
|
364
|
-
|
365
|
-
if template['log']
|
366
|
-
template['log'].each do |log|
|
367
|
-
t = Time.at(log['timestamp']).strftime('%m/%d/%y %H:%M')
|
368
|
-
puts "#{t} [#{log['severity']}] #{log['message']}"
|
369
|
-
end
|
370
|
-
end
|
371
|
-
|
372
|
-
0
|
373
|
-
end
|
374
|
-
end
|
375
|
-
end
|
376
|
-
|
377
|
-
def adjust_str(policy)
|
378
|
-
policy['adjust'].to_i >= 0 ? sign = '+' : sign = '-'
|
379
|
-
adjust = policy['adjust'].to_i.abs
|
380
|
-
|
381
|
-
case policy['type']
|
382
|
-
when 'CARDINALITY'
|
383
|
-
"= #{adjust}"
|
384
|
-
when 'PERCENTAGE_CHANGE'
|
385
|
-
st = "#{sign} #{adjust} %"
|
386
|
-
if policy['min_adjust_step']
|
387
|
-
st << " (#{policy['min_adjust_step']})"
|
388
|
-
end
|
389
|
-
|
390
|
-
st
|
391
|
-
else
|
392
|
-
"#{sign} #{adjust}"
|
393
|
-
end
|
394
|
-
end
|
395
|
-
|
396
|
-
#
|
397
|
-
# Commands
|
398
|
-
#
|
399
|
-
|
400
48
|
CommandParser::CmdParser.new(ARGV) do
|
401
49
|
usage '`oneflow` <command> [<args>] [<options>]'
|
402
50
|
version OpenNebulaHelper::ONE_VERSION
|
@@ -405,9 +53,32 @@ CommandParser::CmdParser.new(ARGV) do
|
|
405
53
|
set :option, CommandParser::VERSION
|
406
54
|
set :option, CommandParser::HELP
|
407
55
|
|
408
|
-
|
56
|
+
DONE = {
|
57
|
+
:name => 'done',
|
58
|
+
:large => '--done',
|
59
|
+
:description => 'Show services in DONE state'
|
60
|
+
}
|
61
|
+
|
62
|
+
ARGS = {
|
63
|
+
:name => 'args',
|
64
|
+
:large => '--args arg1,arg2',
|
65
|
+
:description => 'Schedule action arguments',
|
66
|
+
:format => String
|
67
|
+
}
|
68
|
+
|
69
|
+
DELETE = {
|
70
|
+
:name => 'delete',
|
71
|
+
:large => '--delete',
|
72
|
+
:description => 'Force flow necover delete'
|
73
|
+
}
|
74
|
+
|
75
|
+
# create helper object
|
76
|
+
helper = OneFlowHelper.new
|
77
|
+
|
78
|
+
############################################################################
|
409
79
|
# Formatters for arguments
|
410
|
-
|
80
|
+
############################################################################
|
81
|
+
|
411
82
|
set :format, :groupid, OpenNebulaHelper.rname_to_id_desc('GROUP') do |arg|
|
412
83
|
OpenNebulaHelper.rname_to_id(arg, 'GROUP')
|
413
84
|
end
|
@@ -424,326 +95,253 @@ CommandParser::CmdParser.new(ARGV) do
|
|
424
95
|
Service.list_to_id(arg, 'SERVICE')
|
425
96
|
end
|
426
97
|
|
427
|
-
set :format,
|
98
|
+
set :format,
|
99
|
+
:vm_action,
|
428
100
|
'Actions supported: #{Role::SCHEDULE_ACTIONS.join(', ')}' do |arg|
|
429
101
|
if Role::SCHEDULE_ACTIONS.include?(arg)
|
430
102
|
[0, arg]
|
431
103
|
else
|
432
|
-
[-1, "Action #{arg} is not supported.
|
104
|
+
[-1, "Action '#{arg}' is not supported. Supported actions: " \
|
433
105
|
"#{Role::SCHEDULE_ACTIONS.join(', ')}"]
|
434
106
|
end
|
435
107
|
end
|
436
108
|
|
437
|
-
|
438
|
-
# List
|
439
|
-
#
|
109
|
+
###
|
440
110
|
|
441
111
|
list_desc = <<-EOT.unindent
|
442
112
|
List the available services
|
443
113
|
EOT
|
444
114
|
|
445
|
-
command :list, list_desc, :options => Service::JSON_FORMAT do
|
446
|
-
client
|
447
|
-
:username => options[:username],
|
448
|
-
:password => options[:password],
|
449
|
-
:url => options[:server],
|
450
|
-
:user_agent => USER_AGENT
|
451
|
-
)
|
452
|
-
|
453
|
-
list_services(client, options)
|
115
|
+
command :list, list_desc, :options => [Service::JSON_FORMAT, DONE] do
|
116
|
+
helper.list_service_pool(helper.client(options), options)
|
454
117
|
end
|
455
118
|
|
456
|
-
|
457
|
-
# Show
|
458
|
-
#
|
119
|
+
###
|
459
120
|
|
460
|
-
|
461
|
-
|
121
|
+
top_desc = <<-EOT.unindent
|
122
|
+
Top the available services
|
462
123
|
EOT
|
463
124
|
|
464
|
-
command :
|
465
|
-
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
)
|
471
|
-
|
472
|
-
show_service(client, args, options)
|
125
|
+
command :top, top_desc, :options => [CLIHelper::DELAY, DONE] do
|
126
|
+
Signal.trap('INT') { exit(-1) }
|
127
|
+
|
128
|
+
helper.top_service_pool(helper.client(options), options)
|
129
|
+
|
130
|
+
0
|
473
131
|
end
|
474
132
|
|
475
|
-
|
476
|
-
# Top
|
477
|
-
#
|
133
|
+
###
|
478
134
|
|
479
|
-
|
480
|
-
|
481
|
-
id is specified
|
135
|
+
show_desc = <<-EOT.unindent
|
136
|
+
Show detailed information of a given service
|
482
137
|
EOT
|
483
138
|
|
484
|
-
command :
|
485
|
-
|
486
|
-
Service::TOP,
|
487
|
-
CLIHelper::DELAY] do
|
488
|
-
client = Service::Client.new(
|
489
|
-
:username => options[:username],
|
490
|
-
:password => options[:password],
|
491
|
-
:url => options[:server],
|
492
|
-
:user_agent => USER_AGENT
|
493
|
-
)
|
494
|
-
|
495
|
-
options[:delay] ? delay = options[:delay] : delay = 3
|
496
|
-
|
497
|
-
begin
|
498
|
-
loop do
|
499
|
-
CLIHelper.scr_cls
|
500
|
-
CLIHelper.scr_move(0, 0)
|
501
|
-
|
502
|
-
if args[0]
|
503
|
-
rc, message = show_service(client, args, options)
|
504
|
-
else
|
505
|
-
rc, message = list_services(client, options)
|
506
|
-
end
|
507
|
-
|
508
|
-
raise message if rc
|
509
|
-
|
510
|
-
sleep delay
|
511
|
-
end
|
512
|
-
rescue StandardError => e
|
513
|
-
puts e.message
|
514
|
-
-1
|
515
|
-
end
|
139
|
+
command :show, show_desc, :service_id, :options => Service::JSON_FORMAT do
|
140
|
+
helper.format_resource(helper.client(options), args[0], options)
|
516
141
|
end
|
517
142
|
|
518
|
-
|
519
|
-
# Delete
|
520
|
-
#
|
143
|
+
###
|
521
144
|
|
522
145
|
delete_desc = <<-EOT.unindent
|
523
146
|
Delete a given service
|
524
147
|
EOT
|
525
148
|
|
526
149
|
command :delete, delete_desc, [:range, :service_id_list] do
|
527
|
-
client =
|
528
|
-
:username => options[:username],
|
529
|
-
:password => options[:password],
|
530
|
-
:url => options[:server],
|
531
|
-
:user_agent => USER_AGENT
|
532
|
-
)
|
150
|
+
client = helper.client(options)
|
533
151
|
|
534
152
|
Service.perform_actions(args[0]) do |service_id|
|
535
153
|
client.delete("#{RESOURCE_PATH}/#{service_id}")
|
536
154
|
end
|
537
155
|
end
|
538
156
|
|
539
|
-
|
540
|
-
# Shutdown
|
541
|
-
#
|
542
|
-
|
543
|
-
shutdown_desc = <<-EOT.unindent
|
544
|
-
Shutdown a service.
|
545
|
-
From RUNNING or WARNING shuts down the Service
|
546
|
-
EOT
|
547
|
-
|
548
|
-
command :shutdown, shutdown_desc, [:range, :service_id_list] do
|
549
|
-
client = Service::Client.new(
|
550
|
-
:username => options[:username],
|
551
|
-
:password => options[:password],
|
552
|
-
:url => options[:server],
|
553
|
-
:user_agent => USER_AGENT
|
554
|
-
)
|
555
|
-
|
556
|
-
Service.perform_actions(args[0]) do |service_id|
|
557
|
-
json_action = Service.build_json_action('shutdown')
|
558
|
-
|
559
|
-
client.post("#{RESOURCE_PATH}/#{service_id}/action", json_action)
|
560
|
-
end
|
561
|
-
end
|
562
|
-
|
563
|
-
#
|
564
|
-
# Recover
|
565
|
-
#
|
157
|
+
###
|
566
158
|
|
567
159
|
recover_desc = <<-EOT.unindent
|
568
160
|
Recover a failed service, cleaning the failed VMs.
|
569
161
|
From FAILED_DEPLOYING continues deploying the Service
|
570
162
|
From FAILED_SCALING continues scaling the Service
|
571
163
|
From FAILED_UNDEPLOYING continues shutting down the Service
|
572
|
-
From COOLDOWN the Service is set to running ignoring the cooldown
|
164
|
+
From COOLDOWN the Service is set to running ignoring the cooldown
|
573
165
|
From WARNING failed VMs are deleted, and new VMs are instantiated
|
574
166
|
EOT
|
575
167
|
|
576
|
-
command :recover,
|
577
|
-
|
578
|
-
:
|
579
|
-
:
|
580
|
-
|
581
|
-
:user_agent => USER_AGENT
|
582
|
-
)
|
168
|
+
command :recover,
|
169
|
+
recover_desc,
|
170
|
+
[:range, :service_id_list],
|
171
|
+
:options => DELETE do
|
172
|
+
client = helper.client(options)
|
583
173
|
|
584
174
|
Service.perform_actions(args[0]) do |service_id|
|
585
|
-
|
175
|
+
params = {}
|
176
|
+
params['delete'] = options.key?(:delete)
|
177
|
+
|
178
|
+
json = Service.build_json_action('recover', params)
|
586
179
|
|
587
|
-
client.post("#{RESOURCE_PATH}/#{service_id}/action",
|
180
|
+
client.post("#{RESOURCE_PATH}/#{service_id}/action", json)
|
588
181
|
end
|
589
182
|
end
|
590
183
|
|
591
|
-
|
592
|
-
# Scale
|
593
|
-
#
|
184
|
+
###
|
594
185
|
|
595
186
|
scale_desc = <<-EOT.unindent
|
596
187
|
Scale a role to the given cardinality
|
597
188
|
EOT
|
598
189
|
|
599
|
-
command :scale,
|
600
|
-
|
601
|
-
|
602
|
-
:
|
603
|
-
:
|
604
|
-
:
|
605
|
-
:user_agent => USER_AGENT
|
606
|
-
)
|
607
|
-
|
190
|
+
command :scale,
|
191
|
+
scale_desc,
|
192
|
+
:service_id,
|
193
|
+
:role_name,
|
194
|
+
:cardinality,
|
195
|
+
:options => [Service::FORCE] do
|
608
196
|
if args[2] !~ /^\d+$/
|
609
|
-
puts 'Cardinality must be an integer number'
|
197
|
+
STDERR.puts 'Cardinality must be an integer number'
|
610
198
|
exit(-1)
|
611
199
|
end
|
612
200
|
|
613
|
-
|
614
|
-
|
615
|
-
|
616
|
-
" \"force\" : #{options[:force] == true} }"
|
201
|
+
json = "{ \"cardinality\" : #{args[2]},\n" \
|
202
|
+
" \"force\" : #{options[:force] == true}, " \
|
203
|
+
" \"role_name\" : \"#{args[1]}\"}"
|
617
204
|
|
618
|
-
|
619
|
-
|
620
|
-
|
621
|
-
if CloudClient.is_error?(response)
|
622
|
-
puts response.to_s
|
623
|
-
exit_code = response.code.to_i
|
205
|
+
Service.perform_action(args[0]) do |service_id|
|
206
|
+
helper.client(options).post("#{RESOURCE_PATH}/#{service_id}/scale",
|
207
|
+
json)
|
624
208
|
end
|
625
|
-
|
626
|
-
exit_code
|
627
209
|
end
|
628
210
|
|
211
|
+
###
|
212
|
+
|
629
213
|
chgrp_desc = <<-EOT.unindent
|
630
214
|
Changes the service group
|
631
215
|
EOT
|
632
216
|
|
633
217
|
command :chgrp, chgrp_desc, [:range, :service_id_list], :groupid do
|
634
|
-
client =
|
635
|
-
:username => options[:username],
|
636
|
-
:password => options[:password],
|
637
|
-
:url => options[:server],
|
638
|
-
:user_agent => USER_AGENT
|
639
|
-
)
|
218
|
+
client = helper.client(options)
|
640
219
|
|
641
220
|
Service.perform_actions(args[0]) do |service_id|
|
642
221
|
params = {}
|
643
222
|
params['group_id'] = args[1].to_i
|
644
223
|
|
645
|
-
|
224
|
+
json = Service.build_json_action('chgrp', params)
|
646
225
|
|
647
|
-
client.post("#{RESOURCE_PATH}/#{service_id}/action",
|
226
|
+
client.post("#{RESOURCE_PATH}/#{service_id}/action", json)
|
648
227
|
end
|
649
228
|
end
|
650
229
|
|
230
|
+
###
|
231
|
+
|
651
232
|
chown_desc = <<-EOT.unindent
|
652
233
|
Changes the service owner and group
|
653
234
|
EOT
|
654
235
|
|
655
|
-
command :chown,
|
656
|
-
|
657
|
-
|
658
|
-
:
|
659
|
-
:
|
660
|
-
|
661
|
-
:user_agent => USER_AGENT
|
662
|
-
)
|
236
|
+
command :chown,
|
237
|
+
chown_desc,
|
238
|
+
[:range, :service_id_list],
|
239
|
+
:userid,
|
240
|
+
[:groupid, nil] do
|
241
|
+
client = helper.client(options)
|
663
242
|
|
664
243
|
Service.perform_actions(args[0]) do |service_id|
|
665
244
|
params = {}
|
666
245
|
params['owner_id'] = args[1]
|
667
246
|
params['group_id'] = args[2] if args[2]
|
668
247
|
|
669
|
-
|
248
|
+
json = Service.build_json_action('chown', params)
|
670
249
|
|
671
|
-
client.post("#{RESOURCE_PATH}/#{service_id}/action",
|
250
|
+
client.post("#{RESOURCE_PATH}/#{service_id}/action", json)
|
672
251
|
end
|
673
252
|
end
|
674
253
|
|
254
|
+
###
|
255
|
+
|
675
256
|
chmod_desc = <<-EOT.unindent
|
676
257
|
Changes the service permissions
|
677
258
|
EOT
|
678
259
|
|
679
260
|
command :chmod, chmod_desc, [:range, :service_id_list], :octet do
|
680
|
-
|
681
|
-
|
682
|
-
|
683
|
-
|
684
|
-
|
685
|
-
)
|
261
|
+
if !/\A\d+\z/.match(args[1])
|
262
|
+
STDERR.puts "Invalid '#{args[1]}' octed permissions"
|
263
|
+
exit(-1)
|
264
|
+
end
|
265
|
+
|
266
|
+
client = helper.client(options)
|
686
267
|
|
687
268
|
Service.perform_actions(args[0]) do |service_id|
|
688
269
|
params = {}
|
689
270
|
params['octet'] = args[1]
|
690
271
|
|
691
|
-
|
272
|
+
json = Service.build_json_action('chmod', params)
|
692
273
|
|
693
|
-
client.post("#{RESOURCE_PATH}/#{service_id}/action",
|
274
|
+
client.post("#{RESOURCE_PATH}/#{service_id}/action", json)
|
694
275
|
end
|
695
276
|
end
|
696
277
|
|
278
|
+
###
|
279
|
+
|
697
280
|
rename_desc = <<-EOT.unindent
|
698
281
|
Renames the Service
|
699
282
|
EOT
|
700
283
|
|
701
284
|
command :rename, rename_desc, :service_id, :name do
|
702
|
-
|
703
|
-
|
704
|
-
|
705
|
-
:url => options[:server],
|
706
|
-
:user_agent => USER_AGENT
|
707
|
-
)
|
708
|
-
|
709
|
-
params = {}
|
710
|
-
params['name'] = args[1]
|
711
|
-
|
712
|
-
json_action = Service.build_json_action('rename', params)
|
285
|
+
Service.perform_action(args[0]) do |service_id|
|
286
|
+
params = {}
|
287
|
+
params['name'] = args[1]
|
713
288
|
|
714
|
-
|
715
|
-
.post("#{RESOURCE_PATH}/#{args[0]}/action", json_action)
|
289
|
+
json = Service.build_json_action('rename', params)
|
716
290
|
|
717
|
-
|
718
|
-
|
719
|
-
else
|
720
|
-
response.code.to_i
|
291
|
+
helper.client(options).post("#{RESOURCE_PATH}/#{service_id}/action",
|
292
|
+
json)
|
721
293
|
end
|
722
294
|
end
|
723
295
|
|
296
|
+
###
|
297
|
+
|
724
298
|
action_desc = <<-EOT.unindent
|
725
299
|
Perform an action on all the Virtual Machines of a given role.
|
726
300
|
Actions supported: #{Role::SCHEDULE_ACTIONS.join(',')}
|
727
301
|
EOT
|
728
302
|
|
729
|
-
command :action,
|
730
|
-
|
731
|
-
|
732
|
-
:
|
733
|
-
:
|
734
|
-
:
|
735
|
-
|
736
|
-
)
|
737
|
-
|
738
|
-
Service.perform_actions([args[0]]) do |service_id|
|
303
|
+
command :action,
|
304
|
+
action_desc,
|
305
|
+
:service_id,
|
306
|
+
:role_name,
|
307
|
+
:vm_action,
|
308
|
+
:options => [Service::PERIOD, Service::NUMBER, ARGS] do
|
309
|
+
Service.perform_action(args[0]) do |service_id|
|
739
310
|
params = {}
|
740
311
|
params[:period] = options[:period].to_i if options[:period]
|
741
312
|
params[:number] = options[:number].to_i if options[:number]
|
313
|
+
params[:args] = options[:args] if options[:args]
|
742
314
|
|
743
|
-
|
315
|
+
json = Service.build_json_action(args[2], params)
|
316
|
+
client = helper.client(options)
|
744
317
|
|
745
318
|
client.post("#{RESOURCE_PATH}/#{service_id}/role/#{args[1]}/action",
|
746
|
-
|
319
|
+
json)
|
320
|
+
end
|
321
|
+
end
|
322
|
+
|
323
|
+
###
|
324
|
+
|
325
|
+
action_desc = <<-EOT.unindent
|
326
|
+
Perform an action on all the Virtual Machines of a given service.
|
327
|
+
Actions supported: #{Role::SCHEDULE_ACTIONS.join(',')}
|
328
|
+
EOT
|
329
|
+
|
330
|
+
command [:service, :action],
|
331
|
+
action_desc,
|
332
|
+
:service_id,
|
333
|
+
:vm_action,
|
334
|
+
:options => [Service::PERIOD, Service::NUMBER, ARGS] do
|
335
|
+
Service.perform_action(args[0]) do |service_id|
|
336
|
+
params = {}
|
337
|
+
params[:period] = options[:period].to_i if options[:period]
|
338
|
+
params[:number] = options[:number].to_i if options[:number]
|
339
|
+
params[:args] = options[:args] if options[:args]
|
340
|
+
|
341
|
+
json = Service.build_json_action(args[1], params)
|
342
|
+
client = helper.client(options)
|
343
|
+
|
344
|
+
client.post("#{RESOURCE_PATH}/#{service_id}/action", json)
|
747
345
|
end
|
748
346
|
end
|
749
347
|
end
|