vmpooler 3.2.0 → 3.3.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/api/helpers.rb +1 -1
- data/lib/vmpooler/api/v3.rb +3 -3
- data/lib/vmpooler/pool_manager.rb +31 -38
- 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: b586b8ee56526b89f47621d090f932159c46df74c6935002e8a71c18a02503fb
|
4
|
+
data.tar.gz: 51e4f7cf4dd4a5daa3130ab1bb60b08b4347196e1ba1c39f94a820d7356f2937
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 39ba39f114252e74a08a6c3dbebd773cb2dda74adfc33216b7774dbf8fb83109f2a61076a3435cab54f8dc39adcdef60ee1cac44f24b3f3f441c7ceaf389e813
|
7
|
+
data.tar.gz: e295be65e92e61fad459d32d1a6171396b0599795355b99821d7bc8272ecbe19cfee78dd735c88e49653d5156afb7e529f12935d484fc2b1c479e5eed4be69e1
|
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
|
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
|
@@ -129,7 +130,6 @@ 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.multi
|
133
133
|
redis.smove("vmpooler__pending__#{pool}", "vmpooler__completed__#{pool}", vm)
|
134
134
|
if request_id
|
135
135
|
ondemandrequest_hash = redis.hgetall("vmpooler__odrequest__#{request_id}")
|
@@ -138,7 +138,6 @@ module Vmpooler
|
|
138
138
|
redis.zadd('vmpooler__odcreate__task', 1, "#{pool_alias}:#{pool}:1:#{request_id}")
|
139
139
|
end
|
140
140
|
end
|
141
|
-
redis.exec
|
142
141
|
$metrics.increment("errors.markedasfailed.#{pool}")
|
143
142
|
$logger.log('d', "[!] [#{pool}] '#{vm}' marked as 'failed' after #{timeout} minutes")
|
144
143
|
else
|
@@ -168,8 +167,8 @@ module Vmpooler
|
|
168
167
|
pool_alias = redis.hget("vmpooler__vm__#{vm}", 'pool_alias')
|
169
168
|
|
170
169
|
redis.pipelined do |pipeline|
|
171
|
-
pipeline.hset("vmpooler__active__#{pool}", vm, Time.now)
|
172
|
-
pipeline.hset("vmpooler__vm__#{vm}", 'checkout', Time.now)
|
170
|
+
pipeline.hset("vmpooler__active__#{pool}", vm, Time.now.to_s)
|
171
|
+
pipeline.hset("vmpooler__vm__#{vm}", 'checkout', Time.now.to_s)
|
173
172
|
if ondemandrequest_hash['token:token']
|
174
173
|
pipeline.hset("vmpooler__vm__#{vm}", 'token:token', ondemandrequest_hash['token:token'])
|
175
174
|
pipeline.hset("vmpooler__vm__#{vm}", 'token:user', ondemandrequest_hash['token:user'])
|
@@ -185,10 +184,10 @@ module Vmpooler
|
|
185
184
|
|
186
185
|
redis.pipelined do |pipeline|
|
187
186
|
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)
|
187
|
+
pipeline.hset("vmpooler__vm__#{vm}", 'ready', Time.now.to_s)
|
189
188
|
|
190
189
|
# last boot time is displayed in API, and used by alarming script
|
191
|
-
pipeline.hset('vmpooler__lastboot', pool, Time.now)
|
190
|
+
pipeline.hset('vmpooler__lastboot', pool, Time.now.to_s)
|
192
191
|
end
|
193
192
|
|
194
193
|
$metrics.timing("time_to_ready_state.#{pool}", finish)
|
@@ -227,7 +226,7 @@ module Vmpooler
|
|
227
226
|
last_checked_too_soon = ((Time.now - Time.parse(check_stamp)).to_i < $config[:config]['vm_checktime'] * 60) if check_stamp
|
228
227
|
break if check_stamp && last_checked_too_soon
|
229
228
|
|
230
|
-
redis.hset("vmpooler__vm__#{vm}", 'check', Time.now)
|
229
|
+
redis.hset("vmpooler__vm__#{vm}", 'check', Time.now.to_s)
|
231
230
|
# Check if the hosts TTL has expired
|
232
231
|
# if 'boottime' is nil, set bootime to beginning of unix epoch, forces TTL to be assumed expired
|
233
232
|
boottime = redis.hget("vmpooler__vm__#{vm}", 'ready')
|
@@ -428,16 +427,15 @@ module Vmpooler
|
|
428
427
|
mutex = vm_mutex(new_vmname)
|
429
428
|
mutex.synchronize do
|
430
429
|
@redis.with_metrics do |redis|
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
|
435
|
-
|
436
|
-
|
437
|
-
|
438
|
-
|
439
|
-
|
440
|
-
redis.exec
|
430
|
+
redis.multi do |transaction|
|
431
|
+
transaction.sadd("vmpooler__pending__#{pool_name}", new_vmname)
|
432
|
+
transaction.hset("vmpooler__vm__#{new_vmname}", 'clone', Time.now.to_s)
|
433
|
+
transaction.hset("vmpooler__vm__#{new_vmname}", 'template', pool_name) # This value is used to represent the pool.
|
434
|
+
transaction.hset("vmpooler__vm__#{new_vmname}", 'pool', pool_name)
|
435
|
+
transaction.hset("vmpooler__vm__#{new_vmname}", 'domain', pool_domain)
|
436
|
+
transaction.hset("vmpooler__vm__#{new_vmname}", 'request_id', request_id) if request_id
|
437
|
+
transaction.hset("vmpooler__vm__#{new_vmname}", 'pool_alias', pool_alias) if pool_alias
|
438
|
+
end
|
441
439
|
end
|
442
440
|
|
443
441
|
begin
|
@@ -502,7 +500,7 @@ module Vmpooler
|
|
502
500
|
@redis.with_metrics do |redis|
|
503
501
|
redis.pipelined do |pipeline|
|
504
502
|
pipeline.hdel("vmpooler__active__#{pool}", vm)
|
505
|
-
pipeline.hset("vmpooler__vm__#{vm}", 'destroy', Time.now)
|
503
|
+
pipeline.hset("vmpooler__vm__#{vm}", 'destroy', Time.now.to_s)
|
506
504
|
|
507
505
|
# Auto-expire metadata key
|
508
506
|
pipeline.expire("vmpooler__vm__#{vm}", ($config[:redis]['data_ttl'].to_i * 60 * 60))
|
@@ -868,12 +866,13 @@ module Vmpooler
|
|
868
866
|
def sleep_with_wakeup_events(loop_delay, wakeup_period = 5, options = {})
|
869
867
|
exit_by = Time.now + loop_delay
|
870
868
|
wakeup_by = Time.now + wakeup_period
|
869
|
+
|
871
870
|
return if time_passed?(:exit_by, exit_by)
|
872
871
|
|
873
872
|
@redis.with_metrics do |redis|
|
874
873
|
initial_ready_size = redis.scard("vmpooler__ready__#{options[:poolname]}") if options[:pool_size_change]
|
875
874
|
|
876
|
-
initial_clone_target = redis.hget("vmpooler__pool__#{options[:poolname]}", options[:clone_target]) if options[:clone_target_change]
|
875
|
+
initial_clone_target = redis.hget("vmpooler__pool__#{options[:poolname]}", options[:clone_target].to_s) if options[:clone_target_change]
|
877
876
|
|
878
877
|
initial_template = redis.hget('vmpooler__template__prepared', options[:poolname]) if options[:pool_template_change]
|
879
878
|
|
@@ -917,11 +916,10 @@ module Vmpooler
|
|
917
916
|
end
|
918
917
|
|
919
918
|
if options[:ondemand_request]
|
920
|
-
redis.
|
921
|
-
redis.zcard('
|
922
|
-
redis.zcard('
|
923
|
-
|
924
|
-
od_request, od_processing, od_createtask = redis.exec
|
919
|
+
od_request = redis.zcard('vmpooler__provisioning__request')
|
920
|
+
od_processing = redis.zcard('vmpooler__provisioning__processing')
|
921
|
+
od_createtask = redis.zcard('vmpooler__odcreate__task')
|
922
|
+
|
925
923
|
break unless od_request == 0
|
926
924
|
break unless od_processing == 0
|
927
925
|
break unless od_createtask == 0
|
@@ -1093,10 +1091,8 @@ module Vmpooler
|
|
1093
1091
|
|
1094
1092
|
def remove_excess_vms(pool)
|
1095
1093
|
@redis.with_metrics do |redis|
|
1096
|
-
redis.
|
1097
|
-
redis.scard("
|
1098
|
-
redis.scard("vmpooler__pending__#{pool['name']}")
|
1099
|
-
ready, pending = redis.exec
|
1094
|
+
ready = redis.scard("vmpooler__ready__#{pool['name']}")
|
1095
|
+
pending = redis.scard("vmpooler__pending__#{pool['name']}")
|
1100
1096
|
total = pending.to_i + ready.to_i
|
1101
1097
|
break if total.nil?
|
1102
1098
|
break if total == 0
|
@@ -1334,11 +1330,10 @@ module Vmpooler
|
|
1334
1330
|
return if pool_mutex(pool_name).locked?
|
1335
1331
|
|
1336
1332
|
@redis.with_metrics do |redis|
|
1337
|
-
redis.
|
1338
|
-
redis.scard("
|
1339
|
-
redis.scard("
|
1340
|
-
|
1341
|
-
ready, pending, running = redis.exec
|
1333
|
+
ready = redis.scard("vmpooler__ready__#{pool_name}")
|
1334
|
+
pending = redis.scard("vmpooler__pending__#{pool_name}")
|
1335
|
+
running = redis.scard("vmpooler__running__#{pool_name}")
|
1336
|
+
|
1342
1337
|
total = pending.to_i + ready.to_i
|
1343
1338
|
|
1344
1339
|
$metrics.gauge("ready.#{pool_name}", ready)
|
@@ -1596,11 +1591,9 @@ module Vmpooler
|
|
1596
1591
|
|
1597
1592
|
return unless vms_ready?(request_id, redis)
|
1598
1593
|
|
1599
|
-
redis.multi
|
1600
1594
|
redis.hset(ondemand_hash_key, 'status', 'ready')
|
1601
1595
|
redis.expire(ondemand_hash_key, default_expiration)
|
1602
1596
|
redis.zrem(processing_key, request_id)
|
1603
|
-
redis.exec
|
1604
1597
|
end
|
1605
1598
|
|
1606
1599
|
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.3.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-16 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:
|