vmpooler 0.9.1 → 0.10.2

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 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