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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 03cf2be498c698d23100da26391cef6f2a63bb87
4
- data.tar.gz: f239eb2ccb445f4ef5a6dc31bad5cdd80fb02f37
3
+ metadata.gz: 3ae2494365a5cecad598897da93f73c7ba874e17
4
+ data.tar.gz: 5a9d13f8e6e4ca78c7e0a9f3375fa5f11ada986b
5
5
  SHA512:
6
- metadata.gz: 83d8fbf7d283098ead4b860e83fe4f1cee94760450fe240609678137581a33c7007bd2bc33e9cfaeb73f91eff59b71eedd4f9cacec6b661499deb33846bab746
7
- data.tar.gz: 28983a8ffa2a190699f0169de957ee182a2194abb96f1aa42f62e17d32f5085fd36afd24c014f649142766594cd4e9e85cd682f273fa78e5ee297f577d6a2094
6
+ metadata.gz: 4401a2f81fca41982af4b800f0be09174f1a154ab0a655d0c8386c04ac27b93e222697b317b8e06344743b05f750207c3470a93bac5976ee8489c25eab1fb45b
7
+ data.tar.gz: 8d862b2a402fb285bf5a7343db1618a9344df340b1b8abb7e6baf4e5fbe47505bff4cb6df879d6b0ac04be9caca6fd5d1fefc76b793ddc8b5069ac477343f54a
@@ -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
@@ -1,3 +1,3 @@
1
1
  module Vmpooler
2
- VERSION = '0.6.2'.freeze
2
+ VERSION = '0.6.3'.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.6.2
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-17 00:00:00.000000000 Z
11
+ date: 2019-07-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pickup