vmpooler 0.18.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -5,9 +5,6 @@ module Vmpooler
5
5
  class DummyStatsd < Metrics
6
6
  attr_reader :server, :port, :prefix
7
7
 
8
- def initialize(*)
9
- end
10
-
11
8
  def increment(*)
12
9
  true
13
10
  end
@@ -7,6 +7,7 @@ module Vmpooler
7
7
  class Graphite < Metrics
8
8
  attr_reader :server, :port, :prefix
9
9
 
10
+ # rubocop:disable Lint/MissingSuper
10
11
  def initialize(logger, params = {})
11
12
  raise ArgumentError, "Graphite server is required. Config: #{params.inspect}" if params['server'].nil? || params['server'].empty?
12
13
 
@@ -15,6 +16,7 @@ module Vmpooler
15
16
  @prefix = params['prefix'] || 'vmpooler'
16
17
  @logger = logger
17
18
  end
19
+ # rubocop:enable Lint/MissingSuper
18
20
 
19
21
  def increment(label)
20
22
  log label, 1
@@ -23,6 +23,7 @@ module Vmpooler
23
23
  @p_metrics = {}
24
24
  @torun = []
25
25
 
26
+ # rubocop:disable Lint/MissingSuper
26
27
  def initialize(logger, params = {})
27
28
  @prefix = params['prefix'] || 'vmpooler'
28
29
  @prometheus_prefix = params['prometheus_prefix'] || 'vmpooler'
@@ -32,6 +33,7 @@ module Vmpooler
32
33
  # Setup up prometheus registry and data structures
33
34
  @prometheus = Prometheus::Client.registry
34
35
  end
36
+ # rubocop:enable Lint/MissingSuper
35
37
 
36
38
  =begin # rubocop:disable Style/BlockComments
37
39
  The Metrics table is used to register metrics and translate/interpret the incoming metrics.
@@ -163,33 +165,33 @@ module Vmpooler
163
165
  },
164
166
  user: {
165
167
  mtype: M_COUNTER,
166
- torun: %i[manager],
167
- docstring: 'Number of pool instances this user created created',
168
- param_labels: %i[user poolname]
168
+ torun: %i[api],
169
+ docstring: 'Number of pool instances and the operation performed by a user',
170
+ param_labels: %i[user operation poolname]
169
171
  },
170
172
  usage_litmus: {
171
173
  mtype: M_COUNTER,
172
- torun: %i[manager],
173
- docstring: 'Pools by Litmus job usage',
174
- param_labels: %i[user poolname]
174
+ torun: %i[api],
175
+ docstring: 'Number of pool instances and the operation performed by Litmus jobs',
176
+ param_labels: %i[user operation poolname]
175
177
  },
176
178
  usage_jenkins_instance: {
177
179
  mtype: M_COUNTER,
178
- torun: %i[manager],
179
- docstring: 'Pools by Jenkins instance usage',
180
- param_labels: %i[jenkins_instance value_stream poolname]
180
+ torun: %i[api],
181
+ docstring: 'Number of pool instances and the operation performed by Jenkins instances',
182
+ param_labels: %i[jenkins_instance value_stream operation poolname]
181
183
  },
182
184
  usage_branch_project: {
183
185
  mtype: M_COUNTER,
184
- torun: %i[manager],
185
- docstring: 'Pools by branch/project usage',
186
- param_labels: %i[branch project poolname]
186
+ torun: %i[api],
187
+ docstring: 'Number of pool instances and the operation performed by Jenkins branch/project',
188
+ param_labels: %i[branch project operation poolname]
187
189
  },
188
190
  usage_job_component: {
189
191
  mtype: M_COUNTER,
190
- torun: %i[manager],
191
- docstring: 'Pools by job/component usage',
192
- param_labels: %i[job_name component_to_test poolname]
192
+ torun: %i[api],
193
+ docstring: 'Number of pool instances and the operation performed by Jenkins job/component',
194
+ param_labels: %i[job_name component_to_test operation poolname]
193
195
  },
194
196
  checkout: {
195
197
  mtype: M_COUNTER,
@@ -113,7 +113,7 @@ module Vmpooler
113
113
  # Similarly, request IDs are also stripped from the /ondemand path.
114
114
  path
115
115
  .gsub(%r{/vm/.+$}, '/vm')
116
- .gsub(%r{/ondemand/.+$}, '/ondemand')
116
+ .gsub(%r{/ondemandvm/.+$}, '/ondemandvm')
117
117
  .gsub(%r{/token/.+$}, '/token')
118
118
  .gsub(%r{/lib/.+$}, '/lib')
119
119
  .gsub(%r{/img/.+$}, '/img')
@@ -8,6 +8,7 @@ module Vmpooler
8
8
  class Statsd < Metrics
9
9
  attr_reader :server, :port, :prefix
10
10
 
11
+ # rubocop:disable Lint/MissingSuper
11
12
  def initialize(logger, params = {})
12
13
  raise ArgumentError, "Statsd server is required. Config: #{params.inspect}" if params['server'].nil? || params['server'].empty?
13
14
 
@@ -17,21 +18,22 @@ module Vmpooler
17
18
  @server = ::Statsd.new(host, @port)
18
19
  @logger = logger
19
20
  end
21
+ # rubocop:enable Lint/MissingSuper
20
22
 
21
23
  def increment(label)
22
- server.increment(prefix + '.' + label)
24
+ server.increment("#{prefix}.#{label}")
23
25
  rescue StandardError => e
24
26
  @logger.log('s', "[!] Failure incrementing #{prefix}.#{label} on statsd server [#{server}:#{port}]: #{e}")
25
27
  end
26
28
 
27
29
  def gauge(label, value)
28
- server.gauge(prefix + '.' + label, value)
30
+ server.gauge("#{prefix}.#{label}", value)
29
31
  rescue StandardError => e
30
32
  @logger.log('s', "[!] Failure updating gauge #{prefix}.#{label} on statsd server [#{server}:#{port}]: #{e}")
31
33
  end
32
34
 
33
35
  def timing(label, duration)
34
- server.timing(prefix + '.' + label, duration)
36
+ server.timing("#{prefix}.#{label}", duration)
35
37
  rescue StandardError => e
36
38
  @logger.log('s', "[!] Failure updating timing #{prefix}.#{label} on statsd server [#{server}:#{port}]: #{e}")
37
39
  end
@@ -108,7 +108,7 @@ module Vmpooler
108
108
  $logger.log('d', "[!] [#{pool}] '#{vm}' no longer exists. Removing from pending.")
109
109
  end
110
110
 
111
- def fail_pending_vm(vm, pool, timeout, redis, exists = true)
111
+ def fail_pending_vm(vm, pool, timeout, redis, exists: true)
112
112
  clone_stamp = redis.hget("vmpooler__vm__#{vm}", 'clone')
113
113
 
114
114
  time_since_clone = (Time.now - Time.parse(clone_stamp)) / 60
@@ -117,7 +117,7 @@ module Vmpooler
117
117
  request_id = redis.hget("vmpooler__vm__#{vm}", 'request_id')
118
118
  pool_alias = redis.hget("vmpooler__vm__#{vm}", 'pool_alias') if request_id
119
119
  redis.multi
120
- redis.smove('vmpooler__pending__' + pool, 'vmpooler__completed__' + pool, vm)
120
+ redis.smove("vmpooler__pending__#{pool}", "vmpooler__completed__#{pool}", vm)
121
121
  redis.zadd('vmpooler__odcreate__task', 1, "#{pool_alias}:#{pool}:1:#{request_id}") if request_id
122
122
  redis.exec
123
123
  $metrics.increment("errors.markedasfailed.#{pool}")
@@ -133,15 +133,16 @@ module Vmpooler
133
133
  end
134
134
 
135
135
  def move_pending_vm_to_ready(vm, pool, redis, request_id = nil)
136
- clone_time = redis.hget('vmpooler__vm__' + vm, 'clone')
136
+ clone_time = redis.hget("vmpooler__vm__#{vm}", 'clone')
137
137
  finish = format('%<time>.2f', time: Time.now - Time.parse(clone_time))
138
138
 
139
139
  if request_id
140
140
  ondemandrequest_hash = redis.hgetall("vmpooler__odrequest__#{request_id}")
141
- if ondemandrequest_hash['status'] == 'failed'
141
+ case ondemandrequest_hash['status']
142
+ when 'failed'
142
143
  move_vm_queue(pool, vm, 'pending', 'completed', redis, "moved to completed queue. '#{request_id}' could not be filled in time")
143
144
  return nil
144
- elsif ondemandrequest_hash['status'] == 'deleted'
145
+ when 'deleted'
145
146
  move_vm_queue(pool, vm, 'pending', 'completed', redis, "moved to completed queue. '#{request_id}' has been deleted")
146
147
  return nil
147
148
  end
@@ -160,11 +161,11 @@ module Vmpooler
160
161
  move_vm_queue(pool, vm, 'pending', 'running', redis)
161
162
  check_ondemand_request_ready(request_id, redis)
162
163
  else
163
- redis.smove('vmpooler__pending__' + pool, 'vmpooler__ready__' + pool, vm)
164
+ redis.smove("vmpooler__pending__#{pool}", "vmpooler__ready__#{pool}", vm)
164
165
  end
165
166
 
166
167
  redis.pipelined do
167
- redis.hset('vmpooler__boot__' + Date.today.to_s, pool + ':' + vm, finish) # maybe remove as this is never used by vmpooler itself?
168
+ redis.hset("vmpooler__boot__#{Date.today}", "#{pool}:#{vm}", finish) # maybe remove as this is never used by vmpooler itself?
168
169
  redis.hset("vmpooler__vm__#{vm}", 'ready', Time.now)
169
170
 
170
171
  # last boot time is displayed in API, and used by alarming script
@@ -203,11 +204,11 @@ module Vmpooler
203
204
 
204
205
  mutex.synchronize do
205
206
  @redis.with_metrics do |redis|
206
- check_stamp = redis.hget('vmpooler__vm__' + vm, 'check')
207
+ check_stamp = redis.hget("vmpooler__vm__#{vm}", 'check')
207
208
  last_checked_too_soon = ((Time.now - Time.parse(check_stamp)).to_i < $config[:config]['vm_checktime'] * 60) if check_stamp
208
209
  break if check_stamp && last_checked_too_soon
209
210
 
210
- redis.hset('vmpooler__vm__' + vm, 'check', Time.now)
211
+ redis.hset("vmpooler__vm__#{vm}", 'check', Time.now)
211
212
  # Check if the hosts TTL has expired
212
213
  # if 'boottime' is nil, set bootime to beginning of unix epoch, forces TTL to be assumed expired
213
214
  boottime = redis.hget("vmpooler__vm__#{vm}", 'ready')
@@ -217,7 +218,7 @@ module Vmpooler
217
218
  boottime = Time.at(0)
218
219
  end
219
220
  if (Time.now - boottime).to_i > ttl * 60
220
- redis.smove('vmpooler__ready__' + pool_name, 'vmpooler__completed__' + pool_name, vm)
221
+ redis.smove("vmpooler__ready__#{pool_name}", "vmpooler__completed__#{pool_name}", vm)
221
222
 
222
223
  $logger.log('d', "[!] [#{pool_name}] '#{vm}' reached end of TTL after #{ttl} minutes, removed from 'ready' queue")
223
224
  return nil
@@ -256,7 +257,7 @@ module Vmpooler
256
257
  return if hostname.empty?
257
258
  return if hostname == vm
258
259
 
259
- redis.smove('vmpooler__ready__' + pool_name, 'vmpooler__completed__' + pool_name, vm)
260
+ redis.smove("vmpooler__ready__#{pool_name}", "vmpooler__completed__#{pool_name}", vm)
260
261
  $logger.log('d', "[!] [#{pool_name}] '#{vm}' has mismatched hostname #{hostname}, removed from 'ready' queue")
261
262
  true
262
263
  end
@@ -280,7 +281,7 @@ module Vmpooler
280
281
  catch :stop_checking do
281
282
  @redis.with_metrics do |redis|
282
283
  # Check that VM is within defined lifetime
283
- checkouttime = redis.hget('vmpooler__active__' + pool, vm)
284
+ checkouttime = redis.hget("vmpooler__active__#{pool}", vm)
284
285
  if checkouttime
285
286
  time_since_checkout = Time.now - Time.parse(checkouttime)
286
287
  running = time_since_checkout / 60 / 60
@@ -341,7 +342,7 @@ module Vmpooler
341
342
  adjective = @name_generator.adjective(max: 14 - noun.length)
342
343
  random_name = [adjective, noun].join('-')
343
344
  hostname = $config[:config]['prefix'] + random_name
344
- available = redis.hlen('vmpooler__vm__' + hostname) == 0
345
+ available = redis.hlen("vmpooler__vm__#{hostname}") == 0
345
346
 
346
347
  [hostname, available]
347
348
  end
@@ -395,12 +396,12 @@ module Vmpooler
395
396
  @redis.with_metrics do |redis|
396
397
  # Add VM to Redis inventory ('pending' pool)
397
398
  redis.multi
398
- redis.sadd('vmpooler__pending__' + pool_name, new_vmname)
399
- redis.hset('vmpooler__vm__' + new_vmname, 'clone', Time.now)
400
- redis.hset('vmpooler__vm__' + new_vmname, 'template', pool_name) # This value is used to represent the pool.
401
- redis.hset('vmpooler__vm__' + new_vmname, 'pool', pool_name)
402
- redis.hset('vmpooler__vm__' + new_vmname, 'request_id', request_id) if request_id
403
- redis.hset('vmpooler__vm__' + new_vmname, 'pool_alias', pool_alias) if pool_alias
399
+ redis.sadd("vmpooler__pending__#{pool_name}", new_vmname)
400
+ redis.hset("vmpooler__vm__#{new_vmname}", 'clone', Time.now)
401
+ redis.hset("vmpooler__vm__#{new_vmname}", 'template', pool_name) # This value is used to represent the pool.
402
+ redis.hset("vmpooler__vm__#{new_vmname}", 'pool', pool_name)
403
+ redis.hset("vmpooler__vm__#{new_vmname}", 'request_id', request_id) if request_id
404
+ redis.hset("vmpooler__vm__#{new_vmname}", 'pool_alias', pool_alias) if pool_alias
404
405
  redis.exec
405
406
  end
406
407
 
@@ -412,8 +413,8 @@ module Vmpooler
412
413
 
413
414
  @redis.with_metrics do |redis|
414
415
  redis.pipelined do
415
- redis.hset('vmpooler__clone__' + Date.today.to_s, pool_name + ':' + new_vmname, finish)
416
- redis.hset('vmpooler__vm__' + new_vmname, 'clone_time', finish)
416
+ redis.hset("vmpooler__clone__#{Date.today}", "#{pool_name}:#{new_vmname}", finish)
417
+ redis.hset("vmpooler__vm__#{new_vmname}", 'clone_time', finish)
417
418
  end
418
419
  end
419
420
  $logger.log('s', "[+] [#{pool_name}] '#{new_vmname}' cloned in #{finish} seconds")
@@ -456,70 +457,27 @@ module Vmpooler
456
457
  mutex.synchronize do
457
458
  @redis.with_metrics do |redis|
458
459
  redis.pipelined do
459
- redis.hdel('vmpooler__active__' + pool, vm)
460
- redis.hset('vmpooler__vm__' + vm, 'destroy', Time.now)
460
+ redis.hdel("vmpooler__active__#{pool}", vm)
461
+ redis.hset("vmpooler__vm__#{vm}", 'destroy', Time.now)
461
462
 
462
463
  # Auto-expire metadata key
463
- redis.expire('vmpooler__vm__' + vm, ($config[:redis]['data_ttl'].to_i * 60 * 60))
464
+ redis.expire("vmpooler__vm__#{vm}", ($config[:redis]['data_ttl'].to_i * 60 * 60))
464
465
  end
465
466
 
466
467
  start = Time.now
467
468
 
468
469
  provider.destroy_vm(pool, vm)
469
470
 
470
- redis.srem('vmpooler__completed__' + pool, vm)
471
+ redis.srem("vmpooler__completed__#{pool}", vm)
471
472
 
472
473
  finish = format('%<time>.2f', time: Time.now - start)
473
474
  $logger.log('s', "[-] [#{pool}] '#{vm}' destroyed in #{finish} seconds")
474
475
  $metrics.timing("destroy.#{pool}", finish)
475
- get_vm_usage_labels(vm, redis)
476
476
  end
477
477
  end
478
478
  dereference_mutex(vm)
479
479
  end
480
480
 
481
- def get_vm_usage_labels(vm, redis)
482
- return unless $config[:config]['usage_stats']
483
-
484
- redis.multi
485
- redis.hget("vmpooler__vm__#{vm}", 'checkout')
486
- redis.hget("vmpooler__vm__#{vm}", 'tag:jenkins_build_url')
487
- redis.hget("vmpooler__vm__#{vm}", 'token:user')
488
- redis.hget("vmpooler__vm__#{vm}", 'template')
489
- checkout, jenkins_build_url, user, poolname = redis.exec
490
- return if checkout.nil?
491
-
492
- user ||= 'unauthenticated'
493
- user = user.gsub('.', '_')
494
- $metrics.increment("user.#{user}.#{poolname}")
495
-
496
- return unless jenkins_build_url
497
-
498
- if jenkins_build_url.include? 'litmus'
499
- # Very simple filter for Litmus jobs - just count them coming through for the moment.
500
- $metrics.increment("usage_litmus.#{user}.#{poolname}")
501
- return
502
- end
503
-
504
- url_parts = jenkins_build_url.split('/')[2..-1]
505
- jenkins_instance = url_parts[0].gsub('.', '_')
506
- value_stream_parts = url_parts[2].split('_')
507
- value_stream_parts = value_stream_parts.map { |s| s.gsub('.', '_') }
508
- value_stream = value_stream_parts.shift
509
- branch = value_stream_parts.pop
510
- project = value_stream_parts.shift
511
- job_name = value_stream_parts.join('_')
512
- build_metadata_parts = url_parts[3]
513
- component_to_test = component_to_test('RMM_COMPONENT_TO_TEST_NAME', build_metadata_parts)
514
-
515
- $metrics.increment("usage_jenkins_instance.#{jenkins_instance}.#{value_stream}.#{poolname}")
516
- $metrics.increment("usage_branch_project.#{branch}.#{project}.#{poolname}")
517
- $metrics.increment("usage_job_component.#{job_name}.#{component_to_test}.#{poolname}")
518
- rescue StandardError => e
519
- $logger.log('d', "[!] [#{poolname}] failed while evaluating usage labels on '#{vm}' with an error: #{e}")
520
- raise
521
- end
522
-
523
481
  def component_to_test(match, labels_string)
524
482
  return if labels_string.nil?
525
483
 
@@ -603,10 +561,10 @@ module Vmpooler
603
561
 
604
562
  if result
605
563
  @redis.with_metrics do |redis|
606
- rdisks = redis.hget('vmpooler__vm__' + vm_name, 'disk')
564
+ rdisks = redis.hget("vmpooler__vm__#{vm_name}", 'disk')
607
565
  disks = rdisks ? rdisks.split(':') : []
608
566
  disks.push("+#{disk_size}gb")
609
- redis.hset('vmpooler__vm__' + vm_name, 'disk', disks.join(':'))
567
+ redis.hset("vmpooler__vm__#{vm_name}", 'disk', disks.join(':'))
610
568
  end
611
569
 
612
570
  $logger.log('s', "[+] [disk_manager] '#{vm_name}' attached #{disk_size}gb disk in #{finish} seconds")
@@ -638,7 +596,7 @@ module Vmpooler
638
596
 
639
597
  if result
640
598
  @redis.with_metrics do |redis|
641
- redis.hset('vmpooler__vm__' + vm_name, 'snapshot:' + snapshot_name, Time.now.to_s)
599
+ redis.hset("vmpooler__vm__#{vm_name}", "snapshot:#{snapshot_name}", Time.now.to_s)
642
600
  end
643
601
  $logger.log('s', "[+] [snapshot_manager] '#{vm_name}' snapshot created in #{finish} seconds")
644
602
  else
@@ -697,7 +655,7 @@ module Vmpooler
697
655
 
698
656
  def get_pool_name_for_vm(vm_name, redis)
699
657
  # the 'template' is a bad name. Should really be 'poolname'
700
- redis.hget('vmpooler__vm__' + vm_name, 'template')
658
+ redis.hget("vmpooler__vm__#{vm_name}", 'template')
701
659
  end
702
660
 
703
661
  # @param pool_name [String] - the name of the pool
@@ -867,16 +825,12 @@ module Vmpooler
867
825
 
868
826
  if options[:clone_target_change]
869
827
  clone_target = redis.hget('vmpooler__config__clone_target}', options[:poolname])
870
- if clone_target
871
- break unless clone_target == initial_clone_target
872
- end
828
+ break if clone_target && clone_target != initial_clone_target
873
829
  end
874
830
 
875
831
  if options[:pool_template_change]
876
832
  configured_template = redis.hget('vmpooler__config__template', options[:poolname])
877
- if configured_template
878
- break unless initial_template == configured_template
879
- end
833
+ break if configured_template && initial_template != configured_template
880
834
  end
881
835
 
882
836
  if options[:pool_reset]
@@ -970,21 +924,17 @@ module Vmpooler
970
924
  def sync_pool_template(pool)
971
925
  @redis.with_metrics do |redis|
972
926
  pool_template = redis.hget('vmpooler__config__template', pool['name'])
973
- if pool_template
974
- pool['template'] = pool_template unless pool['template'] == pool_template
975
- end
927
+ pool['template'] = pool_template if pool_template && pool['template'] != pool_template
976
928
  end
977
929
  end
978
930
 
979
931
  def prepare_template(pool, provider, redis)
980
- if $config[:config]['create_template_delta_disks']
981
- unless redis.sismember('vmpooler__template__deltas', pool['template'])
982
- begin
983
- provider.create_template_delta_disks(pool)
984
- redis.sadd('vmpooler__template__deltas', pool['template'])
985
- rescue StandardError => e
986
- $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}")
987
- end
932
+ if $config[:config]['create_template_delta_disks'] && !redis.sismember('vmpooler__template__deltas', pool['template'])
933
+ begin
934
+ provider.create_template_delta_disks(pool)
935
+ redis.sadd('vmpooler__template__deltas', pool['template'])
936
+ rescue StandardError => e
937
+ $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}")
988
938
  end
989
939
  end
990
940
  redis.hset('vmpooler__template__prepared', pool['name'], pool['template'])
@@ -1135,15 +1085,15 @@ module Vmpooler
1135
1085
  mutex.synchronize do
1136
1086
  @redis.with_metrics do |redis|
1137
1087
  provider.vms_in_pool(pool['name']).each do |vm|
1138
- if !redis.sismember('vmpooler__running__' + pool['name'], vm['name']) &&
1139
- !redis.sismember('vmpooler__ready__' + pool['name'], vm['name']) &&
1140
- !redis.sismember('vmpooler__pending__' + pool['name'], vm['name']) &&
1141
- !redis.sismember('vmpooler__completed__' + pool['name'], vm['name']) &&
1142
- !redis.sismember('vmpooler__discovered__' + pool['name'], vm['name']) &&
1143
- !redis.sismember('vmpooler__migrating__' + pool['name'], vm['name'])
1088
+ if !redis.sismember("vmpooler__running__#{pool['name']}", vm['name']) &&
1089
+ !redis.sismember("vmpooler__ready__#{pool['name']}", vm['name']) &&
1090
+ !redis.sismember("vmpooler__pending__#{pool['name']}", vm['name']) &&
1091
+ !redis.sismember("vmpooler__completed__#{pool['name']}", vm['name']) &&
1092
+ !redis.sismember("vmpooler__discovered__#{pool['name']}", vm['name']) &&
1093
+ !redis.sismember("vmpooler__migrating__#{pool['name']}", vm['name'])
1144
1094
 
1145
1095
  pool_check_response[:discovered_vms] += 1
1146
- redis.sadd('vmpooler__discovered__' + pool['name'], vm['name'])
1096
+ redis.sadd("vmpooler__discovered__#{pool['name']}", vm['name'])
1147
1097
 
1148
1098
  $logger.log('s', "[?] [#{pool['name']}] '#{vm['name']}' added to 'discovered' queue")
1149
1099
  end
@@ -1164,7 +1114,7 @@ module Vmpooler
1164
1114
  redis.smembers("vmpooler__running__#{pool_name}").each do |vm|
1165
1115
  if inventory[vm]
1166
1116
  begin
1167
- vm_lifetime = redis.hget('vmpooler__vm__' + vm, 'lifetime') || $config[:config]['vm_lifetime'] || 12
1117
+ vm_lifetime = redis.hget("vmpooler__vm__#{vm}", 'lifetime') || $config[:config]['vm_lifetime'] || 12
1168
1118
  pool_check_response[:checked_running_vms] += 1
1169
1119
  check_running_vm(vm, pool_name, vm_lifetime, provider)
1170
1120
  rescue StandardError => e
@@ -1206,7 +1156,7 @@ module Vmpooler
1206
1156
  $logger.log('d', "[!] [#{pool_name}] _check_pool failed with an error while evaluating pending VMs: #{e}")
1207
1157
  end
1208
1158
  else
1209
- fail_pending_vm(vm, pool_name, pool_timeout, redis, false)
1159
+ fail_pending_vm(vm, pool_name, pool_timeout, redis, exists: false)
1210
1160
  end
1211
1161
  end
1212
1162
  end