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.
@@ -1,6 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Vmpooler
2
4
  class Dashboard < Sinatra::Base
3
-
4
5
  def config
5
6
  Vmpooler.config
6
7
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Vmpooler
2
4
  class DummyStatsd
3
5
  attr_reader :server, :port, :prefix
@@ -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.gauge(@metric_prefix + '.available', @available.length) unless @metrics.nil?
24
- @metrics.timing(@metric_prefix + '.waited', timespan_ms) unless @metrics.nil?
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.gauge(@metric_prefix + '.available', @available.length) unless @metrics.nil?
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.gauge(@metric_prefix + '.available', @available.length) unless @metrics.nil?
42
- @metrics.timing(@metric_prefix + '.waited', timespan_ms) unless @metrics.nil?
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.gauge(@metric_prefix + '.available', @available.length) unless @metrics.nil?
49
+ @metrics&.gauge(@metric_prefix + '.available', @available.length)
48
50
  end
49
51
  end
50
52
  end
@@ -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 => err
39
- $stderr.puts "Failure logging #{path} to graphite server [#{server}:#{port}]: #{err}"
38
+ rescue StandardError => e
39
+ warn "Failure logging #{path} to graphite server [#{server}:#{port}]: #{e}"
40
40
  end
41
41
  end
42
42
  end
@@ -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.has_key?('alias')
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
- return
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 => err
75
- $logger.log('s', "[!] [#{pool}] '#{vm}' #{timeout} #{provider} errored while checking a pending vm : #{err}")
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 => err
115
- $logger.log('d', "Fail pending VM failed with an error: #{err}")
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('%.2f', Time.now - Time.parse(clone_time)) if clone_time
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 => err
147
- $logger.log('s', "[!] [#{pool_name}] '#{vm}' failed while checking a ready vm : #{err}")
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 has_mismatched_hostname?(vm, pool_name, provider)
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 has_mismatched_hostname?(vm, pool_name, provider)
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
- return true
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 => err
219
- $logger.log('s', "[!] [#{pool}] '#{vm}' failed while checking VM with an error: #{err}")
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', "is no longer in inventory, removing from running")
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 => err
265
- $logger.log('s', "[!] [#{pool_name}] failed while cloning VM with an error: #{err}")
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(pool_name)
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
- return hostname, available
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('%.2f', Time.now - start)
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 => _err
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 _err
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 => err
341
- $logger.log('d', "[!] [#{pool}] '#{vm}' failed while destroying the VM with an error: #{err}")
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('%.2f', Time.now - start)
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}", "template")
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 { |s| s.nil? }
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 => err
412
- logger.log('d', "[!] [#{poolname}] failed while evaluating usage labels on '#{vm}' with an error: #{err}")
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
- return
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($providers[provider.to_s])
438
- rescue => err
439
- $logger.log('s', "[!] failed while purging provider #{provider.to_s} VMs and folders with an error: #{err}")
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
- return
454
+ nil
445
455
  end
446
456
 
447
457
  # Return a list of pool folders
448
- def pool_folders(provider)
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 = provider.get_target_datacenter_from_config(pool['name'])
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 |key, value|
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 => err
480
- $logger.log('d', "[!] [#{pool_name}] '#{vm}' failed while creating disk: #{err}")
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('%.2f', Time.now - start)
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 => err
516
- $logger.log('d', "[!] [#{pool_name}] '#{vm}' failed while creating snapshot: #{err}")
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('%.2f', Time.now - start)
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 => err
545
- $logger.log('d', "[!] [#{pool_name}] '#{vm}' failed while reverting snapshot: #{err}")
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('%.2f', Time.now - start)
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 ).uniq
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( vsphere dummy )
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 { |pool| pool['name'] == pool_name }
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.zero?
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 => err
631
- $logger.log('s', "[!] [disk_manager] disk creation appears to have failed: #{err}")
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.zero?
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 => err
667
- $logger.log('s', "[!] [snapshot_manager] snapshot create appears to have failed: #{err}")
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 => err
684
- $logger.log('s', "[!] [snapshot_manager] snapshot revert appears to have failed: #{err}")
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 => err
698
- $logger.log('s', "[x] [#{pool_name}] '#{vm_name}' migration failed with an error: #{err}")
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("vmpooler__config__clone_target}", options[:poolname])
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.zero?
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 => err
816
- $logger.log('s', "[!] [#{pool['name']}] Error while checking the pool: #{err}")
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 => err
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: #{err}")
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 => err
996
- $logger.log('s', "[!] [#{pool['name']}] _check_pool failed with an error while running create_inventory: #{err}")
997
- raise(err)
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 => err
1010
- $logger.log('d', "[!] [#{pool_name}] _check_pool with an error while evaluating running VMs: #{err}")
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 => err
1025
- $logger.log('d', "[!] [#{pool_name}] _check_pool failed with an error while evaluating ready VMs: #{err}")
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 => err
1041
- $logger.log('d', "[!] [#{pool_name}] _check_pool failed with an error while evaluating pending VMs: #{err}")
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 => err
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: #{err}")
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
- begin
1072
- $redis.smembers("vmpooler__discovered__#{pool_name}").reverse.each do |vm|
1073
- %w[pending ready running completed].each do |queue|
1074
- if $redis.sismember("vmpooler__#{queue}__#{pool_name}", vm)
1075
- $logger.log('d', "[!] [#{pool_name}] '#{vm}' found in '#{queue}', removed from 'discovered' queue")
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
- rescue => err
1085
- $logger.log('d', "[!] [#{pool_name}] _check_pool failed with an error while evaluating discovered VMs: #{err}")
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 => err
1096
- $logger.log('s', "[x] [#{pool_name}] '#{vm}' failed to migrate: #{err}")
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.zero?
1112
- elsif ready.zero?
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 => err
1124
- $logger.log('s', "[!] [#{pool_name}] clone failed during check_pool with an error: #{err}")
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 => err
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 => err
1261
- $logger.log('s', "Error while creating provider for pool #{pool['name']}: #{err}")
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.zero?
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