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