vmpooler 0.6.2 → 0.6.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/vmpooler/api/v1.rb +73 -0
- data/lib/vmpooler/pool_manager.rb +31 -1
- data/lib/vmpooler/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3ae2494365a5cecad598897da93f73c7ba874e17
|
4
|
+
data.tar.gz: 5a9d13f8e6e4ca78c7e0a9f3375fa5f11ada986b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4401a2f81fca41982af4b800f0be09174f1a154ab0a655d0c8386c04ac27b93e222697b317b8e06344743b05f750207c3470a93bac5976ee8489c25eab1fb45b
|
7
|
+
data.tar.gz: 8d862b2a402fb285bf5a7343db1618a9344df340b1b8abb7e6baf4e5fbe47505bff4cb6df879d6b0ac04be9caca6fd5d1fefc76b793ddc8b5069ac477343f54a
|
data/lib/vmpooler/api/v1.rb
CHANGED
@@ -194,6 +194,26 @@ module Vmpooler
|
|
194
194
|
result
|
195
195
|
end
|
196
196
|
|
197
|
+
def update_clone_target(payload)
|
198
|
+
result = { 'ok' => false }
|
199
|
+
|
200
|
+
pool_index = pool_index(pools)
|
201
|
+
pools_updated = 0
|
202
|
+
sync_clone_targets
|
203
|
+
|
204
|
+
payload.each do |poolname, clone_target|
|
205
|
+
unless pools[pool_index[poolname]]['clone_target'] == clone_target
|
206
|
+
pools[pool_index[poolname]]['clone_target'] == clone_target
|
207
|
+
backend.hset('vmpooler__config__clone_target', poolname, clone_target)
|
208
|
+
pools_updated += 1
|
209
|
+
status 201
|
210
|
+
end
|
211
|
+
end
|
212
|
+
status 200 unless pools_updated > 0
|
213
|
+
result['ok'] = true
|
214
|
+
result
|
215
|
+
end
|
216
|
+
|
197
217
|
def sync_pool_templates
|
198
218
|
pool_index = pool_index(pools)
|
199
219
|
template_configs = backend.hgetall('vmpooler__config__template')
|
@@ -222,6 +242,20 @@ module Vmpooler
|
|
222
242
|
end
|
223
243
|
end
|
224
244
|
|
245
|
+
def sync_clone_targets
|
246
|
+
pool_index = pool_index(pools)
|
247
|
+
clone_target_configs = backend.hgetall('vmpooler__config__clone_target')
|
248
|
+
unless clone_target_configs.nil?
|
249
|
+
clone_target_configs.each do |poolname, clone_target|
|
250
|
+
if pool_index.include? poolname
|
251
|
+
unless pools[pool_index[poolname]]['clone_target'] == clone_target
|
252
|
+
pools[pool_index[poolname]]['clone_target'] == clone_target
|
253
|
+
end
|
254
|
+
end
|
255
|
+
end
|
256
|
+
end
|
257
|
+
end
|
258
|
+
|
225
259
|
get '/' do
|
226
260
|
sync_pool_sizes
|
227
261
|
redirect to('/dashboard/')
|
@@ -700,6 +734,14 @@ module Vmpooler
|
|
700
734
|
invalid
|
701
735
|
end
|
702
736
|
|
737
|
+
def invalid_pool(payload)
|
738
|
+
invalid = []
|
739
|
+
payload.each do |pool, clone_target|
|
740
|
+
invalid << pool unless pool_exists?(pool)
|
741
|
+
end
|
742
|
+
invalid
|
743
|
+
end
|
744
|
+
|
703
745
|
post "#{api_prefix}/vm/:template/?" do
|
704
746
|
content_type :json
|
705
747
|
result = { 'ok' => false }
|
@@ -1011,6 +1053,37 @@ module Vmpooler
|
|
1011
1053
|
JSON.pretty_generate(result)
|
1012
1054
|
end
|
1013
1055
|
|
1056
|
+
post "#{api_prefix}/config/clonetarget/?" do
|
1057
|
+
content_type :json
|
1058
|
+
result = { 'ok' => false }
|
1059
|
+
|
1060
|
+
if config['experimental_features']
|
1061
|
+
need_token! if Vmpooler::API.settings.config[:auth]
|
1062
|
+
|
1063
|
+
payload = JSON.parse(request.body.read)
|
1064
|
+
|
1065
|
+
if payload
|
1066
|
+
invalid = invalid_pool(payload)
|
1067
|
+
if invalid.empty?
|
1068
|
+
result = update_clone_target(payload)
|
1069
|
+
else
|
1070
|
+
invalid.each do |bad_template|
|
1071
|
+
metrics.increment("config.invalid.#{bad_template}")
|
1072
|
+
end
|
1073
|
+
result[:bad_templates] = invalid
|
1074
|
+
status 400
|
1075
|
+
end
|
1076
|
+
else
|
1077
|
+
metrics.increment('config.invalid.unknown')
|
1078
|
+
status 404
|
1079
|
+
end
|
1080
|
+
else
|
1081
|
+
status 405
|
1082
|
+
end
|
1083
|
+
|
1084
|
+
JSON.pretty_generate(result)
|
1085
|
+
end
|
1086
|
+
|
1014
1087
|
get "#{api_prefix}/config/?" do
|
1015
1088
|
content_type :json
|
1016
1089
|
result = { 'ok' => false }
|
@@ -680,6 +680,10 @@ module Vmpooler
|
|
680
680
|
initial_ready_size = $redis.scard("vmpooler__ready__#{options[:poolname]}")
|
681
681
|
end
|
682
682
|
|
683
|
+
if options[:clone_target_change]
|
684
|
+
initial_clone_target = $redis.hget("vmpooler__pool__#{options[:poolname]}", options[:clone_target])
|
685
|
+
end
|
686
|
+
|
683
687
|
if options[:pool_template_change]
|
684
688
|
initial_template = $redis.hget('vmpooler__template__prepared', options[:poolname])
|
685
689
|
end
|
@@ -698,6 +702,13 @@ module Vmpooler
|
|
698
702
|
break unless ready_size == initial_ready_size
|
699
703
|
end
|
700
704
|
|
705
|
+
if options[:clone_target_change]
|
706
|
+
clone_target = $redis.hget("vmpooler__config__clone_target}", options[:poolname])
|
707
|
+
if clone_target
|
708
|
+
break unless clone_target == initial_clone_target
|
709
|
+
end
|
710
|
+
end
|
711
|
+
|
701
712
|
if options[:pool_template_change]
|
702
713
|
configured_template = $redis.hget('vmpooler__config__template', options[:poolname])
|
703
714
|
if configured_template
|
@@ -742,7 +753,7 @@ module Vmpooler
|
|
742
753
|
loop_delay = (loop_delay * loop_delay_decay).to_i
|
743
754
|
loop_delay = loop_delay_max if loop_delay > loop_delay_max
|
744
755
|
end
|
745
|
-
sleep_with_wakeup_events(loop_delay, loop_delay_min, pool_size_change: true, poolname: pool['name'], pool_template_change: true)
|
756
|
+
sleep_with_wakeup_events(loop_delay, loop_delay_min, pool_size_change: true, poolname: pool['name'], pool_template_change: true, clone_target_change: true)
|
746
757
|
|
747
758
|
unless maxloop.zero?
|
748
759
|
break if loop_count >= maxloop
|
@@ -847,6 +858,21 @@ module Vmpooler
|
|
847
858
|
$logger.log('s', "[*] [#{pool['name']}] is ready for use")
|
848
859
|
end
|
849
860
|
|
861
|
+
def update_clone_target(pool)
|
862
|
+
mutex = pool_mutex(pool['name'])
|
863
|
+
return if mutex.locked?
|
864
|
+
clone_target = $redis.hget('vmpooler__config__clone_target', pool['name'])
|
865
|
+
return if clone_target.nil?
|
866
|
+
return if clone_target == pool['clone_target']
|
867
|
+
$logger.log('s', "[*] [#{pool['name']}] clone updated from #{pool['clone_target']} to #{clone_target}")
|
868
|
+
mutex.synchronize do
|
869
|
+
pool['clone_target'] = clone_target
|
870
|
+
# Remove all ready and pending VMs so new instances are created for the new clone_target
|
871
|
+
drain_pool(pool['name'])
|
872
|
+
end
|
873
|
+
$logger.log('s', "[*] [#{pool['name']}] is ready for use")
|
874
|
+
end
|
875
|
+
|
850
876
|
def remove_excess_vms(pool)
|
851
877
|
ready = $redis.scard("vmpooler__ready__#{pool['name']}")
|
852
878
|
total = $redis.scard("vmpooler__pending__#{pool['name']}") + ready
|
@@ -1080,6 +1106,10 @@ module Vmpooler
|
|
1080
1106
|
# otherwise identify this change when running
|
1081
1107
|
update_pool_size(pool)
|
1082
1108
|
|
1109
|
+
# Check to see if a pool size change has been made via the configuration API
|
1110
|
+
# Additionally, a pool will drain ready and pending instances
|
1111
|
+
update_clone_target(pool)
|
1112
|
+
|
1083
1113
|
repopulate_pool_vms(pool['name'], provider, pool_check_response, pool['size'])
|
1084
1114
|
|
1085
1115
|
# Remove VMs in excess of the configured pool size
|
data/lib/vmpooler/version.rb
CHANGED
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: 0.6.
|
4
|
+
version: 0.6.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Puppet
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-07-
|
11
|
+
date: 2019-07-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: pickup
|