vmpooler 0.10.3 → 0.12.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/vmpooler +2 -3
- data/lib/vmpooler.rb +20 -11
- data/lib/vmpooler/api.rb +2 -0
- data/lib/vmpooler/api/dashboard.rb +12 -5
- data/lib/vmpooler/api/helpers.rb +49 -44
- data/lib/vmpooler/api/reroute.rb +2 -0
- data/lib/vmpooler/api/v1.rb +58 -58
- data/lib/vmpooler/dashboard.rb +2 -1
- data/lib/vmpooler/dummy_statsd.rb +2 -0
- data/lib/vmpooler/generic_connection_pool.rb +8 -6
- data/lib/vmpooler/graphite.rb +5 -5
- data/lib/vmpooler/logger.rb +3 -1
- data/lib/vmpooler/pool_manager.rb +143 -126
- data/lib/vmpooler/providers.rb +13 -15
- data/lib/vmpooler/providers/base.rb +5 -3
- data/lib/vmpooler/providers/dummy.rb +16 -12
- data/lib/vmpooler/providers/vsphere.rb +118 -99
- data/lib/vmpooler/statsd.rb +9 -9
- data/lib/vmpooler/version.rb +3 -1
- metadata +14 -14
data/lib/vmpooler/dashboard.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'connection_pool'
|
2
4
|
|
3
5
|
module Vmpooler
|
@@ -20,15 +22,15 @@ module Vmpooler
|
|
20
22
|
start = Time.now
|
21
23
|
conn = checkout(options)
|
22
24
|
timespan_ms = ((Time.now - start) * 1000).to_i
|
23
|
-
@metrics
|
24
|
-
@metrics
|
25
|
+
@metrics&.gauge(@metric_prefix + '.available', @available.length)
|
26
|
+
@metrics&.timing(@metric_prefix + '.waited', timespan_ms)
|
25
27
|
begin
|
26
28
|
Thread.handle_interrupt(Exception => :immediate) do
|
27
29
|
yield conn
|
28
30
|
end
|
29
31
|
ensure
|
30
32
|
checkin
|
31
|
-
@metrics
|
33
|
+
@metrics&.gauge(@metric_prefix + '.available', @available.length)
|
32
34
|
end
|
33
35
|
end
|
34
36
|
end
|
@@ -38,13 +40,13 @@ module Vmpooler
|
|
38
40
|
start = Time.now
|
39
41
|
conn = checkout(options)
|
40
42
|
timespan_ms = ((Time.now - start) * 1000).to_i
|
41
|
-
@metrics
|
42
|
-
@metrics
|
43
|
+
@metrics&.gauge(@metric_prefix + '.available', @available.length)
|
44
|
+
@metrics&.timing(@metric_prefix + '.waited', timespan_ms)
|
43
45
|
begin
|
44
46
|
yield conn
|
45
47
|
ensure
|
46
48
|
checkin
|
47
|
-
@metrics
|
49
|
+
@metrics&.gauge(@metric_prefix + '.available', @available.length)
|
48
50
|
end
|
49
51
|
end
|
50
52
|
end
|
data/lib/vmpooler/graphite.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'rubygems' unless defined?(Gem)
|
2
4
|
|
3
5
|
module Vmpooler
|
@@ -5,9 +7,7 @@ module Vmpooler
|
|
5
7
|
attr_reader :server, :port, :prefix
|
6
8
|
|
7
9
|
def initialize(params = {})
|
8
|
-
if params['server'].nil? || params['server'].empty?
|
9
|
-
raise ArgumentError, "Graphite server is required. Config: #{params.inspect}"
|
10
|
-
end
|
10
|
+
raise ArgumentError, "Graphite server is required. Config: #{params.inspect}" if params['server'].nil? || params['server'].empty?
|
11
11
|
|
12
12
|
@server = params['server']
|
13
13
|
@port = params['port'] || 2003
|
@@ -35,8 +35,8 @@ module Vmpooler
|
|
35
35
|
socket.close
|
36
36
|
end
|
37
37
|
end
|
38
|
-
rescue =>
|
39
|
-
|
38
|
+
rescue StandardError => e
|
39
|
+
warn "Failure logging #{path} to graphite server [#{server}:#{port}]: #{e}"
|
40
40
|
end
|
41
41
|
end
|
42
42
|
end
|
data/lib/vmpooler/logger.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'rubygems' unless defined?(Gem)
|
2
4
|
|
3
5
|
module Vmpooler
|
@@ -14,7 +16,7 @@ module Vmpooler
|
|
14
16
|
|
15
17
|
puts "[#{stamp}] #{string}" if ENV['VMPOOLER_DEBUG']
|
16
18
|
|
17
|
-
open(@file, 'a') do |f|
|
19
|
+
File.open(@file, 'a') do |f|
|
18
20
|
f.puts "[#{stamp}] #{string}"
|
19
21
|
end
|
20
22
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'vmpooler/providers'
|
2
4
|
require 'spicy-proton'
|
3
5
|
|
@@ -54,7 +56,7 @@ module Vmpooler
|
|
54
56
|
pool_keys.each do |k|
|
55
57
|
to_set[k] = pool[k]
|
56
58
|
end
|
57
|
-
to_set['alias'] = pool['alias'].join(',') if to_set.
|
59
|
+
to_set['alias'] = pool['alias'].join(',') if to_set.key?('alias')
|
58
60
|
$redis.hmset("vmpooler__pool__#{pool['name']}", to_set.to_a.flatten) unless to_set.empty?
|
59
61
|
end
|
60
62
|
previously_configured_pools.each do |pool|
|
@@ -63,7 +65,7 @@ module Vmpooler
|
|
63
65
|
$redis.del("vmpooler__pool__#{pool}")
|
64
66
|
end
|
65
67
|
end
|
66
|
-
|
68
|
+
nil
|
67
69
|
end
|
68
70
|
|
69
71
|
# Check the state of a VM
|
@@ -71,8 +73,8 @@ module Vmpooler
|
|
71
73
|
Thread.new do
|
72
74
|
begin
|
73
75
|
_check_pending_vm(vm, pool, timeout, provider)
|
74
|
-
rescue =>
|
75
|
-
$logger.log('s', "[!] [#{pool}] '#{vm}' #{timeout} #{provider} errored while checking a pending vm : #{
|
76
|
+
rescue StandardError => e
|
77
|
+
$logger.log('s', "[!] [#{pool}] '#{vm}' #{timeout} #{provider} errored while checking a pending vm : #{e}")
|
76
78
|
fail_pending_vm(vm, pool, timeout)
|
77
79
|
raise
|
78
80
|
end
|
@@ -82,6 +84,7 @@ module Vmpooler
|
|
82
84
|
def _check_pending_vm(vm, pool, timeout, provider)
|
83
85
|
mutex = vm_mutex(vm)
|
84
86
|
return if mutex.locked?
|
87
|
+
|
85
88
|
mutex.synchronize do
|
86
89
|
if provider.vm_ready?(pool, vm)
|
87
90
|
move_pending_vm_to_ready(vm, pool)
|
@@ -111,14 +114,14 @@ module Vmpooler
|
|
111
114
|
end
|
112
115
|
end
|
113
116
|
true
|
114
|
-
rescue =>
|
115
|
-
$logger.log('d', "Fail pending VM failed with an error: #{
|
117
|
+
rescue StandardError => e
|
118
|
+
$logger.log('d', "Fail pending VM failed with an error: #{e}")
|
116
119
|
false
|
117
120
|
end
|
118
121
|
|
119
122
|
def move_pending_vm_to_ready(vm, pool)
|
120
123
|
clone_time = $redis.hget('vmpooler__vm__' + vm, 'clone')
|
121
|
-
finish = format('
|
124
|
+
finish = format('%<time>.2f', time: Time.now - Time.parse(clone_time)) if clone_time
|
122
125
|
|
123
126
|
$redis.smove('vmpooler__pending__' + pool, 'vmpooler__ready__' + pool, vm)
|
124
127
|
$redis.hset('vmpooler__boot__' + Date.today.to_s, pool + ':' + vm, finish) # maybe remove as this is never used by vmpooler itself?
|
@@ -134,8 +137,9 @@ module Vmpooler
|
|
134
137
|
def vm_still_ready?(pool_name, vm_name, provider)
|
135
138
|
# Check if the VM is still ready/available
|
136
139
|
return true if provider.vm_ready?(pool_name, vm_name)
|
140
|
+
|
137
141
|
raise("VM #{vm_name} is not ready")
|
138
|
-
rescue
|
142
|
+
rescue StandardError
|
139
143
|
move_vm_queue(pool_name, vm_name, 'ready', 'completed', "is unreachable, removed from 'ready' queue")
|
140
144
|
end
|
141
145
|
|
@@ -143,8 +147,8 @@ module Vmpooler
|
|
143
147
|
Thread.new do
|
144
148
|
begin
|
145
149
|
_check_ready_vm(vm, pool_name, ttl, provider)
|
146
|
-
rescue =>
|
147
|
-
$logger.log('s', "[!] [#{pool_name}] '#{vm}' failed while checking a ready vm : #{
|
150
|
+
rescue StandardError => e
|
151
|
+
$logger.log('s', "[!] [#{pool_name}] '#{vm}' failed while checking a ready vm : #{e}")
|
148
152
|
raise
|
149
153
|
end
|
150
154
|
end
|
@@ -154,6 +158,7 @@ module Vmpooler
|
|
154
158
|
# Periodically check that the VM is available
|
155
159
|
mutex = vm_mutex(vm)
|
156
160
|
return if mutex.locked?
|
161
|
+
|
157
162
|
mutex.synchronize do
|
158
163
|
check_stamp = $redis.hget('vmpooler__vm__' + vm, 'check')
|
159
164
|
return if check_stamp && (((Time.now - Time.parse(check_stamp)) / 60) <= $config[:config]['vm_checktime'])
|
@@ -176,13 +181,13 @@ module Vmpooler
|
|
176
181
|
end
|
177
182
|
end
|
178
183
|
|
179
|
-
return if
|
184
|
+
return if mismatched_hostname?(vm, pool_name, provider)
|
180
185
|
|
181
186
|
vm_still_ready?(pool_name, vm, provider)
|
182
187
|
end
|
183
188
|
end
|
184
189
|
|
185
|
-
def
|
190
|
+
def mismatched_hostname?(vm, pool_name, provider)
|
186
191
|
pool_config = $config[:pools][$config[:pool_index][pool_name]]
|
187
192
|
check_hostname = pool_config['check_hostname_for_mismatch']
|
188
193
|
check_hostname = $config[:config]['check_ready_vm_hostname_for_mismatch'] if check_hostname.nil?
|
@@ -201,22 +206,24 @@ module Vmpooler
|
|
201
206
|
# Check if the hostname has magically changed from underneath Pooler
|
202
207
|
vm_hash = provider.get_vm(pool_name, vm)
|
203
208
|
return unless vm_hash.is_a? Hash
|
209
|
+
|
204
210
|
hostname = vm_hash['hostname']
|
205
211
|
|
206
212
|
return if hostname.nil?
|
207
213
|
return if hostname.empty?
|
208
214
|
return if hostname == vm
|
215
|
+
|
209
216
|
$redis.smove('vmpooler__ready__' + pool_name, 'vmpooler__completed__' + pool_name, vm)
|
210
217
|
$logger.log('d', "[!] [#{pool_name}] '#{vm}' has mismatched hostname #{hostname}, removed from 'ready' queue")
|
211
|
-
|
218
|
+
true
|
212
219
|
end
|
213
220
|
|
214
221
|
def check_running_vm(vm, pool, ttl, provider)
|
215
222
|
Thread.new do
|
216
223
|
begin
|
217
224
|
_check_running_vm(vm, pool, ttl, provider)
|
218
|
-
rescue =>
|
219
|
-
$logger.log('s', "[!] [#{pool}] '#{vm}' failed while checking VM with an error: #{
|
225
|
+
rescue StandardError => e
|
226
|
+
$logger.log('s', "[!] [#{pool}] '#{vm}' failed while checking VM with an error: #{e}")
|
220
227
|
raise
|
221
228
|
end
|
222
229
|
end
|
@@ -225,6 +232,7 @@ module Vmpooler
|
|
225
232
|
def _check_running_vm(vm, pool, ttl, provider)
|
226
233
|
mutex = vm_mutex(vm)
|
227
234
|
return if mutex.locked?
|
235
|
+
|
228
236
|
mutex.synchronize do
|
229
237
|
# Check that VM is within defined lifetime
|
230
238
|
checkouttime = $redis.hget('vmpooler__active__' + pool, vm)
|
@@ -245,7 +253,7 @@ module Vmpooler
|
|
245
253
|
if host
|
246
254
|
return
|
247
255
|
else
|
248
|
-
move_vm_queue(pool, vm, 'running', 'completed',
|
256
|
+
move_vm_queue(pool, vm, 'running', 'completed', 'is no longer in inventory, removing from running')
|
249
257
|
end
|
250
258
|
end
|
251
259
|
end
|
@@ -261,14 +269,14 @@ module Vmpooler
|
|
261
269
|
Thread.new do
|
262
270
|
begin
|
263
271
|
_clone_vm(pool_name, provider)
|
264
|
-
rescue =>
|
265
|
-
$logger.log('s', "[!] [#{pool_name}] failed while cloning VM with an error: #{
|
272
|
+
rescue StandardError => e
|
273
|
+
$logger.log('s', "[!] [#{pool_name}] failed while cloning VM with an error: #{e}")
|
266
274
|
raise
|
267
275
|
end
|
268
276
|
end
|
269
277
|
end
|
270
278
|
|
271
|
-
def generate_and_check_hostname(
|
279
|
+
def generate_and_check_hostname(_pool_name)
|
272
280
|
# Generate a randomized hostname. The total name must no longer than 15
|
273
281
|
# character including the hyphen. The shortest adjective in the corpus is
|
274
282
|
# three characters long. Therefore, we can technically select a noun up to 11
|
@@ -278,12 +286,12 @@ module Vmpooler
|
|
278
286
|
# inviting more conflicts. We favor selecting a longer noun rather than a
|
279
287
|
# longer adjective because longer adjectives tend to be less fun.
|
280
288
|
noun = @name_generator.noun(max: 10)
|
281
|
-
adjective = @name_generator.adjective(max: 14-noun.length)
|
289
|
+
adjective = @name_generator.adjective(max: 14 - noun.length)
|
282
290
|
random_name = [adjective, noun].join('-')
|
283
291
|
hostname = $config[:config]['prefix'] + random_name
|
284
292
|
available = $redis.hlen('vmpooler__vm__' + hostname) == 0
|
285
293
|
|
286
|
-
|
294
|
+
[hostname, available]
|
287
295
|
end
|
288
296
|
|
289
297
|
def find_unique_hostname(pool_name)
|
@@ -297,9 +305,9 @@ module Vmpooler
|
|
297
305
|
$metrics.increment("errors.duplicatehostname.#{pool_name}")
|
298
306
|
$logger.log('s', "[!] [#{pool_name}] Generated hostname #{hostname} was not unique (attempt \##{hostname_retries} of #{max_hostname_retries})")
|
299
307
|
end
|
300
|
-
|
308
|
+
|
301
309
|
raise "Unable to generate a unique hostname after #{hostname_retries} attempts. The last hostname checked was #{hostname}" unless available
|
302
|
-
|
310
|
+
|
303
311
|
hostname
|
304
312
|
end
|
305
313
|
|
@@ -315,18 +323,18 @@ module Vmpooler
|
|
315
323
|
$logger.log('d', "[ ] [#{pool_name}] Starting to clone '#{new_vmname}'")
|
316
324
|
start = Time.now
|
317
325
|
provider.create_vm(pool_name, new_vmname)
|
318
|
-
finish = format('
|
326
|
+
finish = format('%<time>.2f', time: Time.now - start)
|
319
327
|
|
320
328
|
$redis.hset('vmpooler__clone__' + Date.today.to_s, pool_name + ':' + new_vmname, finish)
|
321
329
|
$redis.hset('vmpooler__vm__' + new_vmname, 'clone_time', finish)
|
322
330
|
$logger.log('s', "[+] [#{pool_name}] '#{new_vmname}' cloned in #{finish} seconds")
|
323
331
|
|
324
332
|
$metrics.timing("clone.#{pool_name}", finish)
|
325
|
-
rescue
|
333
|
+
rescue StandardError
|
326
334
|
$redis.srem("vmpooler__pending__#{pool_name}", new_vmname)
|
327
335
|
expiration_ttl = $config[:redis]['data_ttl'].to_i * 60 * 60
|
328
336
|
$redis.expire("vmpooler__vm__#{new_vmname}", expiration_ttl)
|
329
|
-
raise
|
337
|
+
raise
|
330
338
|
ensure
|
331
339
|
$redis.decr('vmpooler__tasks__clone')
|
332
340
|
end
|
@@ -337,8 +345,8 @@ module Vmpooler
|
|
337
345
|
Thread.new do
|
338
346
|
begin
|
339
347
|
_destroy_vm(vm, pool, provider)
|
340
|
-
rescue =>
|
341
|
-
$logger.log('d', "[!] [#{pool}] '#{vm}' failed while destroying the VM with an error: #{
|
348
|
+
rescue StandardError => e
|
349
|
+
$logger.log('d', "[!] [#{pool}] '#{vm}' failed while destroying the VM with an error: #{e}")
|
342
350
|
raise
|
343
351
|
end
|
344
352
|
end
|
@@ -347,6 +355,7 @@ module Vmpooler
|
|
347
355
|
def _destroy_vm(vm, pool, provider)
|
348
356
|
mutex = vm_mutex(vm)
|
349
357
|
return if mutex.locked?
|
358
|
+
|
350
359
|
mutex.synchronize do
|
351
360
|
$redis.hdel('vmpooler__active__' + pool, vm)
|
352
361
|
$redis.hset('vmpooler__vm__' + vm, 'destroy', Time.now)
|
@@ -360,7 +369,7 @@ module Vmpooler
|
|
360
369
|
|
361
370
|
$redis.srem('vmpooler__completed__' + pool, vm)
|
362
371
|
|
363
|
-
finish = format('
|
372
|
+
finish = format('%<time>.2f', time: Time.now - start)
|
364
373
|
$logger.log('s', "[-] [#{pool}] '#{vm}' destroyed in #{finish} seconds")
|
365
374
|
$metrics.timing("destroy.#{pool}", finish)
|
366
375
|
get_vm_usage_labels(vm)
|
@@ -370,11 +379,13 @@ module Vmpooler
|
|
370
379
|
|
371
380
|
def get_vm_usage_labels(vm)
|
372
381
|
return unless $config[:config]['usage_stats']
|
382
|
+
|
373
383
|
checkout = $redis.hget("vmpooler__vm__#{vm}", 'checkout')
|
374
384
|
return if checkout.nil?
|
385
|
+
|
375
386
|
jenkins_build_url = $redis.hget("vmpooler__vm__#{vm}", 'tag:jenkins_build_url')
|
376
387
|
user = $redis.hget("vmpooler__vm__#{vm}", 'token:user') || 'unauthenticated'
|
377
|
-
poolname = $redis.hget("vmpooler__vm__#{vm}",
|
388
|
+
poolname = $redis.hget("vmpooler__vm__#{vm}", 'template')
|
378
389
|
|
379
390
|
unless jenkins_build_url
|
380
391
|
user = user.gsub('.', '_')
|
@@ -404,25 +415,24 @@ module Vmpooler
|
|
404
415
|
poolname
|
405
416
|
]
|
406
417
|
|
407
|
-
metric_parts = metric_parts.reject
|
418
|
+
metric_parts = metric_parts.reject(&:nil?)
|
408
419
|
metric_parts = metric_parts.map { |s| s.gsub('.', '_') }
|
409
420
|
|
410
421
|
$metrics.increment(metric_parts.join('.'))
|
411
|
-
rescue =>
|
412
|
-
logger.log('d', "[!] [#{poolname}] failed while evaluating usage labels on '#{vm}' with an error: #{
|
422
|
+
rescue StandardError => e
|
423
|
+
logger.log('d', "[!] [#{poolname}] failed while evaluating usage labels on '#{vm}' with an error: #{e}")
|
413
424
|
end
|
414
425
|
|
415
426
|
def component_to_test(match, labels_string)
|
416
427
|
return if labels_string.nil?
|
428
|
+
|
417
429
|
labels_string_parts = labels_string.split(',')
|
418
430
|
labels_string_parts.each do |part|
|
419
431
|
key, value = part.split('=')
|
420
432
|
next if value.nil?
|
421
|
-
if key == match
|
422
|
-
return value
|
423
|
-
end
|
433
|
+
return value if key == match
|
424
434
|
end
|
425
|
-
|
435
|
+
nil
|
426
436
|
end
|
427
437
|
|
428
438
|
def purge_unused_vms_and_folders
|
@@ -434,24 +444,24 @@ module Vmpooler
|
|
434
444
|
if provider_purge
|
435
445
|
Thread.new do
|
436
446
|
begin
|
437
|
-
purge_vms_and_folders(
|
438
|
-
rescue =>
|
439
|
-
$logger.log('s', "[!] failed while purging provider #{provider
|
447
|
+
purge_vms_and_folders(provider.to_s)
|
448
|
+
rescue StandardError => e
|
449
|
+
$logger.log('s', "[!] failed while purging provider #{provider} VMs and folders with an error: #{e}")
|
440
450
|
end
|
441
451
|
end
|
442
452
|
end
|
443
453
|
end
|
444
|
-
|
454
|
+
nil
|
445
455
|
end
|
446
456
|
|
447
457
|
# Return a list of pool folders
|
448
|
-
def pool_folders(
|
449
|
-
provider_name = provider.name
|
458
|
+
def pool_folders(provider_name)
|
450
459
|
folders = {}
|
451
460
|
$config[:pools].each do |pool|
|
452
461
|
next unless pool['provider'] == provider_name
|
462
|
+
|
453
463
|
folder_parts = pool['folder'].split('/')
|
454
|
-
datacenter =
|
464
|
+
datacenter = $providers[provider_name].get_target_datacenter_from_config(pool['name'])
|
455
465
|
folders[folder_parts.pop] = "#{datacenter}/vm/#{folder_parts.join('/')}"
|
456
466
|
end
|
457
467
|
folders
|
@@ -459,7 +469,7 @@ module Vmpooler
|
|
459
469
|
|
460
470
|
def get_base_folders(folders)
|
461
471
|
base = []
|
462
|
-
folders.each do |
|
472
|
+
folders.each do |_key, value|
|
463
473
|
base << value
|
464
474
|
end
|
465
475
|
base.uniq
|
@@ -468,16 +478,16 @@ module Vmpooler
|
|
468
478
|
def purge_vms_and_folders(provider)
|
469
479
|
configured_folders = pool_folders(provider)
|
470
480
|
base_folders = get_base_folders(configured_folders)
|
471
|
-
whitelist = provider.provider_config['folder_whitelist']
|
472
|
-
provider.purge_unconfigured_folders(base_folders, configured_folders, whitelist)
|
481
|
+
whitelist = $providers[provider].provider_config['folder_whitelist']
|
482
|
+
$providers[provider].purge_unconfigured_folders(base_folders, configured_folders, whitelist)
|
473
483
|
end
|
474
484
|
|
475
485
|
def create_vm_disk(pool_name, vm, disk_size, provider)
|
476
486
|
Thread.new do
|
477
487
|
begin
|
478
488
|
_create_vm_disk(pool_name, vm, disk_size, provider)
|
479
|
-
rescue =>
|
480
|
-
$logger.log('d', "[!] [#{pool_name}] '#{vm}' failed while creating disk: #{
|
489
|
+
rescue StandardError => e
|
490
|
+
$logger.log('d', "[!] [#{pool_name}] '#{vm}' failed while creating disk: #{e}")
|
481
491
|
raise
|
482
492
|
end
|
483
493
|
end
|
@@ -492,7 +502,7 @@ module Vmpooler
|
|
492
502
|
|
493
503
|
result = provider.create_disk(pool_name, vm_name, disk_size.to_i)
|
494
504
|
|
495
|
-
finish = format('
|
505
|
+
finish = format('%<time>.2f', time: Time.now - start)
|
496
506
|
|
497
507
|
if result
|
498
508
|
rdisks = $redis.hget('vmpooler__vm__' + vm_name, 'disk')
|
@@ -512,8 +522,8 @@ module Vmpooler
|
|
512
522
|
Thread.new do
|
513
523
|
begin
|
514
524
|
_create_vm_snapshot(pool_name, vm, snapshot_name, provider)
|
515
|
-
rescue =>
|
516
|
-
$logger.log('d', "[!] [#{pool_name}] '#{vm}' failed while creating snapshot: #{
|
525
|
+
rescue StandardError => e
|
526
|
+
$logger.log('d', "[!] [#{pool_name}] '#{vm}' failed while creating snapshot: #{e}")
|
517
527
|
raise
|
518
528
|
end
|
519
529
|
end
|
@@ -525,7 +535,7 @@ module Vmpooler
|
|
525
535
|
|
526
536
|
result = provider.create_snapshot(pool_name, vm_name, snapshot_name)
|
527
537
|
|
528
|
-
finish = format('
|
538
|
+
finish = format('%<time>.2f', time: Time.now - start)
|
529
539
|
|
530
540
|
if result
|
531
541
|
$redis.hset('vmpooler__vm__' + vm_name, 'snapshot:' + snapshot_name, Time.now.to_s)
|
@@ -541,8 +551,8 @@ module Vmpooler
|
|
541
551
|
Thread.new do
|
542
552
|
begin
|
543
553
|
_revert_vm_snapshot(pool_name, vm, snapshot_name, provider)
|
544
|
-
rescue =>
|
545
|
-
$logger.log('d', "[!] [#{pool_name}] '#{vm}' failed while reverting snapshot: #{
|
554
|
+
rescue StandardError => e
|
555
|
+
$logger.log('d', "[!] [#{pool_name}] '#{vm}' failed while reverting snapshot: #{e}")
|
546
556
|
raise
|
547
557
|
end
|
548
558
|
end
|
@@ -554,7 +564,7 @@ module Vmpooler
|
|
554
564
|
|
555
565
|
result = provider.revert_snapshot(pool_name, vm_name, snapshot_name)
|
556
566
|
|
557
|
-
finish = format('
|
567
|
+
finish = format('%<time>.2f', time: Time.now - start)
|
558
568
|
|
559
569
|
if result
|
560
570
|
$logger.log('s', "[+] [snapshot_manager] '#{vm_name}' reverted to snapshot '#{snapshot_name}' in #{finish} seconds")
|
@@ -574,14 +584,14 @@ module Vmpooler
|
|
574
584
|
# ie. ["vsphere", "dummy"]
|
575
585
|
def used_providers
|
576
586
|
pools = config[:pools] || []
|
577
|
-
@used_providers ||= (pools.map { |pool| pool[:provider] || pool['provider'] }.compact + default_providers
|
587
|
+
@used_providers ||= (pools.map { |pool| pool[:provider] || pool['provider'] }.compact + default_providers).uniq
|
578
588
|
end
|
579
589
|
|
580
590
|
# @return [Array] - returns a list of providers that should always be loaded
|
581
591
|
# note: vsphere is the default if user does not specify although this should not be
|
582
592
|
# if vsphere is to no longer be loaded by default please remove
|
583
593
|
def default_providers
|
584
|
-
@default_providers ||= %w
|
594
|
+
@default_providers ||= %w[vsphere dummy]
|
585
595
|
end
|
586
596
|
|
587
597
|
def get_pool_name_for_vm(vm_name)
|
@@ -592,8 +602,9 @@ module Vmpooler
|
|
592
602
|
# @param pool_name [String] - the name of the pool
|
593
603
|
# @return [Provider] - returns the provider class Object
|
594
604
|
def get_provider_for_pool(pool_name)
|
595
|
-
pool = $config[:pools].find { |
|
605
|
+
pool = $config[:pools].find { |p| p['name'] == pool_name }
|
596
606
|
return nil unless pool
|
607
|
+
|
597
608
|
provider_name = pool.fetch('provider', nil)
|
598
609
|
$providers[provider_name]
|
599
610
|
end
|
@@ -607,8 +618,9 @@ module Vmpooler
|
|
607
618
|
_check_disk_queue
|
608
619
|
sleep(loop_delay)
|
609
620
|
|
610
|
-
unless maxloop
|
621
|
+
unless maxloop == 0
|
611
622
|
break if loop_count >= maxloop
|
623
|
+
|
612
624
|
loop_count += 1
|
613
625
|
end
|
614
626
|
end
|
@@ -627,8 +639,8 @@ module Vmpooler
|
|
627
639
|
raise("Missing Provider for vm #{vm_name} in pool #{pool_name}") if provider.nil?
|
628
640
|
|
629
641
|
create_vm_disk(pool_name, vm_name, disk_size, provider)
|
630
|
-
rescue =>
|
631
|
-
$logger.log('s', "[!] [disk_manager] disk creation appears to have failed: #{
|
642
|
+
rescue StandardError => e
|
643
|
+
$logger.log('s', "[!] [disk_manager] disk creation appears to have failed: #{e}")
|
632
644
|
end
|
633
645
|
end
|
634
646
|
end
|
@@ -642,8 +654,9 @@ module Vmpooler
|
|
642
654
|
_check_snapshot_queue
|
643
655
|
sleep(loop_delay)
|
644
656
|
|
645
|
-
unless maxloop
|
657
|
+
unless maxloop == 0
|
646
658
|
break if loop_count >= maxloop
|
659
|
+
|
647
660
|
loop_count += 1
|
648
661
|
end
|
649
662
|
end
|
@@ -663,8 +676,8 @@ module Vmpooler
|
|
663
676
|
raise("Missing Provider for vm #{vm_name} in pool #{pool_name}") if provider.nil?
|
664
677
|
|
665
678
|
create_vm_snapshot(pool_name, vm_name, snapshot_name, provider)
|
666
|
-
rescue =>
|
667
|
-
$logger.log('s', "[!] [snapshot_manager] snapshot create appears to have failed: #{
|
679
|
+
rescue StandardError => e
|
680
|
+
$logger.log('s', "[!] [snapshot_manager] snapshot create appears to have failed: #{e}")
|
668
681
|
end
|
669
682
|
end
|
670
683
|
|
@@ -680,8 +693,8 @@ module Vmpooler
|
|
680
693
|
raise("Missing Provider for vm #{vm_name} in pool #{pool_name}") if provider.nil?
|
681
694
|
|
682
695
|
revert_vm_snapshot(pool_name, vm_name, snapshot_name, provider)
|
683
|
-
rescue =>
|
684
|
-
$logger.log('s', "[!] [snapshot_manager] snapshot revert appears to have failed: #{
|
696
|
+
rescue StandardError => e
|
697
|
+
$logger.log('s', "[!] [snapshot_manager] snapshot revert appears to have failed: #{e}")
|
685
698
|
end
|
686
699
|
end
|
687
700
|
end
|
@@ -694,8 +707,8 @@ module Vmpooler
|
|
694
707
|
$redis.srem("vmpooler__migrating__#{pool_name}", vm_name)
|
695
708
|
provider.migrate_vm(pool_name, vm_name)
|
696
709
|
end
|
697
|
-
rescue =>
|
698
|
-
$logger.log('s', "[x] [#{pool_name}] '#{vm_name}' migration failed with an error: #{
|
710
|
+
rescue StandardError => e
|
711
|
+
$logger.log('s', "[x] [#{pool_name}] '#{vm_name}' migration failed with an error: #{e}")
|
699
712
|
end
|
700
713
|
end
|
701
714
|
end
|
@@ -724,17 +737,11 @@ module Vmpooler
|
|
724
737
|
wakeup_by = Time.now + wakeup_period
|
725
738
|
return if time_passed?(:exit_by, exit_by)
|
726
739
|
|
727
|
-
if options[:pool_size_change]
|
728
|
-
initial_ready_size = $redis.scard("vmpooler__ready__#{options[:poolname]}")
|
729
|
-
end
|
740
|
+
initial_ready_size = $redis.scard("vmpooler__ready__#{options[:poolname]}") if options[:pool_size_change]
|
730
741
|
|
731
|
-
if options[:clone_target_change]
|
732
|
-
initial_clone_target = $redis.hget("vmpooler__pool__#{options[:poolname]}", options[:clone_target])
|
733
|
-
end
|
742
|
+
initial_clone_target = $redis.hget("vmpooler__pool__#{options[:poolname]}", options[:clone_target]) if options[:clone_target_change]
|
734
743
|
|
735
|
-
if options[:pool_template_change]
|
736
|
-
initial_template = $redis.hget('vmpooler__template__prepared', options[:poolname])
|
737
|
-
end
|
744
|
+
initial_template = $redis.hget('vmpooler__template__prepared', options[:poolname]) if options[:pool_template_change]
|
738
745
|
|
739
746
|
loop do
|
740
747
|
sleep(1)
|
@@ -751,7 +758,7 @@ module Vmpooler
|
|
751
758
|
end
|
752
759
|
|
753
760
|
if options[:clone_target_change]
|
754
|
-
clone_target = $redis.hget(
|
761
|
+
clone_target = $redis.hget('vmpooler__config__clone_target}', options[:poolname])
|
755
762
|
if clone_target
|
756
763
|
break unless clone_target == initial_clone_target
|
757
764
|
end
|
@@ -795,6 +802,7 @@ module Vmpooler
|
|
795
802
|
loop_delay = loop_delay_min
|
796
803
|
provider = get_provider_for_pool(pool['name'])
|
797
804
|
raise("Could not find provider '#{pool['provider']}") if provider.nil?
|
805
|
+
|
798
806
|
sync_pool_template(pool)
|
799
807
|
loop do
|
800
808
|
result = _check_pool(pool, provider)
|
@@ -807,13 +815,16 @@ module Vmpooler
|
|
807
815
|
end
|
808
816
|
sleep_with_wakeup_events(loop_delay, loop_delay_min, pool_size_change: true, poolname: pool['name'], pool_template_change: true, clone_target_change: true, pool_reset: true)
|
809
817
|
|
810
|
-
unless maxloop
|
818
|
+
unless maxloop == 0
|
811
819
|
break if loop_count >= maxloop
|
820
|
+
|
812
821
|
loop_count += 1
|
813
822
|
end
|
814
823
|
end
|
815
|
-
rescue
|
816
|
-
|
824
|
+
rescue Redis::CannotConnectError
|
825
|
+
raise
|
826
|
+
rescue StandardError => e
|
827
|
+
$logger.log('s', "[!] [#{pool['name']}] Error while checking the pool: #{e}")
|
817
828
|
raise
|
818
829
|
end
|
819
830
|
end
|
@@ -828,19 +839,13 @@ module Vmpooler
|
|
828
839
|
end
|
829
840
|
|
830
841
|
def dereference_mutex(vmname)
|
831
|
-
if @vm_mutex.delete(vmname)
|
832
|
-
return true
|
833
|
-
else
|
834
|
-
return
|
835
|
-
end
|
842
|
+
true if @vm_mutex.delete(vmname)
|
836
843
|
end
|
837
844
|
|
838
845
|
def sync_pool_template(pool)
|
839
846
|
pool_template = $redis.hget('vmpooler__config__template', pool['name'])
|
840
847
|
if pool_template
|
841
|
-
unless pool['template'] == pool_template
|
842
|
-
pool['template'] = pool_template
|
843
|
-
end
|
848
|
+
pool['template'] = pool_template unless pool['template'] == pool_template
|
844
849
|
end
|
845
850
|
end
|
846
851
|
|
@@ -850,8 +855,8 @@ module Vmpooler
|
|
850
855
|
begin
|
851
856
|
provider.create_template_delta_disks(pool)
|
852
857
|
$redis.sadd('vmpooler__template__deltas', pool['template'])
|
853
|
-
rescue =>
|
854
|
-
$logger.log('s', "[!] [#{pool['name']}] failed while preparing a template with an error. As a result vmpooler could not create the template delta disks. Either a template delta disk already exists, or the template delta disk creation failed. The error is: #{
|
858
|
+
rescue StandardError => e
|
859
|
+
$logger.log('s', "[!] [#{pool['name']}] failed while preparing a template with an error. As a result vmpooler could not create the template delta disks. Either a template delta disk already exists, or the template delta disk creation failed. The error is: #{e}")
|
855
860
|
end
|
856
861
|
end
|
857
862
|
end
|
@@ -863,6 +868,7 @@ module Vmpooler
|
|
863
868
|
prepared_template = $redis.hget('vmpooler__template__prepared', pool['name'])
|
864
869
|
configured_template = $redis.hget('vmpooler__config__template', pool['name'])
|
865
870
|
return if mutex.locked?
|
871
|
+
|
866
872
|
if prepared_template.nil?
|
867
873
|
mutex.synchronize do
|
868
874
|
prepare_template(pool, provider)
|
@@ -878,6 +884,7 @@ module Vmpooler
|
|
878
884
|
end
|
879
885
|
return if configured_template.nil?
|
880
886
|
return if configured_template == prepared_template
|
887
|
+
|
881
888
|
mutex.synchronize do
|
882
889
|
update_pool_template(pool, provider, configured_template, prepared_template)
|
883
890
|
end
|
@@ -913,9 +920,11 @@ module Vmpooler
|
|
913
920
|
def update_clone_target(pool)
|
914
921
|
mutex = pool_mutex(pool['name'])
|
915
922
|
return if mutex.locked?
|
923
|
+
|
916
924
|
clone_target = $redis.hget('vmpooler__config__clone_target', pool['name'])
|
917
925
|
return if clone_target.nil?
|
918
926
|
return if clone_target == pool['clone_target']
|
927
|
+
|
919
928
|
$logger.log('s', "[*] [#{pool['name']}] clone updated from #{pool['clone_target']} to #{clone_target}")
|
920
929
|
mutex.synchronize do
|
921
930
|
pool['clone_target'] = clone_target
|
@@ -930,9 +939,11 @@ module Vmpooler
|
|
930
939
|
total = $redis.scard("vmpooler__pending__#{pool['name']}") + ready
|
931
940
|
return if total.nil?
|
932
941
|
return if total == 0
|
942
|
+
|
933
943
|
mutex = pool_mutex(pool['name'])
|
934
944
|
return if mutex.locked?
|
935
945
|
return unless ready > pool['size']
|
946
|
+
|
936
947
|
mutex.synchronize do
|
937
948
|
difference = ready - pool['size']
|
938
949
|
difference.times do
|
@@ -950,10 +961,13 @@ module Vmpooler
|
|
950
961
|
def update_pool_size(pool)
|
951
962
|
mutex = pool_mutex(pool['name'])
|
952
963
|
return if mutex.locked?
|
964
|
+
|
953
965
|
poolsize = $redis.hget('vmpooler__config__poolsize', pool['name'])
|
954
966
|
return if poolsize.nil?
|
967
|
+
|
955
968
|
poolsize = Integer(poolsize)
|
956
969
|
return if poolsize == pool['size']
|
970
|
+
|
957
971
|
mutex.synchronize do
|
958
972
|
pool['size'] = poolsize
|
959
973
|
end
|
@@ -962,6 +976,7 @@ module Vmpooler
|
|
962
976
|
def reset_pool(pool)
|
963
977
|
poolname = pool['name']
|
964
978
|
return unless $redis.sismember('vmpooler__poolreset', poolname)
|
979
|
+
|
965
980
|
$redis.srem('vmpooler__poolreset', poolname)
|
966
981
|
mutex = pool_mutex(poolname)
|
967
982
|
mutex.synchronize do
|
@@ -992,9 +1007,9 @@ module Vmpooler
|
|
992
1007
|
inventory[vm['name']] = 1
|
993
1008
|
end
|
994
1009
|
end
|
995
|
-
rescue =>
|
996
|
-
$logger.log('s', "[!] [#{pool['name']}] _check_pool failed with an error while running create_inventory: #{
|
997
|
-
raise(
|
1010
|
+
rescue StandardError => e
|
1011
|
+
$logger.log('s', "[!] [#{pool['name']}] _check_pool failed with an error while running create_inventory: #{e}")
|
1012
|
+
raise(e)
|
998
1013
|
end
|
999
1014
|
inventory
|
1000
1015
|
end
|
@@ -1006,8 +1021,8 @@ module Vmpooler
|
|
1006
1021
|
vm_lifetime = $redis.hget('vmpooler__vm__' + vm, 'lifetime') || $config[:config]['vm_lifetime'] || 12
|
1007
1022
|
pool_check_response[:checked_running_vms] += 1
|
1008
1023
|
check_running_vm(vm, pool_name, vm_lifetime, provider)
|
1009
|
-
rescue =>
|
1010
|
-
$logger.log('d', "[!] [#{pool_name}] _check_pool with an error while evaluating running VMs: #{
|
1024
|
+
rescue StandardError => e
|
1025
|
+
$logger.log('d', "[!] [#{pool_name}] _check_pool with an error while evaluating running VMs: #{e}")
|
1011
1026
|
end
|
1012
1027
|
else
|
1013
1028
|
move_vm_queue(pool_name, vm, 'running', 'completed', 'is a running VM but is missing from inventory. Marking as completed.')
|
@@ -1021,8 +1036,8 @@ module Vmpooler
|
|
1021
1036
|
begin
|
1022
1037
|
pool_check_response[:checked_ready_vms] += 1
|
1023
1038
|
check_ready_vm(vm, pool_name, pool_ttl || 0, provider)
|
1024
|
-
rescue =>
|
1025
|
-
$logger.log('d', "[!] [#{pool_name}] _check_pool failed with an error while evaluating ready VMs: #{
|
1039
|
+
rescue StandardError => e
|
1040
|
+
$logger.log('d', "[!] [#{pool_name}] _check_pool failed with an error while evaluating ready VMs: #{e}")
|
1026
1041
|
end
|
1027
1042
|
else
|
1028
1043
|
move_vm_queue(pool_name, vm, 'ready', 'completed', 'is a ready VM but is missing from inventory. Marking as completed.')
|
@@ -1037,8 +1052,8 @@ module Vmpooler
|
|
1037
1052
|
begin
|
1038
1053
|
pool_check_response[:checked_pending_vms] += 1
|
1039
1054
|
check_pending_vm(vm, pool_name, pool_timeout, provider)
|
1040
|
-
rescue =>
|
1041
|
-
$logger.log('d', "[!] [#{pool_name}] _check_pool failed with an error while evaluating pending VMs: #{
|
1055
|
+
rescue StandardError => e
|
1056
|
+
$logger.log('d', "[!] [#{pool_name}] _check_pool failed with an error while evaluating pending VMs: #{e}")
|
1042
1057
|
end
|
1043
1058
|
else
|
1044
1059
|
fail_pending_vm(vm, pool_name, pool_timeout, false)
|
@@ -1052,11 +1067,11 @@ module Vmpooler
|
|
1052
1067
|
begin
|
1053
1068
|
pool_check_response[:destroyed_vms] += 1
|
1054
1069
|
destroy_vm(vm, pool_name, provider)
|
1055
|
-
rescue =>
|
1070
|
+
rescue StandardError => e
|
1056
1071
|
$redis.srem("vmpooler__completed__#{pool_name}", vm)
|
1057
1072
|
$redis.hdel("vmpooler__active__#{pool_name}", vm)
|
1058
1073
|
$redis.del("vmpooler__vm__#{vm}")
|
1059
|
-
$logger.log('d', "[!] [#{pool_name}] _check_pool failed with an error while evaluating completed VMs: #{
|
1074
|
+
$logger.log('d', "[!] [#{pool_name}] _check_pool failed with an error while evaluating completed VMs: #{e}")
|
1060
1075
|
end
|
1061
1076
|
else
|
1062
1077
|
$logger.log('s', "[!] [#{pool_name}] '#{vm}' not found in inventory, removed from 'completed' queue")
|
@@ -1068,22 +1083,18 @@ module Vmpooler
|
|
1068
1083
|
end
|
1069
1084
|
|
1070
1085
|
def check_discovered_pool_vms(pool_name)
|
1071
|
-
|
1072
|
-
|
1073
|
-
|
1074
|
-
|
1075
|
-
|
1076
|
-
$redis.srem("vmpooler__discovered__#{pool_name}", vm)
|
1077
|
-
end
|
1078
|
-
end
|
1079
|
-
|
1080
|
-
if $redis.sismember("vmpooler__discovered__#{pool_name}", vm)
|
1081
|
-
$redis.smove("vmpooler__discovered__#{pool_name}", "vmpooler__completed__#{pool_name}", vm)
|
1086
|
+
$redis.smembers("vmpooler__discovered__#{pool_name}").reverse.each do |vm|
|
1087
|
+
%w[pending ready running completed].each do |queue|
|
1088
|
+
if $redis.sismember("vmpooler__#{queue}__#{pool_name}", vm)
|
1089
|
+
$logger.log('d', "[!] [#{pool_name}] '#{vm}' found in '#{queue}', removed from 'discovered' queue")
|
1090
|
+
$redis.srem("vmpooler__discovered__#{pool_name}", vm)
|
1082
1091
|
end
|
1083
1092
|
end
|
1084
|
-
|
1085
|
-
$
|
1093
|
+
|
1094
|
+
$redis.smove("vmpooler__discovered__#{pool_name}", "vmpooler__completed__#{pool_name}", vm) if $redis.sismember("vmpooler__discovered__#{pool_name}", vm)
|
1086
1095
|
end
|
1096
|
+
rescue StandardError => e
|
1097
|
+
$logger.log('d', "[!] [#{pool_name}] _check_pool failed with an error while evaluating discovered VMs: #{e}")
|
1087
1098
|
end
|
1088
1099
|
|
1089
1100
|
def check_migrating_pool_vms(pool_name, provider, pool_check_response, inventory)
|
@@ -1092,8 +1103,8 @@ module Vmpooler
|
|
1092
1103
|
begin
|
1093
1104
|
pool_check_response[:migrated_vms] += 1
|
1094
1105
|
migrate_vm(vm, pool_name, provider)
|
1095
|
-
rescue =>
|
1096
|
-
$logger.log('s', "[x] [#{pool_name}] '#{vm}' failed to migrate: #{
|
1106
|
+
rescue StandardError => e
|
1107
|
+
$logger.log('s', "[x] [#{pool_name}] '#{vm}' failed to migrate: #{e}")
|
1097
1108
|
end
|
1098
1109
|
end
|
1099
1110
|
end
|
@@ -1101,6 +1112,7 @@ module Vmpooler
|
|
1101
1112
|
|
1102
1113
|
def repopulate_pool_vms(pool_name, provider, pool_check_response, pool_size)
|
1103
1114
|
return if pool_mutex(pool_name).locked?
|
1115
|
+
|
1104
1116
|
ready = $redis.scard("vmpooler__ready__#{pool_name}")
|
1105
1117
|
total = $redis.scard("vmpooler__pending__#{pool_name}") + ready
|
1106
1118
|
|
@@ -1108,8 +1120,8 @@ module Vmpooler
|
|
1108
1120
|
$metrics.gauge("running.#{pool_name}", $redis.scard("vmpooler__running__#{pool_name}"))
|
1109
1121
|
|
1110
1122
|
if $redis.get("vmpooler__empty__#{pool_name}")
|
1111
|
-
$redis.del("vmpooler__empty__#{pool_name}") unless ready
|
1112
|
-
elsif ready
|
1123
|
+
$redis.del("vmpooler__empty__#{pool_name}") unless ready == 0
|
1124
|
+
elsif ready == 0
|
1113
1125
|
$redis.set("vmpooler__empty__#{pool_name}", 'true')
|
1114
1126
|
$logger.log('s', "[!] [#{pool_name}] is empty")
|
1115
1127
|
end
|
@@ -1120,8 +1132,8 @@ module Vmpooler
|
|
1120
1132
|
$redis.incr('vmpooler__tasks__clone')
|
1121
1133
|
pool_check_response[:cloned_vms] += 1
|
1122
1134
|
clone_vm(pool_name, provider)
|
1123
|
-
rescue =>
|
1124
|
-
$logger.log('s', "[!] [#{pool_name}] clone failed during check_pool with an error: #{
|
1135
|
+
rescue StandardError => e
|
1136
|
+
$logger.log('s', "[!] [#{pool_name}] clone failed during check_pool with an error: #{e}")
|
1125
1137
|
$redis.decr('vmpooler__tasks__clone')
|
1126
1138
|
raise
|
1127
1139
|
end
|
@@ -1142,7 +1154,7 @@ module Vmpooler
|
|
1142
1154
|
|
1143
1155
|
begin
|
1144
1156
|
inventory = create_inventory(pool, provider, pool_check_response)
|
1145
|
-
rescue
|
1157
|
+
rescue StandardError
|
1146
1158
|
return(pool_check_response)
|
1147
1159
|
end
|
1148
1160
|
|
@@ -1195,6 +1207,7 @@ module Vmpooler
|
|
1195
1207
|
provider_klass = Vmpooler::PoolManager::Provider
|
1196
1208
|
provider_klass.constants.each do |classname|
|
1197
1209
|
next unless classname.to_s.casecmp(provider_class) == 0
|
1210
|
+
|
1198
1211
|
return provider_klass.const_get(classname).new(config, logger, metrics, provider_name, options)
|
1199
1212
|
end
|
1200
1213
|
raise("Provider '#{provider_class}' is unknown for pool with provider name '#{provider_name}'") if provider.nil?
|
@@ -1257,8 +1270,8 @@ module Vmpooler
|
|
1257
1270
|
end
|
1258
1271
|
begin
|
1259
1272
|
$providers[provider_name] = create_provider_object($config, $logger, $metrics, provider_class, provider_name, {}) if $providers[provider_name].nil?
|
1260
|
-
rescue =>
|
1261
|
-
$logger.log('s', "Error while creating provider for pool #{pool['name']}: #{
|
1273
|
+
rescue StandardError => e
|
1274
|
+
$logger.log('s', "Error while creating provider for pool #{pool['name']}: #{e}")
|
1262
1275
|
raise
|
1263
1276
|
end
|
1264
1277
|
end
|
@@ -1292,11 +1305,15 @@ module Vmpooler
|
|
1292
1305
|
|
1293
1306
|
sleep(loop_delay)
|
1294
1307
|
|
1295
|
-
unless maxloop
|
1308
|
+
unless maxloop == 0
|
1296
1309
|
break if loop_count >= maxloop
|
1310
|
+
|
1297
1311
|
loop_count += 1
|
1298
1312
|
end
|
1299
1313
|
end
|
1314
|
+
rescue Redis::CannotConnectError => e
|
1315
|
+
$logger.log('s', "Cannot connect to the redis server: #{e}")
|
1316
|
+
raise
|
1300
1317
|
end
|
1301
1318
|
end
|
1302
1319
|
end
|