vmpooler 2.0.0 → 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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 69a8b533d59906b740d63c48c2f237bac2d42c3bbc770ed178e41f9981c7f955
4
- data.tar.gz: '0609a290e75b7deb1f167a059b6342c43ce7942e600c7f67ba29b3389f411b59'
3
+ metadata.gz: dc5733b50c5c48ba22925f993a81573840cc9621c1707d453e3b6febc71db5eb
4
+ data.tar.gz: 65ff19db989378ac0ba7d1f1c0f0f2a241a5455cb22a212c2c9b813b40854b6e
5
5
  SHA512:
6
- metadata.gz: bd7da108e63619bb0f7a80d1567ee38e6c05c3d87d77982fa81d117612577eb7480940f39c910c8d7fb0ec373972233a304f7bc63e80dae35c7d1f0ba9edddf4
7
- data.tar.gz: d7023cc35609431f37f55a74fd07312afaefab627558ad55f9d03eaa320dce8929ffdb36fc4ca2ab6d0a299a1d93820a2767714680813e3f7f2fbb78fac01b27
6
+ metadata.gz: 5abd2edab02d247335f5b67c37004a4a6407798ad0739dde17c55db11e7651dd1d1328d11542972f9b7d9d6b15fffec99c9fb4ee02fb678f5af4e7ed41239a35
7
+ data.tar.gz: 52ceac894cac6e96f9c73b4a6048dd19ef700a271fc5da1977110020c412b6a376b498da430162f953555b626618009c2e932e260314754141e9f10bbd372a0f
@@ -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 purge_unused_vms_and_folders
482
- global_purge = $config[:config]['purge_unconfigured_folders']
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]['purge_unconfigured_folders'] || global_purge
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
- purge_vms_and_folders(provider_key)
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
- # Return a list of pool folders
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
- configured_folders = pool_folders(provider_name)
523
- base_folders = get_base_folders(configured_folders)
524
- whitelist = provider.provider_config['folder_whitelist']
525
- provider.purge_unconfigured_folders(base_folders, configured_folders, whitelist)
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)
@@ -630,8 +619,21 @@ module Vmpooler
630
619
  # @return [Array] - a list of used providers from the config file, defaults to the default providers
631
620
  # ie. ["dummy"]
632
621
  def used_providers
633
- pools = config[:pools] || []
634
- @used_providers ||= (pools.map { |pool| pool[:provider] || pool['provider'] }.compact + default_providers).uniq
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
@@ -1606,7 +1608,7 @@ module Vmpooler
1606
1608
  end
1607
1609
  end
1608
1610
 
1609
- purge_unused_vms_and_folders
1611
+ purge_unused_vms_and_resources
1610
1612
 
1611
1613
  loop_count = 1
1612
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 purge_unconfigured_folders(_base_folders, _configured_folders, _whitelist)
241
- raise("#{self.class.name} does not implement purge_unconfigured_folders")
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Vmpooler
4
- VERSION = '2.0.0'
4
+ VERSION = '2.1.0'
5
5
  end
data/lib/vmpooler.rb CHANGED
@@ -31,7 +31,7 @@ module Vmpooler
31
31
  if ENV['VMPOOLER_CONFIG']
32
32
  config_string = ENV['VMPOOLER_CONFIG']
33
33
  # Parse the YAML config into a Hash
34
- # Whitelist the Symbol class
34
+ # Allow the Symbol class
35
35
  parsed_config = YAML.safe_load(config_string, [Symbol])
36
36
  else
37
37
  # Take the name of the config file either from an ENV variable or from the filepath argument
@@ -81,10 +81,13 @@ module Vmpooler
81
81
  parsed_config[:config]['retry_factor'] = string_to_int(ENV['RETRY_FACTOR']) if ENV['RETRY_FACTOR']
82
82
  parsed_config[:config]['create_folders'] = true?(ENV['CREATE_FOLDERS']) if ENV['CREATE_FOLDERS']
83
83
  parsed_config[:config]['experimental_features'] = ENV['EXPERIMENTAL_FEATURES'] if ENV['EXPERIMENTAL_FEATURES']
84
- parsed_config[:config]['purge_unconfigured_folders'] = ENV['PURGE_UNCONFIGURED_FOLDERS'] if ENV['PURGE_UNCONFIGURED_FOLDERS']
85
84
  parsed_config[:config]['usage_stats'] = ENV['USAGE_STATS'] if ENV['USAGE_STATS']
86
85
  parsed_config[:config]['request_logger'] = ENV['REQUEST_LOGGER'] if ENV['REQUEST_LOGGER']
87
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']
88
91
  set_linked_clone(parsed_config)
89
92
 
90
93
  parsed_config[:redis] = parsed_config[:redis] || {}
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: 2.0.0
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-12-08 00:00:00.000000000 Z
11
+ date: 2021-12-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby