vmpooler 1.1.2 → 2.1.0
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 +4 -4
- data/lib/vmpooler/api/helpers.rb +7 -5
- data/lib/vmpooler/api/v1.rb +97 -0
- data/lib/vmpooler/pool_manager.rb +92 -43
- data/lib/vmpooler/providers/base.rb +25 -2
- data/lib/vmpooler/public/img/logo.png +0 -0
- data/lib/vmpooler/version.rb +1 -1
- data/lib/vmpooler.rb +19 -3
- metadata +25 -24
- data/lib/vmpooler/providers/vsphere.rb +0 -1172
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dc5733b50c5c48ba22925f993a81573840cc9621c1707d453e3b6febc71db5eb
|
4
|
+
data.tar.gz: 65ff19db989378ac0ba7d1f1c0f0f2a241a5455cb22a212c2c9b813b40854b6e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5abd2edab02d247335f5b67c37004a4a6407798ad0739dde17c55db11e7651dd1d1328d11542972f9b7d9d6b15fffec99c9fb4ee02fb678f5af4e7ed41239a35
|
7
|
+
data.tar.gz: 52ceac894cac6e96f9c73b4a6048dd19ef700a271fc5da1977110020c412b6a376b498da430162f953555b626618009c2e932e260314754141e9f10bbd372a0f
|
data/lib/vmpooler/api/helpers.rb
CHANGED
@@ -56,14 +56,11 @@ module Vmpooler
|
|
56
56
|
return false
|
57
57
|
end
|
58
58
|
|
59
|
-
def authenticate_ldap(port, host, user_object, base, username_str, password_str)
|
59
|
+
def authenticate_ldap(port, host, encryption_hash, user_object, base, username_str, password_str)
|
60
60
|
ldap = Net::LDAP.new(
|
61
61
|
:host => host,
|
62
62
|
:port => port,
|
63
|
-
:encryption =>
|
64
|
-
:method => :start_tls,
|
65
|
-
:tls_options => { :ssl_version => 'TLSv1' }
|
66
|
-
},
|
63
|
+
:encryption => encryption_hash,
|
67
64
|
:base => base,
|
68
65
|
:auth => {
|
69
66
|
:method => :simple,
|
@@ -86,6 +83,10 @@ module Vmpooler
|
|
86
83
|
ldap_port = auth[:ldap]['port'] || 389
|
87
84
|
ldap_user_obj = auth[:ldap]['user_object']
|
88
85
|
ldap_host = auth[:ldap]['host']
|
86
|
+
ldap_encryption_hash = auth[:ldap]['encryption'] || {
|
87
|
+
:method => :start_tls,
|
88
|
+
:tls_options => { :ssl_version => 'TLSv1' }
|
89
|
+
}
|
89
90
|
|
90
91
|
unless ldap_base.is_a? Array
|
91
92
|
ldap_base = ldap_base.split
|
@@ -100,6 +101,7 @@ module Vmpooler
|
|
100
101
|
result = authenticate_ldap(
|
101
102
|
ldap_port,
|
102
103
|
ldap_host,
|
104
|
+
ldap_encryption_hash,
|
103
105
|
search_user_obj,
|
104
106
|
search_base,
|
105
107
|
username_str,
|
data/lib/vmpooler/api/v1.rb
CHANGED
@@ -28,6 +28,10 @@ module Vmpooler
|
|
28
28
|
Vmpooler::API.settings.config[:pools]
|
29
29
|
end
|
30
30
|
|
31
|
+
def pools_at_startup
|
32
|
+
Vmpooler::API.settings.config[:pools_at_startup]
|
33
|
+
end
|
34
|
+
|
31
35
|
def pool_exists?(template)
|
32
36
|
Vmpooler::API.settings.config[:pool_names].include?(template)
|
33
37
|
end
|
@@ -289,6 +293,32 @@ module Vmpooler
|
|
289
293
|
puts 'd', "[!] [#{poolname}] failed while evaluating usage labels on '#{vmname}' with an error: #{e}"
|
290
294
|
end
|
291
295
|
|
296
|
+
def reset_pool_size(poolname)
|
297
|
+
result = { 'ok' => false }
|
298
|
+
|
299
|
+
pool_index = pool_index(pools)
|
300
|
+
|
301
|
+
pools_updated = 0
|
302
|
+
sync_pool_sizes
|
303
|
+
|
304
|
+
pool_size_now = pools[pool_index[poolname]]['size'].to_i
|
305
|
+
pool_size_original = pools_at_startup[pool_index[poolname]]['size'].to_i
|
306
|
+
result['pool_size_before_reset'] = pool_size_now
|
307
|
+
result['pool_size_before_overrides'] = pool_size_original
|
308
|
+
|
309
|
+
unless pool_size_now == pool_size_original
|
310
|
+
pools[pool_index[poolname]]['size'] = pool_size_original
|
311
|
+
backend.hdel('vmpooler__config__poolsize', poolname)
|
312
|
+
backend.sadd('vmpooler__pool__undo_size_override', poolname)
|
313
|
+
pools_updated += 1
|
314
|
+
status 201
|
315
|
+
end
|
316
|
+
|
317
|
+
status 200 unless pools_updated > 0
|
318
|
+
result['ok'] = true
|
319
|
+
result
|
320
|
+
end
|
321
|
+
|
292
322
|
def update_pool_size(payload)
|
293
323
|
result = { 'ok' => false }
|
294
324
|
|
@@ -309,6 +339,33 @@ module Vmpooler
|
|
309
339
|
result
|
310
340
|
end
|
311
341
|
|
342
|
+
def reset_pool_template(poolname)
|
343
|
+
result = { 'ok' => false }
|
344
|
+
|
345
|
+
pool_index_live = pool_index(pools)
|
346
|
+
pool_index_original = pool_index(pools_at_startup)
|
347
|
+
|
348
|
+
pools_updated = 0
|
349
|
+
sync_pool_templates
|
350
|
+
|
351
|
+
template_now = pools[pool_index_live[poolname]]['template']
|
352
|
+
template_original = pools_at_startup[pool_index_original[poolname]]['template']
|
353
|
+
result['template_before_reset'] = template_now
|
354
|
+
result['template_before_overrides'] = template_original
|
355
|
+
|
356
|
+
unless template_now == template_original
|
357
|
+
pools[pool_index_live[poolname]]['template'] = template_original
|
358
|
+
backend.hdel('vmpooler__config__template', poolname)
|
359
|
+
backend.sadd('vmpooler__pool__undo_template_override', poolname)
|
360
|
+
pools_updated += 1
|
361
|
+
status 201
|
362
|
+
end
|
363
|
+
|
364
|
+
status 200 unless pools_updated > 0
|
365
|
+
result['ok'] = true
|
366
|
+
result
|
367
|
+
end
|
368
|
+
|
312
369
|
def update_pool_template(payload)
|
313
370
|
result = { 'ok' => false }
|
314
371
|
|
@@ -1375,6 +1432,26 @@ module Vmpooler
|
|
1375
1432
|
JSON.pretty_generate(result)
|
1376
1433
|
end
|
1377
1434
|
|
1435
|
+
delete "#{api_prefix}/config/poolsize/:pool/?" do
|
1436
|
+
content_type :json
|
1437
|
+
result = { 'ok' => false }
|
1438
|
+
|
1439
|
+
if config['experimental_features']
|
1440
|
+
need_token! if Vmpooler::API.settings.config[:auth]
|
1441
|
+
|
1442
|
+
if pool_exists?(params[:pool])
|
1443
|
+
result = reset_pool_size(params[:pool])
|
1444
|
+
else
|
1445
|
+
metrics.increment('config.invalid.unknown')
|
1446
|
+
status 404
|
1447
|
+
end
|
1448
|
+
else
|
1449
|
+
status 405
|
1450
|
+
end
|
1451
|
+
|
1452
|
+
JSON.pretty_generate(result)
|
1453
|
+
end
|
1454
|
+
|
1378
1455
|
post "#{api_prefix}/config/poolsize/?" do
|
1379
1456
|
content_type :json
|
1380
1457
|
result = { 'ok' => false }
|
@@ -1406,6 +1483,26 @@ module Vmpooler
|
|
1406
1483
|
JSON.pretty_generate(result)
|
1407
1484
|
end
|
1408
1485
|
|
1486
|
+
delete "#{api_prefix}/config/pooltemplate/:pool/?" do
|
1487
|
+
content_type :json
|
1488
|
+
result = { 'ok' => false }
|
1489
|
+
|
1490
|
+
if config['experimental_features']
|
1491
|
+
need_token! if Vmpooler::API.settings.config[:auth]
|
1492
|
+
|
1493
|
+
if pool_exists?(params[:pool])
|
1494
|
+
result = reset_pool_template(params[:pool])
|
1495
|
+
else
|
1496
|
+
metrics.increment('config.invalid.unknown')
|
1497
|
+
status 404
|
1498
|
+
end
|
1499
|
+
else
|
1500
|
+
status 405
|
1501
|
+
end
|
1502
|
+
|
1503
|
+
JSON.pretty_generate(result)
|
1504
|
+
end
|
1505
|
+
|
1409
1506
|
post "#{api_prefix}/config/pooltemplate/?" do
|
1410
1507
|
content_type :json
|
1411
1508
|
result = { 'ok' => false }
|
@@ -294,6 +294,12 @@ module Vmpooler
|
|
294
294
|
move_vm_queue(pool, vm, 'running', 'completed', redis, 'is listed as running, but has no checkouttime data. Removing from running')
|
295
295
|
end
|
296
296
|
|
297
|
+
# tag VM if not tagged yet, this ensures the method is only called once
|
298
|
+
unless redis.hget("vmpooler__vm__#{vm}", 'user_tagged')
|
299
|
+
success = provider.tag_vm_user(pool, vm)
|
300
|
+
redis.hset("vmpooler__vm__#{vm}", 'user_tagged', 'true') if success
|
301
|
+
end
|
302
|
+
|
297
303
|
throw :stop_checking if provider.vm_ready?(pool, vm)
|
298
304
|
|
299
305
|
throw :stop_checking if provider.get_vm(pool, vm)
|
@@ -478,15 +484,15 @@ module Vmpooler
|
|
478
484
|
dereference_mutex(vm)
|
479
485
|
end
|
480
486
|
|
481
|
-
def
|
482
|
-
global_purge = $config[:config]['
|
487
|
+
def purge_unused_vms_and_resources
|
488
|
+
global_purge = $config[:config]['purge_unconfigured_resources']
|
483
489
|
providers = $config[:providers].keys
|
484
490
|
providers.each do |provider_key|
|
485
|
-
provider_purge = $config[:providers][provider_key]['
|
491
|
+
provider_purge = $config[:providers][provider_key]['purge_unconfigured_resources'] || global_purge
|
486
492
|
if provider_purge
|
487
493
|
Thread.new do
|
488
494
|
begin
|
489
|
-
|
495
|
+
purge_vms_and_resources(provider_key)
|
490
496
|
rescue StandardError => e
|
491
497
|
$logger.log('s', "[!] failed while purging provider #{provider_key} VMs and folders with an error: #{e}")
|
492
498
|
end
|
@@ -496,33 +502,16 @@ module Vmpooler
|
|
496
502
|
nil
|
497
503
|
end
|
498
504
|
|
499
|
-
|
500
|
-
def pool_folders(provider_name)
|
501
|
-
folders = {}
|
502
|
-
$config[:pools].each do |pool|
|
503
|
-
next unless pool['provider'] == provider_name.to_s
|
504
|
-
|
505
|
-
folder_parts = pool['folder'].split('/')
|
506
|
-
datacenter = $providers[provider_name.to_s].get_target_datacenter_from_config(pool['name'])
|
507
|
-
folders[folder_parts.pop] = "#{datacenter}/vm/#{folder_parts.join('/')}"
|
508
|
-
end
|
509
|
-
folders
|
510
|
-
end
|
511
|
-
|
512
|
-
def get_base_folders(folders)
|
513
|
-
base = []
|
514
|
-
folders.each do |_key, value|
|
515
|
-
base << value
|
516
|
-
end
|
517
|
-
base.uniq
|
518
|
-
end
|
519
|
-
|
520
|
-
def purge_vms_and_folders(provider_name)
|
505
|
+
def purge_vms_and_resources(provider_name)
|
521
506
|
provider = $providers[provider_name.to_s]
|
522
|
-
|
523
|
-
|
524
|
-
|
525
|
-
|
507
|
+
# Deprecated, will be removed in version 3
|
508
|
+
if provider.provider_config['folder_whitelist']
|
509
|
+
$logger.log('d', "[!] [deprecation] rename configuration 'folder_whitelist' to 'resources_allowlist' for provider #{provider_name}")
|
510
|
+
allowlist = provider.provider_config['folder_whitelist']
|
511
|
+
else
|
512
|
+
allowlist = provider.provider_config['resources_allowlist']
|
513
|
+
end
|
514
|
+
provider.purge_unconfigured_resources(allowlist)
|
526
515
|
end
|
527
516
|
|
528
517
|
def create_vm_disk(pool_name, vm, disk_size, provider)
|
@@ -628,17 +617,30 @@ module Vmpooler
|
|
628
617
|
end
|
629
618
|
|
630
619
|
# @return [Array] - a list of used providers from the config file, defaults to the default providers
|
631
|
-
# ie. ["
|
620
|
+
# ie. ["dummy"]
|
632
621
|
def used_providers
|
633
|
-
|
634
|
-
|
622
|
+
# create an array of provider classes based on the config
|
623
|
+
if config[:providers]
|
624
|
+
config_provider_names = config[:providers].keys
|
625
|
+
config_providers = config_provider_names.map do |config_provider_name|
|
626
|
+
if config[:providers][config_provider_name] && config[:providers][config_provider_name]['provider_class']
|
627
|
+
config[:providers][config_provider_name]['provider_class'].to_s
|
628
|
+
else
|
629
|
+
config_provider_name.to_s
|
630
|
+
end
|
631
|
+
end.compact.uniq
|
632
|
+
else
|
633
|
+
config_providers = []
|
634
|
+
end
|
635
|
+
# return the unique array of providers from the config and VMPooler defaults
|
636
|
+
@used_providers ||= (config_providers + default_providers).uniq
|
635
637
|
end
|
636
638
|
|
637
639
|
# @return [Array] - returns a list of providers that should always be loaded
|
638
640
|
# note: vsphere is the default if user does not specify although this should not be
|
639
641
|
# if vsphere is to no longer be loaded by default please remove
|
640
642
|
def default_providers
|
641
|
-
@default_providers ||= %w[
|
643
|
+
@default_providers ||= %w[dummy]
|
642
644
|
end
|
643
645
|
|
644
646
|
def get_pool_name_for_vm(vm_name, redis)
|
@@ -784,6 +786,10 @@ module Vmpooler
|
|
784
786
|
# - Fires when a pool reset is requested
|
785
787
|
# - Additional options
|
786
788
|
# :poolname
|
789
|
+
# :undo_override
|
790
|
+
# - Fires when a pool override removal is requested
|
791
|
+
# - Additional options
|
792
|
+
# :poolname
|
787
793
|
#
|
788
794
|
def sleep_with_wakeup_events(loop_delay, wakeup_period = 5, options = {})
|
789
795
|
exit_by = Time.now + loop_delay
|
@@ -826,6 +832,11 @@ module Vmpooler
|
|
826
832
|
break if pending
|
827
833
|
end
|
828
834
|
|
835
|
+
if options[:undo_override]
|
836
|
+
break if redis.sismember('vmpooler__pool__undo_template_override', options[:poolname])
|
837
|
+
break if redis.sismember('vmpooler__pool__undo_size_override', options[:poolname])
|
838
|
+
end
|
839
|
+
|
829
840
|
if options[:pending_vm]
|
830
841
|
pending_vm_count = redis.scard("vmpooler__pending__#{options[:poolname]}")
|
831
842
|
break unless pending_vm_count == 0
|
@@ -880,7 +891,7 @@ module Vmpooler
|
|
880
891
|
loop_delay = (loop_delay * loop_delay_decay).to_i
|
881
892
|
loop_delay = loop_delay_max if loop_delay > loop_delay_max
|
882
893
|
end
|
883
|
-
sleep_with_wakeup_events(loop_delay, loop_delay_min, pool_size_change: true, poolname: pool['name'], pool_template_change: true, clone_target_change: true, pending_vm: true, pool_reset: true)
|
894
|
+
sleep_with_wakeup_events(loop_delay, loop_delay_min, pool_size_change: true, poolname: pool['name'], pool_template_change: true, clone_target_change: true, pending_vm: true, pool_reset: true, undo_override: true)
|
884
895
|
|
885
896
|
unless maxloop == 0
|
886
897
|
break if loop_count >= maxloop
|
@@ -1040,15 +1051,18 @@ module Vmpooler
|
|
1040
1051
|
return if mutex.locked?
|
1041
1052
|
|
1042
1053
|
@redis.with_metrics do |redis|
|
1043
|
-
|
1044
|
-
break if
|
1054
|
+
pool_size_requested = redis.hget('vmpooler__config__poolsize', pool['name'])
|
1055
|
+
break if pool_size_requested.nil?
|
1045
1056
|
|
1046
|
-
|
1047
|
-
|
1057
|
+
pool_size_requested = Integer(pool_size_requested)
|
1058
|
+
pool_size_currently = pool['size']
|
1059
|
+
break if pool_size_requested == pool_size_currently
|
1048
1060
|
|
1049
1061
|
mutex.synchronize do
|
1050
|
-
pool['size'] =
|
1062
|
+
pool['size'] = pool_size_requested
|
1051
1063
|
end
|
1064
|
+
|
1065
|
+
$logger.log('s', "[*] [#{pool['name']}] size updated from #{pool_size_currently} to #{pool_size_requested}")
|
1052
1066
|
end
|
1053
1067
|
end
|
1054
1068
|
|
@@ -1066,6 +1080,38 @@ module Vmpooler
|
|
1066
1080
|
end
|
1067
1081
|
end
|
1068
1082
|
|
1083
|
+
def undo_override(pool, provider)
|
1084
|
+
poolname = pool['name']
|
1085
|
+
mutex = pool_mutex(poolname)
|
1086
|
+
return if mutex.locked?
|
1087
|
+
|
1088
|
+
@redis.with_metrics do |redis|
|
1089
|
+
break unless redis.sismember('vmpooler__pool__undo_template_override', poolname)
|
1090
|
+
|
1091
|
+
redis.srem('vmpooler__pool__undo_template_override', poolname)
|
1092
|
+
template_now = pool['template']
|
1093
|
+
template_original = $config[:pools_at_startup][$config[:pool_index][poolname]]['template']
|
1094
|
+
|
1095
|
+
mutex.synchronize do
|
1096
|
+
update_pool_template(pool, provider, template_original, template_now, redis)
|
1097
|
+
end
|
1098
|
+
end
|
1099
|
+
|
1100
|
+
@redis.with_metrics do |redis|
|
1101
|
+
break unless redis.sismember('vmpooler__pool__undo_size_override', poolname)
|
1102
|
+
|
1103
|
+
redis.srem('vmpooler__pool__undo_size_override', poolname)
|
1104
|
+
pool_size_now = pool['size']
|
1105
|
+
pool_size_original = $config[:pools_at_startup][$config[:pool_index][poolname]]['size']
|
1106
|
+
|
1107
|
+
mutex.synchronize do
|
1108
|
+
pool['size'] = pool_size_original
|
1109
|
+
end
|
1110
|
+
|
1111
|
+
$logger.log('s', "[*] [#{poolname}] size updated from #{pool_size_now} to #{pool_size_original}")
|
1112
|
+
end
|
1113
|
+
end
|
1114
|
+
|
1069
1115
|
def create_inventory(pool, provider, pool_check_response)
|
1070
1116
|
inventory = {}
|
1071
1117
|
begin
|
@@ -1300,6 +1346,9 @@ module Vmpooler
|
|
1300
1346
|
# Reset a pool when poolreset is requested from the API
|
1301
1347
|
reset_pool(pool)
|
1302
1348
|
|
1349
|
+
# Undo overrides submitted via the api
|
1350
|
+
undo_override(pool, provider)
|
1351
|
+
|
1303
1352
|
pool_check_response
|
1304
1353
|
end
|
1305
1354
|
|
@@ -1514,8 +1563,8 @@ module Vmpooler
|
|
1514
1563
|
# Set default provider for all pools that do not have one defined
|
1515
1564
|
$config[:pools].each do |pool|
|
1516
1565
|
if pool['provider'].nil?
|
1517
|
-
$logger.log('d', "[!] Setting provider for pool '#{pool['name']}' to '
|
1518
|
-
pool['provider'] = '
|
1566
|
+
$logger.log('d', "[!] Setting provider for pool '#{pool['name']}' to 'dummy' as default")
|
1567
|
+
pool['provider'] = 'dummy'
|
1519
1568
|
end
|
1520
1569
|
end
|
1521
1570
|
|
@@ -1559,7 +1608,7 @@ module Vmpooler
|
|
1559
1608
|
end
|
1560
1609
|
end
|
1561
1610
|
|
1562
|
-
|
1611
|
+
purge_unused_vms_and_resources
|
1563
1612
|
|
1564
1613
|
loop_count = 1
|
1565
1614
|
loop do
|
@@ -212,6 +212,22 @@ module Vmpooler
|
|
212
212
|
raise("#{self.class.name} does not implement vm_ready?")
|
213
213
|
end
|
214
214
|
|
215
|
+
# tag_vm_user This method is called once we know who is using the VM (it is running). This method enables seeing
|
216
|
+
# who is using what in the provider pools.
|
217
|
+
# This method should be implemented in the providers, if it is not implemented, this base method will be called
|
218
|
+
# and should be a noop. The implementation should check if the vm has a user (as per redis) and add a new tag
|
219
|
+
# with the information.
|
220
|
+
# inputs
|
221
|
+
# [String] pool_name : Name of the pool
|
222
|
+
# [String] vm_name : Name of the VM to check if ready
|
223
|
+
# returns
|
224
|
+
# [Boolean] : true if successful, false if an error occurred and it should retry
|
225
|
+
def tag_vm_user(_pool_name, _vm_name)
|
226
|
+
# noop by design. If the provider does not implement this method, this base method is called (because inherited)
|
227
|
+
# and should basically do nothing.
|
228
|
+
true
|
229
|
+
end
|
230
|
+
|
215
231
|
# inputs
|
216
232
|
# [String] pool_name : Name of the pool
|
217
233
|
# [String] vm_name : Name of the VM to check if it exists
|
@@ -237,8 +253,15 @@ module Vmpooler
|
|
237
253
|
raise("#{self.class.name} does not implement get_target_datacenter_from_config")
|
238
254
|
end
|
239
255
|
|
240
|
-
def
|
241
|
-
raise("#{self.class.name} does not implement
|
256
|
+
def purge_unconfigured_resources(_allowlist)
|
257
|
+
raise("#{self.class.name} does not implement purge_unconfigured_resources")
|
258
|
+
end
|
259
|
+
|
260
|
+
# DEPRECATED if a provider does not implement the new method, it will hit this base class method
|
261
|
+
# and return a deprecation message
|
262
|
+
def purge_unconfigured_folders(_deprecated, _deprecated2, allowlist)
|
263
|
+
logger.log('s', '[!] purge_unconfigured_folders was renamed to purge_unconfigured_resources, please update your provider implementation')
|
264
|
+
purge_unconfigured_resources(allowlist)
|
242
265
|
end
|
243
266
|
end
|
244
267
|
end
|
Binary file
|
data/lib/vmpooler/version.rb
CHANGED
data/lib/vmpooler.rb
CHANGED
@@ -7,7 +7,6 @@ module Vmpooler
|
|
7
7
|
require 'net/ldap'
|
8
8
|
require 'open-uri'
|
9
9
|
require 'pickup'
|
10
|
-
require 'rbvmomi'
|
11
10
|
require 'redis'
|
12
11
|
require 'set'
|
13
12
|
require 'sinatra/base'
|
@@ -32,7 +31,7 @@ module Vmpooler
|
|
32
31
|
if ENV['VMPOOLER_CONFIG']
|
33
32
|
config_string = ENV['VMPOOLER_CONFIG']
|
34
33
|
# Parse the YAML config into a Hash
|
35
|
-
#
|
34
|
+
# Allow the Symbol class
|
36
35
|
parsed_config = YAML.safe_load(config_string, [Symbol])
|
37
36
|
else
|
38
37
|
# Take the name of the config file either from an ENV variable or from the filepath argument
|
@@ -82,10 +81,13 @@ module Vmpooler
|
|
82
81
|
parsed_config[:config]['retry_factor'] = string_to_int(ENV['RETRY_FACTOR']) if ENV['RETRY_FACTOR']
|
83
82
|
parsed_config[:config]['create_folders'] = true?(ENV['CREATE_FOLDERS']) if ENV['CREATE_FOLDERS']
|
84
83
|
parsed_config[:config]['experimental_features'] = ENV['EXPERIMENTAL_FEATURES'] if ENV['EXPERIMENTAL_FEATURES']
|
85
|
-
parsed_config[:config]['purge_unconfigured_folders'] = ENV['PURGE_UNCONFIGURED_FOLDERS'] if ENV['PURGE_UNCONFIGURED_FOLDERS']
|
86
84
|
parsed_config[:config]['usage_stats'] = ENV['USAGE_STATS'] if ENV['USAGE_STATS']
|
87
85
|
parsed_config[:config]['request_logger'] = ENV['REQUEST_LOGGER'] if ENV['REQUEST_LOGGER']
|
88
86
|
parsed_config[:config]['create_template_delta_disks'] = ENV['CREATE_TEMPLATE_DELTA_DISKS'] if ENV['CREATE_TEMPLATE_DELTA_DISKS']
|
87
|
+
parsed_config[:config]['purge_unconfigured_resources'] = ENV['PURGE_UNCONFIGURED_RESOURCES'] if ENV['PURGE_UNCONFIGURED_RESOURCES']
|
88
|
+
parsed_config[:config]['purge_unconfigured_resources'] = ENV['PURGE_UNCONFIGURED_FOLDERS'] if ENV['PURGE_UNCONFIGURED_FOLDERS']
|
89
|
+
# ENV PURGE_UNCONFIGURED_FOLDERS deprecated, will be removed in version 3
|
90
|
+
puts '[!] [deprecation] rename ENV var \'PURGE_UNCONFIGURED_FOLDERS\' to \'PURGE_UNCONFIGURED_RESOURCES\'' if ENV['PURGE_UNCONFIGURED_FOLDERS']
|
89
91
|
set_linked_clone(parsed_config)
|
90
92
|
|
91
93
|
parsed_config[:redis] = parsed_config[:redis] || {}
|
@@ -119,6 +121,11 @@ module Vmpooler
|
|
119
121
|
parsed_config[:auth][:ldap]['port'] = string_to_int(ENV['LDAP_PORT']) if ENV['LDAP_PORT']
|
120
122
|
parsed_config[:auth][:ldap]['base'] = ENV['LDAP_BASE'] if ENV['LDAP_BASE']
|
121
123
|
parsed_config[:auth][:ldap]['user_object'] = ENV['LDAP_USER_OBJECT'] if ENV['LDAP_USER_OBJECT']
|
124
|
+
if parsed_config[:auth]['provider'] == 'ldap' && parsed_config[:auth][:ldap].key?('encryption')
|
125
|
+
parsed_config[:auth][:ldap]['encryption'] = parsed_config[:auth][:ldap]['encryption']
|
126
|
+
elsif parsed_config[:auth]['provider'] == 'ldap'
|
127
|
+
parsed_config[:auth][:ldap]['encryption'] = {}
|
128
|
+
end
|
122
129
|
end
|
123
130
|
|
124
131
|
# Create an index of pool aliases
|
@@ -128,8 +135,17 @@ module Vmpooler
|
|
128
135
|
parsed_config[:pools] = load_pools_from_redis(redis)
|
129
136
|
end
|
130
137
|
|
138
|
+
# Marshal.dump is paired with Marshal.load to create a copy that has its own memory space
|
139
|
+
# so that each can be edited independently
|
140
|
+
# rubocop:disable Security/MarshalLoad
|
141
|
+
|
142
|
+
# retain a copy of the pools that were observed at startup
|
143
|
+
serialized_pools = Marshal.dump(parsed_config[:pools])
|
144
|
+
parsed_config[:pools_at_startup] = Marshal.load(serialized_pools)
|
145
|
+
|
131
146
|
# Create an index of pools by title
|
132
147
|
parsed_config[:pool_index] = pool_index(parsed_config[:pools])
|
148
|
+
# rubocop:enable Security/MarshalLoad
|
133
149
|
|
134
150
|
parsed_config[:pools].each do |pool|
|
135
151
|
parsed_config[:pool_names] << pool['name']
|
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:
|
4
|
+
version: 2.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Puppet
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-12-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: concurrent-ruby
|
@@ -226,26 +226,6 @@ dependencies:
|
|
226
226
|
- - "~>"
|
227
227
|
- !ruby/object:Gem::Version
|
228
228
|
version: '13.0'
|
229
|
-
- !ruby/object:Gem::Dependency
|
230
|
-
name: rbvmomi
|
231
|
-
requirement: !ruby/object:Gem::Requirement
|
232
|
-
requirements:
|
233
|
-
- - ">="
|
234
|
-
- !ruby/object:Gem::Version
|
235
|
-
version: '2.1'
|
236
|
-
- - "<"
|
237
|
-
- !ruby/object:Gem::Version
|
238
|
-
version: '4.0'
|
239
|
-
type: :runtime
|
240
|
-
prerelease: false
|
241
|
-
version_requirements: !ruby/object:Gem::Requirement
|
242
|
-
requirements:
|
243
|
-
- - ">="
|
244
|
-
- !ruby/object:Gem::Version
|
245
|
-
version: '2.1'
|
246
|
-
- - "<"
|
247
|
-
- !ruby/object:Gem::Version
|
248
|
-
version: '4.0'
|
249
229
|
- !ruby/object:Gem::Dependency
|
250
230
|
name: redis
|
251
231
|
requirement: !ruby/object:Gem::Requirement
|
@@ -400,6 +380,26 @@ dependencies:
|
|
400
380
|
- - ">="
|
401
381
|
- !ruby/object:Gem::Version
|
402
382
|
version: 0.11.2
|
383
|
+
- !ruby/object:Gem::Dependency
|
384
|
+
name: thor
|
385
|
+
requirement: !ruby/object:Gem::Requirement
|
386
|
+
requirements:
|
387
|
+
- - "~>"
|
388
|
+
- !ruby/object:Gem::Version
|
389
|
+
version: '1.0'
|
390
|
+
- - ">="
|
391
|
+
- !ruby/object:Gem::Version
|
392
|
+
version: 1.0.1
|
393
|
+
type: :development
|
394
|
+
prerelease: false
|
395
|
+
version_requirements: !ruby/object:Gem::Requirement
|
396
|
+
requirements:
|
397
|
+
- - "~>"
|
398
|
+
- !ruby/object:Gem::Version
|
399
|
+
version: '1.0'
|
400
|
+
- - ">="
|
401
|
+
- !ruby/object:Gem::Version
|
402
|
+
version: 1.0.1
|
403
403
|
- !ruby/object:Gem::Dependency
|
404
404
|
name: yarjuf
|
405
405
|
requirement: !ruby/object:Gem::Requirement
|
@@ -444,10 +444,10 @@ files:
|
|
444
444
|
- lib/vmpooler/providers.rb
|
445
445
|
- lib/vmpooler/providers/base.rb
|
446
446
|
- lib/vmpooler/providers/dummy.rb
|
447
|
-
- lib/vmpooler/providers/vsphere.rb
|
448
447
|
- lib/vmpooler/public/bootstrap.min.css
|
449
448
|
- lib/vmpooler/public/img/bg.png
|
450
449
|
- lib/vmpooler/public/img/logo.gif
|
450
|
+
- lib/vmpooler/public/img/logo.png
|
451
451
|
- lib/vmpooler/public/img/spinner.svg
|
452
452
|
- lib/vmpooler/public/img/subtle_dots.png
|
453
453
|
- lib/vmpooler/public/img/textured_paper.png
|
@@ -479,7 +479,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
479
479
|
- !ruby/object:Gem::Version
|
480
480
|
version: '0'
|
481
481
|
requirements: []
|
482
|
-
|
482
|
+
rubyforge_project:
|
483
|
+
rubygems_version: 2.7.6.2
|
483
484
|
signing_key:
|
484
485
|
specification_version: 4
|
485
486
|
summary: vmpooler provides configurable pools of instantly-available (running) virtual
|