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 +4 -4
- data/lib/vmpooler/api/helpers.rb +1 -13
- data/lib/vmpooler/api/v3.rb +3 -3
- data/lib/vmpooler/pool_manager.rb +38 -43
- data/lib/vmpooler/version.rb +1 -1
- data/lib/vmpooler.rb +15 -3
- metadata +8 -8
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 928e0c76962d0ebbc7c3944ab16a0c03597f26e49b8132f4243110eae3794102
|
|
4
|
+
data.tar.gz: 89d63548f801b69578ad0c05333839e705efc848f97594af5e24e05ecff49f99
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: ffc00f6b5d6f034aff3be29d48e14087a7e19202bf25c14a434f428848d9386dcca4a12a3add327b33843c36761adefe462ffa5f3017328eaca7bf4adfa2f6ab
|
|
7
|
+
data.tar.gz: 3d30c947ec9a3ce254435b4131bc7bf949740bf61aa30f297f35410a0297f3740e2fb8d5c2deb88bfaf4e6a662823afb66f51fa44e8547f54d76c72af34e48e7
|
data/lib/vmpooler/api/helpers.rb
CHANGED
|
@@ -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
|
data/lib/vmpooler/api/v3.rb
CHANGED
|
@@ -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
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
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.
|
|
921
|
-
redis.zcard('
|
|
922
|
-
redis.zcard('
|
|
923
|
-
|
|
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.
|
|
1097
|
-
redis.scard("
|
|
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.
|
|
1338
|
-
redis.scard("
|
|
1339
|
-
redis.scard("
|
|
1340
|
-
|
|
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)
|
data/lib/vmpooler/version.rb
CHANGED
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'] =
|
|
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(
|
|
213
|
-
|
|
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.
|
|
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-
|
|
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.
|
|
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.
|
|
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: '
|
|
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: '
|
|
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.
|
|
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.
|
|
406
|
+
version: 1.56.0
|
|
407
407
|
- !ruby/object:Gem::Dependency
|
|
408
408
|
requirement: !ruby/object:Gem::Requirement
|
|
409
409
|
requirements:
|