vmpooler 3.1.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: 93f6de585ebbc3157c8f139ae0ab78d96881c5d66e3889d28367992367c39e03
4
- data.tar.gz: 5b9986bc485485a7fd405c873986a0a33d9eb145b393d5a86af77b3330c630ea
3
+ metadata.gz: b586b8ee56526b89f47621d090f932159c46df74c6935002e8a71c18a02503fb
4
+ data.tar.gz: 51e4f7cf4dd4a5daa3130ab1bb60b08b4347196e1ba1c39f94a820d7356f2937
5
5
  SHA512:
6
- metadata.gz: 67b5723f33d88d94d22f3327b313a36eac52021b14bf840536fcc021c60d3603c7f7c3adf581f1d20cba48fe898a0b92f183afc43f9c1c3b0fcbd143d74b1392
7
- data.tar.gz: 9e53fb5e3167fb3d904015eb8c8ddecc47acc004512fa9f0933918eaa76bc9e2bdde22559bcb4d7821c58aa150e9e2e56addc8867e8b2663c909cdd7808c4ac0
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)
@@ -1447,13 +1442,15 @@ module Vmpooler
1447
1442
  end
1448
1443
 
1449
1444
  def create_dns_object(config, logger, metrics, redis_connection_pool, dns_class, dns_name, options)
1450
- dns_klass = Vmpooler::PoolManager::Dns
1451
- dns_klass.constants.each do |classname|
1452
- next unless classname.to_s.casecmp(dns_class) == 0
1445
+ if defined?(Vmpooler::PoolManager::Dns)
1446
+ dns_klass = Vmpooler::PoolManager::Dns
1447
+ dns_klass.constants.each do |classname|
1448
+ next unless classname.to_s.casecmp(dns_class) == 0
1453
1449
 
1454
- return dns_klass.const_get(classname).new(config, logger, metrics, redis_connection_pool, dns_name, options)
1450
+ return dns_klass.const_get(classname).new(config, logger, metrics, redis_connection_pool, dns_name, options)
1451
+ end
1452
+ raise("DNS '#{dns_class}' is unknown for pool with dns name '#{dns_name}'") if dns_klass.nil?
1455
1453
  end
1456
- raise("DNS '#{dns_class}' is unknown for pool with dns name '#{dns_name}'") if dns_klass.nil?
1457
1454
  end
1458
1455
 
1459
1456
  def check_ondemand_requests(maxloop = 0,
@@ -1594,11 +1591,9 @@ module Vmpooler
1594
1591
 
1595
1592
  return unless vms_ready?(request_id, redis)
1596
1593
 
1597
- redis.multi
1598
1594
  redis.hset(ondemand_hash_key, 'status', 'ready')
1599
1595
  redis.expire(ondemand_hash_key, default_expiration)
1600
1596
  redis.zrem(processing_key, request_id)
1601
- redis.exec
1602
1597
  end
1603
1598
 
1604
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.1.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.1.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-05-01 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:
@@ -71,7 +71,7 @@ dependencies:
71
71
  requirements:
72
72
  - - '='
73
73
  - !ruby/object:Gem::Version
74
- version: 0.22.0
74
+ version: 0.23.0
75
75
  name: opentelemetry-exporter-jaeger
76
76
  prerelease: false
77
77
  type: :runtime
@@ -79,13 +79,13 @@ dependencies:
79
79
  requirements:
80
80
  - - '='
81
81
  - !ruby/object:Gem::Version
82
- version: 0.22.0
82
+ version: 0.23.0
83
83
  - !ruby/object:Gem::Dependency
84
84
  requirement: !ruby/object:Gem::Requirement
85
85
  requirements:
86
86
  - - '='
87
87
  - !ruby/object:Gem::Version
88
- version: 0.19.2
88
+ version: 0.21.1
89
89
  name: opentelemetry-instrumentation-concurrent_ruby
90
90
  prerelease: false
91
91
  type: :runtime
@@ -93,13 +93,13 @@ dependencies:
93
93
  requirements:
94
94
  - - '='
95
95
  - !ruby/object:Gem::Version
96
- version: 0.19.2
96
+ version: 0.21.1
97
97
  - !ruby/object:Gem::Dependency
98
98
  requirement: !ruby/object:Gem::Requirement
99
99
  requirements:
100
100
  - - '='
101
101
  - !ruby/object:Gem::Version
102
- version: 0.19.4
102
+ version: 0.22.2
103
103
  name: opentelemetry-instrumentation-http_client
104
104
  prerelease: false
105
105
  type: :runtime
@@ -107,13 +107,13 @@ dependencies:
107
107
  requirements:
108
108
  - - '='
109
109
  - !ruby/object:Gem::Version
110
- version: 0.19.4
110
+ version: 0.22.2
111
111
  - !ruby/object:Gem::Dependency
112
112
  requirement: !ruby/object:Gem::Requirement
113
113
  requirements:
114
114
  - - '='
115
115
  - !ruby/object:Gem::Version
116
- version: 0.21.3
116
+ version: 0.25.3
117
117
  name: opentelemetry-instrumentation-redis
118
118
  prerelease: false
119
119
  type: :runtime
@@ -121,13 +121,13 @@ dependencies:
121
121
  requirements:
122
122
  - - '='
123
123
  - !ruby/object:Gem::Version
124
- version: 0.21.3
124
+ version: 0.25.3
125
125
  - !ruby/object:Gem::Dependency
126
126
  requirement: !ruby/object:Gem::Requirement
127
127
  requirements:
128
128
  - - '='
129
129
  - !ruby/object:Gem::Version
130
- version: 0.19.3
130
+ version: 0.23.2
131
131
  name: opentelemetry-instrumentation-sinatra
132
132
  prerelease: false
133
133
  type: :runtime
@@ -135,13 +135,13 @@ dependencies:
135
135
  requirements:
136
136
  - - '='
137
137
  - !ruby/object:Gem::Version
138
- version: 0.19.3
138
+ version: 0.23.2
139
139
  - !ruby/object:Gem::Dependency
140
140
  requirement: !ruby/object:Gem::Requirement
141
141
  requirements:
142
142
  - - '='
143
143
  - !ruby/object:Gem::Version
144
- version: 0.23.0
144
+ version: 0.24.1
145
145
  name: opentelemetry-resource_detectors
146
146
  prerelease: false
147
147
  type: :runtime
@@ -149,16 +149,16 @@ dependencies:
149
149
  requirements:
150
150
  - - '='
151
151
  - !ruby/object:Gem::Version
152
- version: 0.23.0
152
+ version: 0.24.1
153
153
  - !ruby/object:Gem::Dependency
154
154
  requirement: !ruby/object:Gem::Requirement
155
155
  requirements:
156
156
  - - "~>"
157
157
  - !ruby/object:Gem::Version
158
- version: '1.0'
158
+ version: '1.3'
159
159
  - - ">="
160
160
  - !ruby/object:Gem::Version
161
- version: 1.0.2
161
+ version: 1.3.0
162
162
  name: opentelemetry-sdk
163
163
  prerelease: false
164
164
  type: :runtime
@@ -166,10 +166,10 @@ dependencies:
166
166
  requirements:
167
167
  - - "~>"
168
168
  - !ruby/object:Gem::Version
169
- version: '1.0'
169
+ version: '1.3'
170
170
  - - ">="
171
171
  - !ruby/object:Gem::Version
172
- version: 1.0.2
172
+ version: 1.3.0
173
173
  - !ruby/object:Gem::Dependency
174
174
  requirement: !ruby/object:Gem::Requirement
175
175
  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.50.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.50.1
406
+ version: 1.56.0
407
407
  - !ruby/object:Gem::Dependency
408
408
  requirement: !ruby/object:Gem::Requirement
409
409
  requirements:
@@ -518,7 +518,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
518
518
  - !ruby/object:Gem::Version
519
519
  version: '0'
520
520
  requirements: []
521
- rubygems_version: 3.3.25
521
+ rubygems_version: 3.3.26
522
522
  signing_key:
523
523
  specification_version: 4
524
524
  summary: vmpooler provides configurable pools of instantly-available (running) virtual