vmpooler 0.10.3 → 0.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/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
|