vmpooler 0.18.0 → 1.1.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/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
|