vmpooler 3.2.0 → 3.4.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/api/helpers.rb +1 -13
- data/lib/vmpooler/api/v3.rb +3 -3
- data/lib/vmpooler/pool_manager.rb +38 -43
- data/lib/vmpooler/version.rb +1 -1
- data/lib/vmpooler.rb +15 -3
- metadata +8 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 928e0c76962d0ebbc7c3944ab16a0c03597f26e49b8132f4243110eae3794102
|
4
|
+
data.tar.gz: 89d63548f801b69578ad0c05333839e705efc848f97594af5e24e05ecff49f99
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ffc00f6b5d6f034aff3be29d48e14087a7e19202bf25c14a434f428848d9386dcca4a12a3add327b33843c36761adefe462ffa5f3017328eaca7bf4adfa2f6ab
|
7
|
+
data.tar.gz: 3d30c947ec9a3ce254435b4131bc7bf949740bf61aa30f297f35410a0297f3740e2fb8d5c2deb88bfaf4e6a662823afb66f51fa44e8547f54d76c72af34e48e7
|
data/lib/vmpooler/api/helpers.rb
CHANGED
@@ -25,7 +25,7 @@ module Vmpooler
|
|
25
25
|
def validate_token(backend)
|
26
26
|
tracer.in_span("Vmpooler::API::Helpers.#{__method__}") do
|
27
27
|
if valid_token?(backend)
|
28
|
-
backend.hset("vmpooler__token__#{request.env['HTTP_X_AUTH_TOKEN']}", 'last', Time.now)
|
28
|
+
backend.hset("vmpooler__token__#{request.env['HTTP_X_AUTH_TOKEN']}", 'last', Time.now.to_s)
|
29
29
|
|
30
30
|
return true
|
31
31
|
end
|
@@ -551,18 +551,6 @@ module Vmpooler
|
|
551
551
|
end
|
552
552
|
end
|
553
553
|
end
|
554
|
-
|
555
|
-
def vm_ready?(vm_name, domain = nil)
|
556
|
-
tracer.in_span("Vmpooler::API::Helpers.#{__method__}") do
|
557
|
-
begin
|
558
|
-
open_socket(vm_name, domain)
|
559
|
-
rescue StandardError => _e
|
560
|
-
return false
|
561
|
-
end
|
562
|
-
|
563
|
-
true
|
564
|
-
end
|
565
|
-
end
|
566
554
|
end
|
567
555
|
end
|
568
556
|
end
|
data/lib/vmpooler/api/v3.rb
CHANGED
@@ -189,8 +189,8 @@ module Vmpooler
|
|
189
189
|
span.set_attribute('enduser.id', user)
|
190
190
|
has_token_result = has_token?
|
191
191
|
backend.sadd("vmpooler__migrating__#{template}", vm)
|
192
|
-
backend.hset("vmpooler__active__#{template}", vm, Time.now)
|
193
|
-
backend.hset("vmpooler__vm__#{vm}", 'checkout', Time.now)
|
192
|
+
backend.hset("vmpooler__active__#{template}", vm, Time.now.to_s)
|
193
|
+
backend.hset("vmpooler__vm__#{vm}", 'checkout', Time.now.to_s)
|
194
194
|
|
195
195
|
if Vmpooler::API.settings.config[:auth] and has_token_result
|
196
196
|
backend.hset("vmpooler__vm__#{vm}", 'token:token', request.env['HTTP_X_AUTH_TOKEN'])
|
@@ -971,7 +971,7 @@ module Vmpooler
|
|
971
971
|
result['token'] = o[rand(25)] + (0...31).map { o[rand(o.length)] }.join
|
972
972
|
|
973
973
|
backend.hset("vmpooler__token__#{result['token']}", 'user', @auth.username)
|
974
|
-
backend.hset("vmpooler__token__#{result['token']}", 'created', Time.now)
|
974
|
+
backend.hset("vmpooler__token__#{result['token']}", 'created', Time.now.to_s)
|
975
975
|
span = OpenTelemetry::Trace.current_span
|
976
976
|
span.set_attribute('enduser.id', @auth.username)
|
977
977
|
|
@@ -59,7 +59,7 @@ module Vmpooler
|
|
59
59
|
currently_configured_pools = []
|
60
60
|
config[:pools].each do |pool|
|
61
61
|
currently_configured_pools << pool['name']
|
62
|
-
redis.sadd('vmpooler__pools', pool['name'])
|
62
|
+
redis.sadd('vmpooler__pools', pool['name'].to_s)
|
63
63
|
pool_keys = pool.keys
|
64
64
|
pool_keys.delete('alias')
|
65
65
|
to_set = {}
|
@@ -68,11 +68,12 @@ module Vmpooler
|
|
68
68
|
end
|
69
69
|
to_set['alias'] = pool['alias'].join(',') if to_set.key?('alias')
|
70
70
|
to_set['domain'] = Vmpooler::Dns.get_domain_for_pool(config, pool['name'])
|
71
|
-
|
71
|
+
|
72
|
+
redis.hmset("vmpooler__pool__#{pool['name']}", *to_set.to_a.flatten) unless to_set.empty?
|
72
73
|
end
|
73
74
|
previously_configured_pools.each do |pool|
|
74
75
|
unless currently_configured_pools.include? pool
|
75
|
-
redis.srem('vmpooler__pools', pool)
|
76
|
+
redis.srem('vmpooler__pools', pool.to_s)
|
76
77
|
redis.del("vmpooler__pool__#{pool}")
|
77
78
|
end
|
78
79
|
end
|
@@ -102,7 +103,7 @@ module Vmpooler
|
|
102
103
|
mutex.synchronize do
|
103
104
|
@redis.with_metrics do |redis|
|
104
105
|
request_id = redis.hget("vmpooler__vm__#{vm}", 'request_id')
|
105
|
-
if provider.vm_ready?(pool, vm)
|
106
|
+
if provider.vm_ready?(pool, vm, redis)
|
106
107
|
move_pending_vm_to_ready(vm, pool, redis, request_id)
|
107
108
|
else
|
108
109
|
fail_pending_vm(vm, pool, timeout, redis)
|
@@ -129,7 +130,7 @@ module Vmpooler
|
|
129
130
|
if exists
|
130
131
|
request_id = redis.hget("vmpooler__vm__#{vm}", 'request_id')
|
131
132
|
pool_alias = redis.hget("vmpooler__vm__#{vm}", 'pool_alias') if request_id
|
132
|
-
redis.
|
133
|
+
open_socket_error = redis.hget("vmpooler__vm__#{vm}", 'open_socket_error')
|
133
134
|
redis.smove("vmpooler__pending__#{pool}", "vmpooler__completed__#{pool}", vm)
|
134
135
|
if request_id
|
135
136
|
ondemandrequest_hash = redis.hgetall("vmpooler__odrequest__#{request_id}")
|
@@ -138,9 +139,8 @@ module Vmpooler
|
|
138
139
|
redis.zadd('vmpooler__odcreate__task', 1, "#{pool_alias}:#{pool}:1:#{request_id}")
|
139
140
|
end
|
140
141
|
end
|
141
|
-
redis.exec
|
142
142
|
$metrics.increment("errors.markedasfailed.#{pool}")
|
143
|
-
$logger.log('d', "[!] [#{pool}] '#{vm}' marked as 'failed' after #{timeout} minutes")
|
143
|
+
$logger.log('d', "[!] [#{pool}] '#{vm}' marked as 'failed' after #{timeout} minutes with error: #{open_socket_error}")
|
144
144
|
else
|
145
145
|
remove_nonexistent_vm(vm, pool, redis)
|
146
146
|
end
|
@@ -168,8 +168,8 @@ module Vmpooler
|
|
168
168
|
pool_alias = redis.hget("vmpooler__vm__#{vm}", 'pool_alias')
|
169
169
|
|
170
170
|
redis.pipelined do |pipeline|
|
171
|
-
pipeline.hset("vmpooler__active__#{pool}", vm, Time.now)
|
172
|
-
pipeline.hset("vmpooler__vm__#{vm}", 'checkout', Time.now)
|
171
|
+
pipeline.hset("vmpooler__active__#{pool}", vm, Time.now.to_s)
|
172
|
+
pipeline.hset("vmpooler__vm__#{vm}", 'checkout', Time.now.to_s)
|
173
173
|
if ondemandrequest_hash['token:token']
|
174
174
|
pipeline.hset("vmpooler__vm__#{vm}", 'token:token', ondemandrequest_hash['token:token'])
|
175
175
|
pipeline.hset("vmpooler__vm__#{vm}", 'token:user', ondemandrequest_hash['token:user'])
|
@@ -185,10 +185,10 @@ module Vmpooler
|
|
185
185
|
|
186
186
|
redis.pipelined do |pipeline|
|
187
187
|
pipeline.hset("vmpooler__boot__#{Date.today}", "#{pool}:#{vm}", finish) # maybe remove as this is never used by vmpooler itself?
|
188
|
-
pipeline.hset("vmpooler__vm__#{vm}", 'ready', Time.now)
|
188
|
+
pipeline.hset("vmpooler__vm__#{vm}", 'ready', Time.now.to_s)
|
189
189
|
|
190
190
|
# last boot time is displayed in API, and used by alarming script
|
191
|
-
pipeline.hset('vmpooler__lastboot', pool, Time.now)
|
191
|
+
pipeline.hset('vmpooler__lastboot', pool, Time.now.to_s)
|
192
192
|
end
|
193
193
|
|
194
194
|
$metrics.timing("time_to_ready_state.#{pool}", finish)
|
@@ -198,11 +198,12 @@ module Vmpooler
|
|
198
198
|
|
199
199
|
def vm_still_ready?(pool_name, vm_name, provider, redis)
|
200
200
|
# Check if the VM is still ready/available
|
201
|
-
return true if provider.vm_ready?(pool_name, vm_name)
|
201
|
+
return true if provider.vm_ready?(pool_name, vm_name, redis)
|
202
202
|
|
203
203
|
raise("VM #{vm_name} is not ready")
|
204
204
|
rescue StandardError
|
205
|
-
|
205
|
+
open_socket_error = redis.hget("vmpooler__vm__#{vm_name}", 'open_socket_error')
|
206
|
+
move_vm_queue(pool_name, vm_name, 'ready', 'completed', redis, "removed from 'ready' queue. vm unreachable with error: #{open_socket_error}")
|
206
207
|
end
|
207
208
|
|
208
209
|
def check_ready_vm(vm, pool_name, ttl, provider)
|
@@ -227,7 +228,7 @@ module Vmpooler
|
|
227
228
|
last_checked_too_soon = ((Time.now - Time.parse(check_stamp)).to_i < $config[:config]['vm_checktime'] * 60) if check_stamp
|
228
229
|
break if check_stamp && last_checked_too_soon
|
229
230
|
|
230
|
-
redis.hset("vmpooler__vm__#{vm}", 'check', Time.now)
|
231
|
+
redis.hset("vmpooler__vm__#{vm}", 'check', Time.now.to_s)
|
231
232
|
# Check if the hosts TTL has expired
|
232
233
|
# if 'boottime' is nil, set bootime to beginning of unix epoch, forces TTL to be assumed expired
|
233
234
|
boottime = redis.hget("vmpooler__vm__#{vm}", 'ready')
|
@@ -319,7 +320,7 @@ module Vmpooler
|
|
319
320
|
redis.hset("vmpooler__vm__#{vm}", 'user_tagged', 'true') if success
|
320
321
|
end
|
321
322
|
|
322
|
-
throw :stop_checking if provider.vm_ready?(pool, vm)
|
323
|
+
throw :stop_checking if provider.vm_ready?(pool, vm, redis)
|
323
324
|
|
324
325
|
throw :stop_checking if provider.get_vm(pool, vm)
|
325
326
|
|
@@ -428,16 +429,15 @@ module Vmpooler
|
|
428
429
|
mutex = vm_mutex(new_vmname)
|
429
430
|
mutex.synchronize do
|
430
431
|
@redis.with_metrics do |redis|
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
|
435
|
-
|
436
|
-
|
437
|
-
|
438
|
-
|
439
|
-
|
440
|
-
redis.exec
|
432
|
+
redis.multi do |transaction|
|
433
|
+
transaction.sadd("vmpooler__pending__#{pool_name}", new_vmname)
|
434
|
+
transaction.hset("vmpooler__vm__#{new_vmname}", 'clone', Time.now.to_s)
|
435
|
+
transaction.hset("vmpooler__vm__#{new_vmname}", 'template', pool_name) # This value is used to represent the pool.
|
436
|
+
transaction.hset("vmpooler__vm__#{new_vmname}", 'pool', pool_name)
|
437
|
+
transaction.hset("vmpooler__vm__#{new_vmname}", 'domain', pool_domain)
|
438
|
+
transaction.hset("vmpooler__vm__#{new_vmname}", 'request_id', request_id) if request_id
|
439
|
+
transaction.hset("vmpooler__vm__#{new_vmname}", 'pool_alias', pool_alias) if pool_alias
|
440
|
+
end
|
441
441
|
end
|
442
442
|
|
443
443
|
begin
|
@@ -502,7 +502,7 @@ module Vmpooler
|
|
502
502
|
@redis.with_metrics do |redis|
|
503
503
|
redis.pipelined do |pipeline|
|
504
504
|
pipeline.hdel("vmpooler__active__#{pool}", vm)
|
505
|
-
pipeline.hset("vmpooler__vm__#{vm}", 'destroy', Time.now)
|
505
|
+
pipeline.hset("vmpooler__vm__#{vm}", 'destroy', Time.now.to_s)
|
506
506
|
|
507
507
|
# Auto-expire metadata key
|
508
508
|
pipeline.expire("vmpooler__vm__#{vm}", ($config[:redis]['data_ttl'].to_i * 60 * 60))
|
@@ -868,12 +868,13 @@ module Vmpooler
|
|
868
868
|
def sleep_with_wakeup_events(loop_delay, wakeup_period = 5, options = {})
|
869
869
|
exit_by = Time.now + loop_delay
|
870
870
|
wakeup_by = Time.now + wakeup_period
|
871
|
+
|
871
872
|
return if time_passed?(:exit_by, exit_by)
|
872
873
|
|
873
874
|
@redis.with_metrics do |redis|
|
874
875
|
initial_ready_size = redis.scard("vmpooler__ready__#{options[:poolname]}") if options[:pool_size_change]
|
875
876
|
|
876
|
-
initial_clone_target = redis.hget("vmpooler__pool__#{options[:poolname]}", options[:clone_target]) if options[:clone_target_change]
|
877
|
+
initial_clone_target = redis.hget("vmpooler__pool__#{options[:poolname]}", options[:clone_target].to_s) if options[:clone_target_change]
|
877
878
|
|
878
879
|
initial_template = redis.hget('vmpooler__template__prepared', options[:poolname]) if options[:pool_template_change]
|
879
880
|
|
@@ -917,11 +918,10 @@ module Vmpooler
|
|
917
918
|
end
|
918
919
|
|
919
920
|
if options[:ondemand_request]
|
920
|
-
redis.
|
921
|
-
redis.zcard('
|
922
|
-
redis.zcard('
|
923
|
-
|
924
|
-
od_request, od_processing, od_createtask = redis.exec
|
921
|
+
od_request = redis.zcard('vmpooler__provisioning__request')
|
922
|
+
od_processing = redis.zcard('vmpooler__provisioning__processing')
|
923
|
+
od_createtask = redis.zcard('vmpooler__odcreate__task')
|
924
|
+
|
925
925
|
break unless od_request == 0
|
926
926
|
break unless od_processing == 0
|
927
927
|
break unless od_createtask == 0
|
@@ -1093,10 +1093,8 @@ module Vmpooler
|
|
1093
1093
|
|
1094
1094
|
def remove_excess_vms(pool)
|
1095
1095
|
@redis.with_metrics do |redis|
|
1096
|
-
redis.
|
1097
|
-
redis.scard("
|
1098
|
-
redis.scard("vmpooler__pending__#{pool['name']}")
|
1099
|
-
ready, pending = redis.exec
|
1096
|
+
ready = redis.scard("vmpooler__ready__#{pool['name']}")
|
1097
|
+
pending = redis.scard("vmpooler__pending__#{pool['name']}")
|
1100
1098
|
total = pending.to_i + ready.to_i
|
1101
1099
|
break if total.nil?
|
1102
1100
|
break if total == 0
|
@@ -1334,11 +1332,10 @@ module Vmpooler
|
|
1334
1332
|
return if pool_mutex(pool_name).locked?
|
1335
1333
|
|
1336
1334
|
@redis.with_metrics do |redis|
|
1337
|
-
redis.
|
1338
|
-
redis.scard("
|
1339
|
-
redis.scard("
|
1340
|
-
|
1341
|
-
ready, pending, running = redis.exec
|
1335
|
+
ready = redis.scard("vmpooler__ready__#{pool_name}")
|
1336
|
+
pending = redis.scard("vmpooler__pending__#{pool_name}")
|
1337
|
+
running = redis.scard("vmpooler__running__#{pool_name}")
|
1338
|
+
|
1342
1339
|
total = pending.to_i + ready.to_i
|
1343
1340
|
|
1344
1341
|
$metrics.gauge("ready.#{pool_name}", ready)
|
@@ -1596,11 +1593,9 @@ module Vmpooler
|
|
1596
1593
|
|
1597
1594
|
return unless vms_ready?(request_id, redis)
|
1598
1595
|
|
1599
|
-
redis.multi
|
1600
1596
|
redis.hset(ondemand_hash_key, 'status', 'ready')
|
1601
1597
|
redis.expire(ondemand_hash_key, default_expiration)
|
1602
1598
|
redis.zrem(processing_key, request_id)
|
1603
|
-
redis.exec
|
1604
1599
|
end
|
1605
1600
|
|
1606
1601
|
def request_expired?(request_id, score, redis)
|
data/lib/vmpooler/version.rb
CHANGED
data/lib/vmpooler.rb
CHANGED
@@ -103,7 +103,7 @@ module Vmpooler
|
|
103
103
|
parsed_config[:redis]['data_ttl'] = string_to_int(ENV['REDIS_DATA_TTL']) || parsed_config[:redis]['data_ttl'] || 168
|
104
104
|
parsed_config[:redis]['connection_pool_size'] = string_to_int(ENV['REDIS_CONNECTION_POOL_SIZE']) || parsed_config[:redis]['connection_pool_size'] || 10
|
105
105
|
parsed_config[:redis]['connection_pool_timeout'] = string_to_int(ENV['REDIS_CONNECTION_POOL_TIMEOUT']) || parsed_config[:redis]['connection_pool_timeout'] || 5
|
106
|
-
parsed_config[:redis]['reconnect_attempts'] =
|
106
|
+
parsed_config[:redis]['reconnect_attempts'] = string_array_to_array(ENV['REDIS_RECONNECT_ATTEMPTS']) || parsed_config[:redis]['reconnect_attempts'] || 10
|
107
107
|
|
108
108
|
parsed_config[:statsd] = parsed_config[:statsd] || {} if ENV['STATSD_SERVER']
|
109
109
|
parsed_config[:statsd]['server'] = ENV['STATSD_SERVER'] if ENV['STATSD_SERVER']
|
@@ -209,8 +209,13 @@ module Vmpooler
|
|
209
209
|
end
|
210
210
|
|
211
211
|
def self.new_redis(host = 'localhost', port = nil, password = nil, redis_reconnect_attempts = 10)
|
212
|
-
Redis.new(
|
213
|
-
|
212
|
+
Redis.new(
|
213
|
+
host: host,
|
214
|
+
port: port,
|
215
|
+
password: password,
|
216
|
+
reconnect_attempts: redis_reconnect_attempts,
|
217
|
+
connect_timeout: 300
|
218
|
+
)
|
214
219
|
end
|
215
220
|
|
216
221
|
def self.pools(conf)
|
@@ -235,6 +240,13 @@ module Vmpooler
|
|
235
240
|
Integer(s)
|
236
241
|
end
|
237
242
|
|
243
|
+
def self.string_array_to_array(s)
|
244
|
+
# Returns an array from an array like string
|
245
|
+
return if s.nil?
|
246
|
+
|
247
|
+
JSON.parse(s)
|
248
|
+
end
|
249
|
+
|
238
250
|
def self.true?(obj)
|
239
251
|
obj.to_s.downcase == 'true'
|
240
252
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vmpooler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Puppet
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-08-
|
11
|
+
date: 2023-08-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
requirement: !ruby/object:Gem::Requirement
|
@@ -29,7 +29,7 @@ dependencies:
|
|
29
29
|
requirements:
|
30
30
|
- - "~>"
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
version: '2.
|
32
|
+
version: '2.4'
|
33
33
|
name: connection_pool
|
34
34
|
prerelease: false
|
35
35
|
type: :runtime
|
@@ -37,7 +37,7 @@ dependencies:
|
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '2.
|
40
|
+
version: '2.4'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
requirement: !ruby/object:Gem::Requirement
|
43
43
|
requirements:
|
@@ -263,7 +263,7 @@ dependencies:
|
|
263
263
|
requirements:
|
264
264
|
- - "~>"
|
265
265
|
- !ruby/object:Gem::Version
|
266
|
-
version: '
|
266
|
+
version: '5.0'
|
267
267
|
name: redis
|
268
268
|
prerelease: false
|
269
269
|
type: :runtime
|
@@ -271,7 +271,7 @@ dependencies:
|
|
271
271
|
requirements:
|
272
272
|
- - "~>"
|
273
273
|
- !ruby/object:Gem::Version
|
274
|
-
version: '
|
274
|
+
version: '5.0'
|
275
275
|
- !ruby/object:Gem::Dependency
|
276
276
|
requirement: !ruby/object:Gem::Requirement
|
277
277
|
requirements:
|
@@ -395,7 +395,7 @@ dependencies:
|
|
395
395
|
requirements:
|
396
396
|
- - "~>"
|
397
397
|
- !ruby/object:Gem::Version
|
398
|
-
version: 1.
|
398
|
+
version: 1.56.0
|
399
399
|
name: rubocop
|
400
400
|
prerelease: false
|
401
401
|
type: :development
|
@@ -403,7 +403,7 @@ dependencies:
|
|
403
403
|
requirements:
|
404
404
|
- - "~>"
|
405
405
|
- !ruby/object:Gem::Version
|
406
|
-
version: 1.
|
406
|
+
version: 1.56.0
|
407
407
|
- !ruby/object:Gem::Dependency
|
408
408
|
requirement: !ruby/object:Gem::Requirement
|
409
409
|
requirements:
|