vmpooler 0.6.2 → 0.6.3
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/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
|