vmpooler 0.9.1 → 0.10.2
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 +49 -0
- data/lib/vmpooler/pool_manager.rb +23 -1
- data/lib/vmpooler/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3f8a23a9dbbb4ee9369c39b366e53966c0c4d29eb959c8b21f3bdfd4620f3255
|
4
|
+
data.tar.gz: 9f13c353a75106ba0613fada05bc6fa1d8015d363389a906234394b6ecb27eea
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4a2268acc778c67da116626ea346767b1eeec7034f145c283c931640f52904267449dcff7e03c2865fb59abc3becabc48ab47416e04a08c959b216d72f7e544c
|
7
|
+
data.tar.gz: 99ae57d9df5b2185927be56b1c28752df50a0b6e28ba5d6d3725c7b310f84299eaf11ee11fe691ce89209947c2142887aaced83537f2cd5ad63442886d433349
|
data/lib/vmpooler/api/v1.rb
CHANGED
@@ -200,6 +200,17 @@ module Vmpooler
|
|
200
200
|
result
|
201
201
|
end
|
202
202
|
|
203
|
+
def reset_pool(payload)
|
204
|
+
result = { 'ok' => false }
|
205
|
+
|
206
|
+
payload.each do |poolname, count|
|
207
|
+
backend.sadd('vmpooler__poolreset', poolname)
|
208
|
+
end
|
209
|
+
status 201
|
210
|
+
result['ok'] = true
|
211
|
+
result
|
212
|
+
end
|
213
|
+
|
203
214
|
def update_clone_target(payload)
|
204
215
|
result = { 'ok' => false }
|
205
216
|
|
@@ -1081,6 +1092,44 @@ module Vmpooler
|
|
1081
1092
|
JSON.pretty_generate(result)
|
1082
1093
|
end
|
1083
1094
|
|
1095
|
+
post "#{api_prefix}/poolreset/?" do
|
1096
|
+
content_type :json
|
1097
|
+
result = { 'ok' => false }
|
1098
|
+
|
1099
|
+
if config['experimental_features']
|
1100
|
+
need_token! if Vmpooler::API.settings.config[:auth]
|
1101
|
+
|
1102
|
+
begin
|
1103
|
+
payload = JSON.parse(request.body.read)
|
1104
|
+
if payload
|
1105
|
+
invalid = invalid_templates(payload)
|
1106
|
+
if invalid.empty?
|
1107
|
+
result = reset_pool(payload)
|
1108
|
+
else
|
1109
|
+
invalid.each do |bad_pool|
|
1110
|
+
metrics.increment("poolreset.invalid.#{bad_pool}")
|
1111
|
+
end
|
1112
|
+
result[:bad_pools] = invalid
|
1113
|
+
status 400
|
1114
|
+
end
|
1115
|
+
else
|
1116
|
+
metrics.increment('poolreset.invalid.unknown')
|
1117
|
+
status 404
|
1118
|
+
end
|
1119
|
+
rescue JSON::ParserError
|
1120
|
+
status 400
|
1121
|
+
result = {
|
1122
|
+
'ok' => false,
|
1123
|
+
'message' => 'JSON payload could not be parsed'
|
1124
|
+
}
|
1125
|
+
end
|
1126
|
+
else
|
1127
|
+
status 405
|
1128
|
+
end
|
1129
|
+
|
1130
|
+
JSON.pretty_generate(result)
|
1131
|
+
end
|
1132
|
+
|
1084
1133
|
post "#{api_prefix}/config/clonetarget/?" do
|
1085
1134
|
content_type :json
|
1086
1135
|
result = { 'ok' => false }
|
@@ -714,6 +714,10 @@ module Vmpooler
|
|
714
714
|
# - Fires when a template configuration update is requested
|
715
715
|
# - Additional options
|
716
716
|
# :poolname
|
717
|
+
# :pool_reset
|
718
|
+
# - Fires when a pool reset is requested
|
719
|
+
# - Additional options
|
720
|
+
# :poolname
|
717
721
|
#
|
718
722
|
def sleep_with_wakeup_events(loop_delay, wakeup_period = 5, options = {})
|
719
723
|
exit_by = Time.now + loop_delay
|
@@ -760,6 +764,10 @@ module Vmpooler
|
|
760
764
|
end
|
761
765
|
end
|
762
766
|
|
767
|
+
if options[:pool_reset]
|
768
|
+
break if $redis.sismember('vmpooler__poolreset', options[:poolname])
|
769
|
+
end
|
770
|
+
|
763
771
|
end
|
764
772
|
|
765
773
|
break if time_passed?(:exit_by, exit_by)
|
@@ -797,7 +805,7 @@ module Vmpooler
|
|
797
805
|
loop_delay = (loop_delay * loop_delay_decay).to_i
|
798
806
|
loop_delay = loop_delay_max if loop_delay > loop_delay_max
|
799
807
|
end
|
800
|
-
sleep_with_wakeup_events(loop_delay, loop_delay_min, pool_size_change: true, poolname: pool['name'], pool_template_change: true, clone_target_change: true)
|
808
|
+
sleep_with_wakeup_events(loop_delay, loop_delay_min, pool_size_change: true, poolname: pool['name'], pool_template_change: true, clone_target_change: true, pool_reset: true)
|
801
809
|
|
802
810
|
unless maxloop.zero?
|
803
811
|
break if loop_count >= maxloop
|
@@ -951,6 +959,17 @@ module Vmpooler
|
|
951
959
|
end
|
952
960
|
end
|
953
961
|
|
962
|
+
def reset_pool(pool)
|
963
|
+
poolname = pool['name']
|
964
|
+
return unless $redis.sismember('vmpooler__poolreset', poolname)
|
965
|
+
$redis.srem('vmpooler__poolreset', poolname)
|
966
|
+
mutex = pool_mutex(poolname)
|
967
|
+
mutex.synchronize do
|
968
|
+
drain_pool(poolname)
|
969
|
+
$logger.log('s', "[*] [#{poolname}] reset has cleared ready and pending instances")
|
970
|
+
end
|
971
|
+
end
|
972
|
+
|
954
973
|
def create_inventory(pool, provider, pool_check_response)
|
955
974
|
inventory = {}
|
956
975
|
begin
|
@@ -1159,6 +1178,9 @@ module Vmpooler
|
|
1159
1178
|
# Remove VMs in excess of the configured pool size
|
1160
1179
|
remove_excess_vms(pool)
|
1161
1180
|
|
1181
|
+
# Reset a pool when poolreset is requested from the API
|
1182
|
+
reset_pool(pool)
|
1183
|
+
|
1162
1184
|
pool_check_response
|
1163
1185
|
end
|
1164
1186
|
|
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.
|
4
|
+
version: 0.10.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Puppet
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-02-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: pickup
|