opennebula-cli 5.11.90.pre → 5.12.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/oneacct +3 -2
- data/bin/oneacl +3 -2
- data/bin/onecluster +3 -2
- data/bin/onedatastore +3 -2
- data/bin/oneflow +3 -2
- data/bin/oneflow-template +3 -2
- data/bin/onegroup +3 -2
- data/bin/onehook +3 -2
- data/bin/onehost +70 -2
- data/bin/oneimage +3 -2
- data/bin/onemarket +3 -2
- data/bin/onemarketapp +3 -2
- data/bin/onesecgroup +3 -2
- data/bin/oneshowback +3 -2
- data/bin/onetemplate +3 -2
- data/bin/oneuser +3 -2
- data/bin/onevcenter +5 -2
- data/bin/onevdc +3 -2
- data/bin/onevm +89 -3
- data/bin/onevmgroup +3 -2
- data/bin/onevnet +6 -39
- data/bin/onevntemplate +3 -2
- data/bin/onevrouter +3 -2
- data/bin/onezone +3 -2
- data/lib/cli_helper.rb +51 -30
- data/lib/command_parser.rb +21 -6
- data/lib/one_helper.rb +65 -4
- data/lib/one_helper/oneacl_helper.rb +1 -3
- data/lib/one_helper/oneflow_helper.rb +5 -1
- data/lib/one_helper/onehook_helper.rb +6 -4
- data/lib/one_helper/onehost_helper.rb +121 -45
- data/lib/one_helper/oneimage_helper.rb +6 -4
- data/lib/one_helper/oneprovision_helper.rb +2 -6
- data/lib/one_helper/oneuser_helper.rb +4 -0
- data/lib/one_helper/onevcenter_helper.rb +3 -3
- data/lib/one_helper/onevm_helper.rb +109 -17
- data/lib/one_helper/onevnet_helper.rb +65 -1
- metadata +6 -6
@@ -115,7 +115,7 @@ class OneAclHelper < OpenNebulaHelper::OneHelper
|
|
115
115
|
def format_pool(_options)
|
116
116
|
config_file = self.class.table_conf
|
117
117
|
|
118
|
-
|
118
|
+
CLIHelper::ShowTable.new(config_file, self) do
|
119
119
|
column :ID,
|
120
120
|
'Rule Identifier',
|
121
121
|
:size => 5 do |d|
|
@@ -157,8 +157,6 @@ class OneAclHelper < OpenNebulaHelper::OneHelper
|
|
157
157
|
|
158
158
|
default :ID, :USER, :RES_VHNIUTGDCOZSvRMAPt, :RID, :OPE_UMAC, :ZONE
|
159
159
|
end
|
160
|
-
|
161
|
-
table
|
162
160
|
end
|
163
161
|
# rubocop:enable Lint/IneffectiveAccessModifier
|
164
162
|
|
@@ -406,7 +406,11 @@ class OneFlowHelper < OpenNebulaHelper::OneHelper
|
|
406
406
|
|
407
407
|
column :TIME, '', :left, :size => 67 do |d|
|
408
408
|
if d['start_time']
|
409
|
-
|
409
|
+
if !d['start_time'].match(/^\d+$/)
|
410
|
+
Time.parse(d['start_time']).to_s
|
411
|
+
else
|
412
|
+
d['start_time']
|
413
|
+
end
|
410
414
|
else
|
411
415
|
d['recurrence']
|
412
416
|
end
|
@@ -94,7 +94,7 @@ class OneHookHelper < OpenNebulaHelper::OneHelper
|
|
94
94
|
def format_pool(_options)
|
95
95
|
config_file = self.class.table_conf
|
96
96
|
|
97
|
-
|
97
|
+
CLIHelper::ShowTable.new(config_file, self) do
|
98
98
|
column :ID, 'ONE identifier for the Hook', :size => 5 do |d|
|
99
99
|
d['ID']
|
100
100
|
end
|
@@ -109,8 +109,6 @@ class OneHookHelper < OpenNebulaHelper::OneHelper
|
|
109
109
|
|
110
110
|
default :ID, :NAME, :TYPE
|
111
111
|
end
|
112
|
-
|
113
|
-
table
|
114
112
|
end
|
115
113
|
|
116
114
|
# Function to print Execution Log records as sent by oned using:
|
@@ -163,7 +161,11 @@ class OneHookHelper < OpenNebulaHelper::OneHelper
|
|
163
161
|
end
|
164
162
|
end
|
165
163
|
|
166
|
-
|
164
|
+
if !header
|
165
|
+
default :HOOK, :ID, :TIMESTAMP, :RC, :EXECUTION
|
166
|
+
else
|
167
|
+
default :ID, :TIMESTAMP, :RC, :EXECUTION
|
168
|
+
end
|
167
169
|
end
|
168
170
|
|
169
171
|
table.show(execs, :stat_column => :EXECUTION)
|
@@ -17,6 +17,7 @@
|
|
17
17
|
require 'one_helper'
|
18
18
|
require 'one_helper/onevm_helper'
|
19
19
|
require 'rubygems'
|
20
|
+
require 'time'
|
20
21
|
|
21
22
|
# implements onehost command
|
22
23
|
class OneHostHelper < OpenNebulaHelper::OneHelper
|
@@ -75,6 +76,15 @@ class OneHostHelper < OpenNebulaHelper::OneHelper
|
|
75
76
|
|
76
77
|
VERSION_XPATH = "#{TEMPLATE_XPATH}/VERSION"
|
77
78
|
|
79
|
+
MONITORING = {
|
80
|
+
'FREE_CPU' => 'CAPACITY',
|
81
|
+
'FREE_MEMORY' => 'CAPACITY',
|
82
|
+
'USED_CPU' => 'CAPACITY',
|
83
|
+
'USED_MEMORY' => 'CAPACITY',
|
84
|
+
'NETRX' => 'SYSTEM',
|
85
|
+
'NETTX' => 'SYSTEM'
|
86
|
+
}
|
87
|
+
|
78
88
|
def self.rname
|
79
89
|
'HOST'
|
80
90
|
end
|
@@ -93,7 +103,7 @@ class OneHostHelper < OpenNebulaHelper::OneHelper
|
|
93
103
|
def format_pool(options)
|
94
104
|
config_file = self.class.table_conf
|
95
105
|
|
96
|
-
|
106
|
+
CLIHelper::ShowTable.new(config_file, self) do
|
97
107
|
column :ID, 'ONE identifier for Host', :size => 4 do |d|
|
98
108
|
d['ID']
|
99
109
|
end
|
@@ -223,8 +233,6 @@ class OneHostHelper < OpenNebulaHelper::OneHelper
|
|
223
233
|
default :ID, :NAME, :CLUSTER, :TVM,
|
224
234
|
:ALLOCATED_CPU, :ALLOCATED_MEM, :STAT
|
225
235
|
end
|
226
|
-
|
227
|
-
table
|
228
236
|
end
|
229
237
|
|
230
238
|
def set_hybrid(type, path)
|
@@ -425,8 +433,7 @@ class OneHostHelper < OpenNebulaHelper::OneHelper
|
|
425
433
|
rc = pool.info
|
426
434
|
return -1, rc.message if OpenNebula.is_error?(rc)
|
427
435
|
|
428
|
-
|
429
|
-
queue = []
|
436
|
+
host_errors = []
|
430
437
|
|
431
438
|
pool.each do |host|
|
432
439
|
if host_ids
|
@@ -435,7 +442,6 @@ class OneHostHelper < OpenNebulaHelper::OneHelper
|
|
435
442
|
next if host['CLUSTER_ID'].to_i != cluster_id
|
436
443
|
end
|
437
444
|
|
438
|
-
vm_mad = host['VM_MAD'].downcase
|
439
445
|
state = host['STATE']
|
440
446
|
|
441
447
|
# Skip this host from remote syncing if it's a PUBLIC_CLOUD host
|
@@ -444,60 +450,104 @@ class OneHostHelper < OpenNebulaHelper::OneHelper
|
|
444
450
|
# Skip this host from remote syncing if it's OFFLINE
|
445
451
|
next if Host::HOST_STATES[state.to_i] == 'OFFLINE'
|
446
452
|
|
447
|
-
|
448
|
-
next if vm_mad == 'vcenter'
|
453
|
+
rc = host.forceupdate
|
449
454
|
|
450
|
-
|
455
|
+
host_errors << host['NAME'] if OpenNebula.is_error?(rc)
|
451
456
|
end
|
452
457
|
|
453
|
-
|
454
|
-
|
455
|
-
|
456
|
-
|
457
|
-
|
458
|
+
if host_errors.empty?
|
459
|
+
puts 'All hosts updated successfully.'
|
460
|
+
0
|
461
|
+
else
|
462
|
+
STDERR.puts 'Failed to update the following hosts:'
|
463
|
+
host_errors.each {|h| STDERR.puts "* #{h}" }
|
464
|
+
-1
|
465
|
+
end
|
466
|
+
end
|
458
467
|
|
459
|
-
|
460
|
-
|
461
|
-
|
468
|
+
def monitoring(host, attr, options)
|
469
|
+
unit = options[:unit] || 'G'
|
470
|
+
start_d = options[:start]
|
471
|
+
end_d = options[:end]
|
472
|
+
n_elems = options[:n_elems] || 8
|
473
|
+
|
474
|
+
# Different available size units
|
475
|
+
units = %w[K M G T]
|
476
|
+
|
477
|
+
# Attrs that need units conversion
|
478
|
+
attrs = %w[FREE_MEMORY USED_MEMORY]
|
479
|
+
|
480
|
+
if unit && !units.include?(unit)
|
481
|
+
STDERR.puts "Invalid unit `#{unit}`"
|
482
|
+
exit(-1)
|
462
483
|
end
|
463
484
|
|
464
|
-
|
465
|
-
|
466
|
-
|
467
|
-
host = nil
|
468
|
-
size = 0
|
485
|
+
attr = attr.upcase
|
486
|
+
start_d = Time.parse(start_d) if start_d
|
487
|
+
end_d = Time.parse(end_d) if end_d
|
469
488
|
|
470
|
-
|
471
|
-
|
472
|
-
|
473
|
-
|
489
|
+
# Get monitoring data from user path
|
490
|
+
#
|
491
|
+
# 0 -> timestamp
|
492
|
+
# 1 -> data retrieved
|
493
|
+
monitoring_data = host.monitoring(["#{MONITORING[attr]}/#{attr}"])
|
494
|
+
monitoring_data = monitoring_data["#{MONITORING[attr]}/#{attr}"]
|
474
495
|
|
475
|
-
|
496
|
+
if monitoring_data.empty?
|
497
|
+
STDERR.puts 'No monitoring data found'
|
498
|
+
return
|
499
|
+
end
|
476
500
|
|
477
|
-
|
501
|
+
# Get data max and min date
|
502
|
+
start_d ||= Time.at(monitoring_data.min {|v| v[0].to_i }[0].to_i)
|
503
|
+
end_d ||= Time.at(monitoring_data.max {|v| v[0].to_i }[0].to_i)
|
478
504
|
|
479
|
-
|
480
|
-
|
481
|
-
|
482
|
-
|
483
|
-
|
484
|
-
|
485
|
-
|
486
|
-
|
487
|
-
|
505
|
+
# Filter data betwen dates
|
506
|
+
monitoring_data.reject! do |v|
|
507
|
+
v[0].to_i < start_d.to_i || v[0].to_i > end_d.to_i
|
508
|
+
end
|
509
|
+
|
510
|
+
if monitoring_data.empty?
|
511
|
+
STDERR.puts "No monitoring data found between #{start_d} " \
|
512
|
+
"and #{end_d}"
|
513
|
+
return
|
514
|
+
end
|
515
|
+
|
516
|
+
start_d = start_d.strftime('%d/%m/%Y %H:%M')
|
517
|
+
end_d = end_d.strftime('%d/%m/%Y %H:%M')
|
518
|
+
|
519
|
+
# Parse dcollected data
|
520
|
+
x = monitoring_data.collect {|v| Time.at(v[0].to_i).strftime('%H:%M') }
|
521
|
+
y = monitoring_data.collect do |v|
|
522
|
+
if attrs.include?(attr)
|
523
|
+
# GB is the default unit
|
524
|
+
v = OpenNebulaHelper.bytes_to_unit(v[1].to_i, unit).round(2)
|
525
|
+
"#{v} #{unit}B"
|
526
|
+
else
|
527
|
+
v[1]
|
488
528
|
end
|
489
529
|
end
|
490
530
|
|
491
|
-
|
492
|
-
|
531
|
+
title = ''
|
532
|
+
title << "Host #{host.id} #{attr} "
|
533
|
+
title << "in #{unit}B " if unit && attrs.include?(attr)
|
534
|
+
title << "from #{start_d} to #{end_d}"
|
493
535
|
|
494
|
-
|
495
|
-
|
496
|
-
|
536
|
+
x = x.last(n_elems)
|
537
|
+
y = y.last(n_elems)
|
538
|
+
|
539
|
+
if options[:table]
|
540
|
+
print_monitoring_table(x, y, title)
|
541
|
+
elsif options[:csv]
|
542
|
+
csv = ''
|
543
|
+
|
544
|
+
csv << "TIME#{options[:csv]}VALUE\n"
|
545
|
+
|
546
|
+
x.zip(y) {|x_v, y_v| csv << "#{x_v}#{options[:csv]}#{y_v}\n" }
|
547
|
+
|
548
|
+
puts csv
|
497
549
|
else
|
498
|
-
|
499
|
-
host_errors.each {|h| STDERR.puts "* #{h}" }
|
500
|
-
-1
|
550
|
+
puts OpenNebulaHelper.get_plot(x, y, attr, title)
|
501
551
|
end
|
502
552
|
end
|
503
553
|
|
@@ -920,4 +970,30 @@ class OneHostHelper < OpenNebulaHelper::OneHelper
|
|
920
970
|
table.show(hugepages)
|
921
971
|
end
|
922
972
|
|
973
|
+
def print_monitoring_table(x, y, title)
|
974
|
+
puts
|
975
|
+
CLIHelper.print_header(title, true)
|
976
|
+
puts
|
977
|
+
|
978
|
+
table = CLIHelper::ShowTable.new(nil, self) do
|
979
|
+
column :TIME, 'Timestamp', :size => 8, :left => false do |d|
|
980
|
+
d['TIME']
|
981
|
+
end
|
982
|
+
|
983
|
+
column :VALUE, 'Value', :size => 8, :left => false do |d|
|
984
|
+
d['VALUE']
|
985
|
+
end
|
986
|
+
|
987
|
+
default :TIME, :VALUE
|
988
|
+
end
|
989
|
+
|
990
|
+
data = []
|
991
|
+
|
992
|
+
x.zip(y) do |x_v, y_v|
|
993
|
+
data << { 'TIME' => x_v, 'VALUE' => y_v }
|
994
|
+
end
|
995
|
+
|
996
|
+
table.show(data)
|
997
|
+
end
|
998
|
+
|
923
999
|
end
|
@@ -20,6 +20,10 @@ require 'one_helper/onevm_helper'
|
|
20
20
|
# CLI helper for oneimage command
|
21
21
|
class OneImageHelper < OpenNebulaHelper::OneHelper
|
22
22
|
|
23
|
+
# This list contains prefixes that should skip adding user home to the path
|
24
|
+
# This must have the same content as the case $FROM in downloader.sh
|
25
|
+
PREFIXES = %w[http https ssh s3 rbd vcenter lxd docker]
|
26
|
+
|
23
27
|
TEMPLATE_OPTIONS=[
|
24
28
|
{
|
25
29
|
:name => 'name',
|
@@ -82,7 +86,7 @@ class OneImageHelper < OpenNebulaHelper::OneHelper
|
|
82
86
|
:description => 'Path of the image file',
|
83
87
|
:format => String,
|
84
88
|
:proc => lambda do |o, _options|
|
85
|
-
next [0, o] if o.match(%r{^(
|
89
|
+
next [0, o] if o.match(%r{^(#{PREFIXES.join('|')})://})
|
86
90
|
|
87
91
|
if o[0, 1]=='/'
|
88
92
|
path=o
|
@@ -192,7 +196,7 @@ class OneImageHelper < OpenNebulaHelper::OneHelper
|
|
192
196
|
def format_pool(options)
|
193
197
|
config_file = self.class.table_conf
|
194
198
|
|
195
|
-
|
199
|
+
CLIHelper::ShowTable.new(config_file, self) do
|
196
200
|
column :ID, 'ONE identifier for the Image', :size=>4 do |d|
|
197
201
|
d['ID']
|
198
202
|
end
|
@@ -246,8 +250,6 @@ class OneImageHelper < OpenNebulaHelper::OneHelper
|
|
246
250
|
default :ID, :USER, :GROUP, :NAME, :DATASTORE, :SIZE, :TYPE,
|
247
251
|
:PERSISTENT, :STAT, :RVMS
|
248
252
|
end
|
249
|
-
|
250
|
-
table
|
251
253
|
end
|
252
254
|
|
253
255
|
def check_orphans
|
@@ -49,7 +49,7 @@ class OneProvisionHelper < OpenNebulaHelper::OneHelper
|
|
49
49
|
def format_pool
|
50
50
|
config_file = self.class.table_conf
|
51
51
|
|
52
|
-
|
52
|
+
CLIHelper::ShowTable.new(config_file, self) do
|
53
53
|
column :ID, 'Identifier for the Provision', :size => 36 do |p|
|
54
54
|
p['ID']
|
55
55
|
end
|
@@ -80,8 +80,6 @@ class OneProvisionHelper < OpenNebulaHelper::OneHelper
|
|
80
80
|
|
81
81
|
default :ID, :NAME, :CLUSTERS, :HOSTS, :NETWORKS, :DATASTORES, :STAT
|
82
82
|
end
|
83
|
-
|
84
|
-
table
|
85
83
|
end
|
86
84
|
|
87
85
|
#######################################################################
|
@@ -228,11 +226,9 @@ class OneProvisionHelper < OpenNebulaHelper::OneHelper
|
|
228
226
|
end
|
229
227
|
|
230
228
|
def names_to_ids(objects, type)
|
231
|
-
|
229
|
+
[objects].flatten.map do |obj|
|
232
230
|
OpenNebulaHelper.rname_to_id(obj.to_s, type)[1]
|
233
231
|
end
|
234
|
-
|
235
|
-
objects
|
236
232
|
end
|
237
233
|
|
238
234
|
def get_list(provision_list)
|
@@ -201,6 +201,10 @@ class OneUserHelper < OpenNebulaHelper::OneHelper
|
|
201
201
|
login_client = self.get_login_client(username, options)
|
202
202
|
end
|
203
203
|
|
204
|
+
if (login_client.is_a? Array) && login_client[0] == -1
|
205
|
+
return login_client
|
206
|
+
end
|
207
|
+
|
204
208
|
user = OpenNebula::User.new(User.build_xml, login_client)
|
205
209
|
|
206
210
|
egid = options[:group] || -1
|
@@ -237,11 +237,11 @@ class OneVcenterHelper < OpenNebulaHelper::OneHelper
|
|
237
237
|
d[:import_id]
|
238
238
|
end
|
239
239
|
|
240
|
-
column :REF, "ref", :left, :size=>config[:REF] || 15 do |d|
|
240
|
+
column :REF, "ref", :left, :adjust, :size=>config[:REF] || 15 do |d|
|
241
241
|
d[:ref]
|
242
242
|
end
|
243
243
|
|
244
|
-
column :NAME, "Name", :left, :size=>config[:NAME] || 20 do |d|
|
244
|
+
column :NAME, "Name", :left, :expand, :size=>config[:NAME] || 20 do |d|
|
245
245
|
d[:name] || d[:simple_name]
|
246
246
|
end
|
247
247
|
|
@@ -250,7 +250,7 @@ class OneVcenterHelper < OpenNebulaHelper::OneHelper
|
|
250
250
|
d[:one_ids] || d[:cluster].to_s
|
251
251
|
end
|
252
252
|
|
253
|
-
column :PATH, "PATH", :left, :size=>config[:PATH] || 10 do |d|
|
253
|
+
column :PATH, "PATH", :left, :expand, :size=>config[:PATH] || 10 do |d|
|
254
254
|
d[:path]
|
255
255
|
end
|
256
256
|
|
@@ -100,7 +100,8 @@ class OneVMHelper < OpenNebulaHelper::OneHelper
|
|
100
100
|
if File.file?(o)
|
101
101
|
options[:file] = o
|
102
102
|
else
|
103
|
-
|
103
|
+
STDERR.puts "File `#{options[:file]}` doesn't exist"
|
104
|
+
exit(-1)
|
104
105
|
end
|
105
106
|
}
|
106
107
|
}
|
@@ -354,7 +355,7 @@ class OneVMHelper < OpenNebulaHelper::OneHelper
|
|
354
355
|
|
355
356
|
column :MEM, 'Memory asigned to the VM', :size => 7 do |d|
|
356
357
|
OpenNebulaHelper.unit_to_str(d['TEMPLATE']['MEMORY'].to_i,
|
357
|
-
options)
|
358
|
+
options, 'M')
|
358
359
|
end
|
359
360
|
|
360
361
|
column :HOST, 'Host where the VM is running',
|
@@ -402,7 +403,7 @@ class OneVMHelper < OpenNebulaHelper::OneHelper
|
|
402
403
|
table
|
403
404
|
end
|
404
405
|
|
405
|
-
def schedule_actions(ids, options, action)
|
406
|
+
def schedule_actions(ids, options, action, warning = nil)
|
406
407
|
# Verbose by default
|
407
408
|
options[:verbose] = true
|
408
409
|
|
@@ -453,18 +454,74 @@ class OneVMHelper < OpenNebulaHelper::OneHelper
|
|
453
454
|
id = ids.max + 1
|
454
455
|
end
|
455
456
|
|
457
|
+
sched = options[:schedule]
|
458
|
+
|
459
|
+
# If the action is set to be executed from VM start to an specific
|
460
|
+
# amount of time later, we should preserve the + symbol
|
461
|
+
if ((sched.is_a? String) && !sched.include?('+')) ||
|
462
|
+
!(sched.is_a? String)
|
463
|
+
sched = sched.to_i
|
464
|
+
end
|
465
|
+
|
456
466
|
tmp_str = vm.user_template_str
|
457
467
|
|
458
468
|
tmp_str << "\nSCHED_ACTION = "
|
459
469
|
tmp_str << "[ID = #{id}, ACTION = #{action}, "
|
470
|
+
tmp_str << "WARNING = #{warning}," if warning
|
460
471
|
tmp_str << "ARGS = \"#{options[:args]}\"," if options[:args]
|
461
|
-
tmp_str << "TIME = #{
|
472
|
+
tmp_str << "TIME = #{sched}"
|
462
473
|
tmp_str << str_periodic << ']'
|
463
474
|
|
464
475
|
vm.update(tmp_str)
|
465
476
|
end
|
466
477
|
end
|
467
478
|
|
479
|
+
# Update schedule action
|
480
|
+
#
|
481
|
+
# @param vm_id [Integer] Virtual Machine ID
|
482
|
+
# @param action_id [Integer] Sched action ID
|
483
|
+
# @param file [String] File path with update content
|
484
|
+
def update_schedule_action(vm_id, action_id, file)
|
485
|
+
perform_action(vm_id, {}, 'Sched action updated') do |vm|
|
486
|
+
rc = vm.info
|
487
|
+
|
488
|
+
if OpenNebula.is_error?(rc)
|
489
|
+
STDERR.puts "Error #{rc.message}"
|
490
|
+
exit(-1)
|
491
|
+
end
|
492
|
+
|
493
|
+
xpath = "USER_TEMPLATE/SCHED_ACTION[ID=#{action_id}]"
|
494
|
+
|
495
|
+
unless vm.retrieve_elements(xpath)
|
496
|
+
STDERR.puts "Sched action #{action_id} not found"
|
497
|
+
exit(-1)
|
498
|
+
end
|
499
|
+
|
500
|
+
# Get user information
|
501
|
+
if file
|
502
|
+
str = File.read(file)
|
503
|
+
else
|
504
|
+
str = OpenNebulaHelper.update_template(vm_id, vm, nil, xpath)
|
505
|
+
end
|
506
|
+
|
507
|
+
# Delete the current sched action
|
508
|
+
vm.delete_element(xpath)
|
509
|
+
|
510
|
+
# Add the modified sched action
|
511
|
+
tmp_str = vm.user_template_str
|
512
|
+
tmp_str << "\nSCHED_ACTION = ["
|
513
|
+
tmp_str << str.split("\n").join(',')
|
514
|
+
tmp_str << ']'
|
515
|
+
|
516
|
+
rc = vm.update(tmp_str)
|
517
|
+
|
518
|
+
if OpenNebula.is_error?(rc)
|
519
|
+
STDERR.puts "Error updating: #{rc.message}"
|
520
|
+
exit(-1)
|
521
|
+
end
|
522
|
+
end
|
523
|
+
end
|
524
|
+
|
468
525
|
RECOVER_RETRY_STEPS = {
|
469
526
|
:PROLOG_MIGRATE_FAILURE => :migrate,
|
470
527
|
:PROLOG_MIGRATE_POWEROFF_FAILURE => :migrate,
|
@@ -602,6 +659,16 @@ class OneVMHelper < OpenNebulaHelper::OneHelper
|
|
602
659
|
end
|
603
660
|
end
|
604
661
|
|
662
|
+
# Get charters configuration
|
663
|
+
#
|
664
|
+
# @return [Array]
|
665
|
+
# - action
|
666
|
+
# - time
|
667
|
+
# - warning
|
668
|
+
def get_charters
|
669
|
+
YAML.load_file(self.class.table_conf)[:charters]
|
670
|
+
end
|
671
|
+
|
605
672
|
private
|
606
673
|
|
607
674
|
def factory(id = nil)
|
@@ -1144,24 +1211,24 @@ class OneVMHelper < OpenNebulaHelper::OneHelper
|
|
1144
1211
|
CLIHelper.print_header(str_h1 % 'SCHEDULED ACTIONS', false)
|
1145
1212
|
|
1146
1213
|
CLIHelper::ShowTable.new(nil, self) do
|
1147
|
-
column :ID, '', :
|
1214
|
+
column :ID, '', :adjust => true do |d|
|
1148
1215
|
d['ID'] unless d.nil?
|
1149
1216
|
end
|
1150
1217
|
|
1151
|
-
column :ACTION, '', :
|
1218
|
+
column :ACTION, '', :adjust => true do |d|
|
1152
1219
|
d['ACTION'] unless d.nil?
|
1153
1220
|
end
|
1154
1221
|
|
1155
|
-
column :ARGS, '', :
|
1222
|
+
column :ARGS, '', :adjust => true do |d|
|
1156
1223
|
d['ARGS'] ? d['ARGS'] : '-'
|
1157
1224
|
end
|
1158
1225
|
|
1159
|
-
column :SCHEDULED, '', :
|
1226
|
+
column :SCHEDULED, '', :adjust => true do |d|
|
1160
1227
|
OpenNebulaHelper.time_to_str(d['TIME'], false) \
|
1161
1228
|
unless d.nil?
|
1162
1229
|
end
|
1163
1230
|
|
1164
|
-
column :REPEAT, '', :
|
1231
|
+
column :REPEAT, '', :adjust => true do |d|
|
1165
1232
|
str_rep = ''
|
1166
1233
|
if !d.nil? && d.key?('REPEAT')
|
1167
1234
|
if d['REPEAT'] == '0'
|
@@ -1180,7 +1247,7 @@ class OneVMHelper < OpenNebulaHelper::OneHelper
|
|
1180
1247
|
str_rep unless d.nil?
|
1181
1248
|
end
|
1182
1249
|
|
1183
|
-
column :END, '', :
|
1250
|
+
column :END, '', :adjust => true do |d|
|
1184
1251
|
str_end = ''
|
1185
1252
|
if !d.nil? && d.key?('END_TYPE')
|
1186
1253
|
if d['END_TYPE'] == '0'
|
@@ -1197,25 +1264,50 @@ class OneVMHelper < OpenNebulaHelper::OneHelper
|
|
1197
1264
|
str_end unless d.nil?
|
1198
1265
|
end
|
1199
1266
|
|
1200
|
-
column :DONE, '', :
|
1267
|
+
column :DONE, '', :adjust => true do |d|
|
1201
1268
|
OpenNebulaHelper.time_to_str(d['DONE'], false) \
|
1202
1269
|
unless d.nil?
|
1203
1270
|
end
|
1204
1271
|
|
1205
|
-
column :MESSAGE, '', :
|
1206
|
-
d['MESSAGE']
|
1272
|
+
column :MESSAGE, '', :size => 35 do |d|
|
1273
|
+
d['MESSAGE'] ? d['MESSAGE'] : '-'
|
1274
|
+
end
|
1275
|
+
|
1276
|
+
column :CHARTER, '', :left, :adjust, :size => 15 do |d|
|
1277
|
+
t1 = Time.now
|
1278
|
+
t2 = Time.at(vm['STIME'].to_i + d['TIME'].to_i)
|
1279
|
+
|
1280
|
+
days = ((t2 - t1) / (24 * 3600)).round(2)
|
1281
|
+
hours = ((t2 - t1) / 3600).round(2)
|
1282
|
+
minutes = ((t2 - t1) / 60).round(2)
|
1283
|
+
|
1284
|
+
if days > 1
|
1285
|
+
show = "In #{days} days"
|
1286
|
+
elsif days < 1 && hours > 1
|
1287
|
+
show = "In #{hours} hours"
|
1288
|
+
elsif minutes > 0
|
1289
|
+
show = "In #{minutes} minutes"
|
1290
|
+
else
|
1291
|
+
show = 'Already done'
|
1292
|
+
end
|
1293
|
+
|
1294
|
+
if (t1 - vm['STIME'].to_i).to_i > d['WARNING'].to_i
|
1295
|
+
"#{show} *"
|
1296
|
+
else
|
1297
|
+
show
|
1298
|
+
end
|
1207
1299
|
end
|
1208
1300
|
end.show([vm_hash['VM']['USER_TEMPLATE']['SCHED_ACTION']].flatten,
|
1209
1301
|
{})
|
1210
1302
|
end
|
1211
1303
|
|
1304
|
+
if !options[:all]
|
1305
|
+
vm.delete_element('/VM/USER_TEMPLATE/SCHED_ACTION')
|
1306
|
+
end
|
1307
|
+
|
1212
1308
|
if vm.has_elements?('/VM/USER_TEMPLATE')
|
1213
1309
|
puts
|
1214
1310
|
|
1215
|
-
if !options[:all]
|
1216
|
-
vm.delete_element('/VM/USER_TEMPLATE/SCHED_ACTION')
|
1217
|
-
end
|
1218
|
-
|
1219
1311
|
CLIHelper.print_header(str_h1 % 'USER TEMPLATE', false)
|
1220
1312
|
puts vm.template_like_str('USER_TEMPLATE')
|
1221
1313
|
end
|