vmpooler 0.6.2 → 0.6.3

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