vmpooler 3.2.0 → 3.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 139eb42771d8af013676edccc6c4bcfd5c223d0a73737a5e69df72fd3e98f0d5
4
- data.tar.gz: 915daef7ed98c8a14b61bdb70b7017f2b9c744f74f51ec37f0f58d9a2e13d50a
3
+ metadata.gz: b586b8ee56526b89f47621d090f932159c46df74c6935002e8a71c18a02503fb
4
+ data.tar.gz: 51e4f7cf4dd4a5daa3130ab1bb60b08b4347196e1ba1c39f94a820d7356f2937
5
5
  SHA512:
6
- metadata.gz: dede2ad2ccb42cab99b5f2862793e8b207ed1ce559f38f1b6114aec730c71c8bf1b9cd96badc56eff3a241244e54890830b93a3a6c1d0be535129ad1f3017ef9
7
- data.tar.gz: 2330dede2160995616a2d0e1415b879c699956d3b112e12fc474dcb62408656230c3f5c14eaa6e2b1d88decce6814ce80a75df666c52c1cbec0001dcbdbb986a
6
+ metadata.gz: 39ba39f114252e74a08a6c3dbebd773cb2dda74adfc33216b7774dbf8fb83109f2a61076a3435cab54f8dc39adcdef60ee1cac44f24b3f3f441c7ceaf389e813
7
+ data.tar.gz: e295be65e92e61fad459d32d1a6171396b0599795355b99821d7bc8272ecbe19cfee78dd735c88e49653d5156afb7e529f12935d484fc2b1c479e5eed4be69e1
@@ -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
@@ -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
- redis.hmset("vmpooler__pool__#{pool['name']}", to_set.to_a.flatten) unless to_set.empty?
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
- # Add VM to Redis inventory ('pending' pool)
432
- redis.multi
433
- redis.sadd("vmpooler__pending__#{pool_name}", new_vmname)
434
- redis.hset("vmpooler__vm__#{new_vmname}", 'clone', Time.now)
435
- redis.hset("vmpooler__vm__#{new_vmname}", 'template', pool_name) # This value is used to represent the pool.
436
- redis.hset("vmpooler__vm__#{new_vmname}", 'pool', pool_name)
437
- redis.hset("vmpooler__vm__#{new_vmname}", 'domain', pool_domain)
438
- redis.hset("vmpooler__vm__#{new_vmname}", 'request_id', request_id) if request_id
439
- redis.hset("vmpooler__vm__#{new_vmname}", 'pool_alias', pool_alias) if pool_alias
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.multi
921
- redis.zcard('vmpooler__provisioning__request')
922
- redis.zcard('vmpooler__provisioning__processing')
923
- redis.zcard('vmpooler__odcreate__task')
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.multi
1097
- redis.scard("vmpooler__ready__#{pool['name']}")
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.multi
1338
- redis.scard("vmpooler__ready__#{pool_name}")
1339
- redis.scard("vmpooler__pending__#{pool_name}")
1340
- redis.scard("vmpooler__running__#{pool_name}")
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)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Vmpooler
4
- VERSION = '3.2.0'
4
+ VERSION = '3.3.0'
5
5
  end
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'] = string_to_int(ENV['REDIS_RECONNECT_ATTEMPTS']) || parsed_config[:redis]['reconnect_attempts'] || 10
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(host: host, port: port, password: password, reconnect_attempts: redis_reconnect_attempts, reconnect_delay: 1.5,
213
- reconnect_delay_max: 10.0)
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.2.0
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-10 00:00:00.000000000 Z
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.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.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: '4.1'
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: '4.1'
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.55.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.55.1
406
+ version: 1.56.0
407
407
  - !ruby/object:Gem::Dependency
408
408
  requirement: !ruby/object:Gem::Requirement
409
409
  requirements: