vmpooler 3.2.0 → 3.4.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: 928e0c76962d0ebbc7c3944ab16a0c03597f26e49b8132f4243110eae3794102
4
+ data.tar.gz: 89d63548f801b69578ad0c05333839e705efc848f97594af5e24e05ecff49f99
5
5
  SHA512:
6
- metadata.gz: dede2ad2ccb42cab99b5f2862793e8b207ed1ce559f38f1b6114aec730c71c8bf1b9cd96badc56eff3a241244e54890830b93a3a6c1d0be535129ad1f3017ef9
7
- data.tar.gz: 2330dede2160995616a2d0e1415b879c699956d3b112e12fc474dcb62408656230c3f5c14eaa6e2b1d88decce6814ce80a75df666c52c1cbec0001dcbdbb986a
6
+ metadata.gz: ffc00f6b5d6f034aff3be29d48e14087a7e19202bf25c14a434f428848d9386dcca4a12a3add327b33843c36761adefe462ffa5f3017328eaca7bf4adfa2f6ab
7
+ data.tar.gz: 3d30c947ec9a3ce254435b4131bc7bf949740bf61aa30f297f35410a0297f3740e2fb8d5c2deb88bfaf4e6a662823afb66f51fa44e8547f54d76c72af34e48e7
@@ -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
@@ -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
@@ -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.multi
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
- move_vm_queue(pool_name, vm_name, 'ready', 'completed', redis, "is unreachable, removed from 'ready' queue")
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
- # 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
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.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
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.multi
1097
- redis.scard("vmpooler__ready__#{pool['name']}")
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.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
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)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Vmpooler
4
- VERSION = '3.2.0'
4
+ VERSION = '3.4.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.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-10 00:00:00.000000000 Z
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.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: