vmpooler 0.18.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/vmpooler.rb +9 -14
- data/lib/vmpooler/api/dashboard.rb +18 -20
- data/lib/vmpooler/api/helpers.rb +11 -13
- data/lib/vmpooler/api/v1.rb +93 -52
- data/lib/vmpooler/metrics/dummy_statsd.rb +0 -3
- data/lib/vmpooler/metrics/graphite.rb +2 -0
- data/lib/vmpooler/metrics/promstats.rb +17 -15
- data/lib/vmpooler/metrics/promstats/collector_middleware.rb +1 -1
- data/lib/vmpooler/metrics/statsd.rb +5 -3
- data/lib/vmpooler/pool_manager.rb +48 -98
- data/lib/vmpooler/providers/dummy.rb +20 -38
- data/lib/vmpooler/providers/vsphere.rb +18 -27
- data/lib/vmpooler/version.rb +1 -1
- metadata +38 -46
@@ -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[
|
167
|
-
docstring: 'Number of pool instances
|
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[
|
173
|
-
docstring: '
|
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[
|
179
|
-
docstring: '
|
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[
|
185
|
-
docstring: '
|
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[
|
191
|
-
docstring: '
|
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{/
|
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
|
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
|
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
|
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
|
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(
|
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(
|
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
|
-
|
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
|
-
|
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(
|
164
|
+
redis.smove("vmpooler__pending__#{pool}", "vmpooler__ready__#{pool}", vm)
|
164
165
|
end
|
165
166
|
|
166
167
|
redis.pipelined do
|
167
|
-
redis.hset(
|
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(
|
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(
|
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(
|
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(
|
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(
|
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(
|
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(
|
399
|
-
redis.hset(
|
400
|
-
redis.hset(
|
401
|
-
redis.hset(
|
402
|
-
redis.hset(
|
403
|
-
redis.hset(
|
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(
|
416
|
-
redis.hset(
|
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(
|
460
|
-
redis.hset(
|
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(
|
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(
|
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(
|
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(
|
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(
|
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(
|
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
|
-
|
982
|
-
|
983
|
-
|
984
|
-
|
985
|
-
|
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(
|
1139
|
-
!redis.sismember(
|
1140
|
-
!redis.sismember(
|
1141
|
-
!redis.sismember(
|
1142
|
-
!redis.sismember(
|
1143
|
-
!redis.sismember(
|
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(
|
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(
|
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
|