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 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: