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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 09dd1d718bab583f033ebc481fbfd9f7041c8d9d039dd20c6df4b4e55e1e477c
4
- data.tar.gz: aebd0b6ec5fe9101a65182c40237cb80bbb99c0debf86ea469955d2ad0529d5a
3
+ metadata.gz: 3f8a23a9dbbb4ee9369c39b366e53966c0c4d29eb959c8b21f3bdfd4620f3255
4
+ data.tar.gz: 9f13c353a75106ba0613fada05bc6fa1d8015d363389a906234394b6ecb27eea
5
5
  SHA512:
6
- metadata.gz: 0f2393c6caf7a36dfa58837e30d6f57a804ede99b53b26096c70c0fdfdee21871432ca82f346b5a92a8a5cb597ce79b357f003c5047ba18406eef3b73bb8f637
7
- data.tar.gz: 192f1fde3e83f5a53a46d08572955295a7f64747d73ece4f0a2b5306f9de7a92ff09ca1dc13e4be236526185694dda9365d39706d7f521fd769a54c1b6358a60
6
+ metadata.gz: 4a2268acc778c67da116626ea346767b1eeec7034f145c283c931640f52904267449dcff7e03c2865fb59abc3becabc48ab47416e04a08c959b216d72f7e544c
7
+ data.tar.gz: 99ae57d9df5b2185927be56b1c28752df50a0b6e28ba5d6d3725c7b310f84299eaf11ee11fe691ce89209947c2142887aaced83537f2cd5ad63442886d433349
@@ -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
 
@@ -1,3 +1,3 @@
1
1
  module Vmpooler
2
- VERSION = '0.9.1'.freeze
2
+ VERSION = '0.10.2'.freeze
3
3
  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: 0.9.1
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-01-28 00:00:00.000000000 Z
11
+ date: 2020-02-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pickup