vmpooler 0.12.0 → 0.13.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -14,10 +14,11 @@ module Vmpooler
14
14
  # Provider options passed in during initialization
15
15
  attr_reader :provider_options
16
16
 
17
- def initialize(config, logger, metrics, name, options)
17
+ def initialize(config, logger, metrics, redis_connection_pool, name, options)
18
18
  @config = config
19
19
  @logger = logger
20
20
  @metrics = metrics
21
+ @redis = redis_connection_pool
21
22
  @provider_name = name
22
23
 
23
24
  # Ensure that there is not a nil provider configuration
@@ -9,8 +9,8 @@ module Vmpooler
9
9
  class Dummy < Vmpooler::PoolManager::Provider::Base
10
10
  # Fake VM Provider for testing
11
11
 
12
- def initialize(config, logger, metrics, name, options)
13
- super(config, logger, metrics, name, options)
12
+ def initialize(config, logger, metrics, redis_connection_pool, name, options)
13
+ super(config, logger, metrics, redis_connection_pool, name, options)
14
14
  dummyfilename = provider_config['filename']
15
15
 
16
16
  # This initial_state option is only intended to be used by spec tests
@@ -9,8 +9,8 @@ module Vmpooler
9
9
  # The connection_pool method is normally used only for testing
10
10
  attr_reader :connection_pool
11
11
 
12
- def initialize(config, logger, metrics, name, options)
13
- super(config, logger, metrics, name, options)
12
+ def initialize(config, logger, metrics, redis_connection_pool, name, options)
13
+ super(config, logger, metrics, redis_connection_pool, name, options)
14
14
 
15
15
  task_limit = global_config[:config].nil? || global_config[:config]['task_limit'].nil? ? 10 : global_config[:config]['task_limit'].to_i
16
16
  # The default connection pool size is:
@@ -39,6 +39,7 @@ module Vmpooler
39
39
  end
40
40
  @provider_hosts = {}
41
41
  @provider_hosts_lock = Mutex.new
42
+ @redis = redis_connection_pool
42
43
  end
43
44
 
44
45
  # name of the provider class
@@ -59,12 +60,16 @@ module Vmpooler
59
60
  def destroy_vm_and_log(vm_name, vm_object, pool, data_ttl)
60
61
  try = 0 if try.nil?
61
62
  max_tries = 3
62
- $redis.srem("vmpooler__completed__#{pool}", vm_name)
63
- $redis.hdel("vmpooler__active__#{pool}", vm_name)
64
- $redis.hset("vmpooler__vm__#{vm_name}", 'destroy', Time.now)
65
-
66
- # Auto-expire metadata key
67
- $redis.expire('vmpooler__vm__' + vm_name, (data_ttl * 60 * 60))
63
+ @redis.with_metrics do |redis|
64
+ redis.multi
65
+ redis.srem("vmpooler__completed__#{pool}", vm_name)
66
+ redis.hdel("vmpooler__active__#{pool}", vm_name)
67
+ redis.hset("vmpooler__vm__#{vm_name}", 'destroy', Time.now)
68
+
69
+ # Auto-expire metadata key
70
+ redis.expire('vmpooler__vm__' + vm_name, (data_ttl * 60 * 60))
71
+ redis.exec
72
+ end
68
73
 
69
74
  start = Time.now
70
75
 
@@ -343,7 +348,7 @@ module Vmpooler
343
348
 
344
349
  begin
345
350
  vm_target_folder = find_vm_folder(pool_name, connection)
346
- vm_target_folder = create_folder(connection, target_folder_path, target_datacenter_name) if vm_target_folder.nil? && @config[:config].key?('create_folders') && (@config[:config]['create_folders'] == true)
351
+ vm_target_folder ||= create_folder(connection, target_folder_path, target_datacenter_name) if @config[:config].key?('create_folders') && (@config[:config]['create_folders'] == true)
347
352
  rescue StandardError
348
353
  if @config[:config].key?('create_folders') && (@config[:config]['create_folders'] == true)
349
354
  vm_target_folder = create_folder(connection, target_folder_path, target_datacenter_name)
@@ -351,6 +356,7 @@ module Vmpooler
351
356
  raise
352
357
  end
353
358
  end
359
+ raise ArgumentError, "Can not find the configured folder for #{pool_name} #{target_folder_path}" unless vm_target_folder
354
360
 
355
361
  # Create the new VM
356
362
  new_vm_object = template_vm_object.CloneVM_Task(
@@ -968,22 +974,24 @@ module Vmpooler
968
974
  begin
969
975
  connection = ensured_vsphere_connection(pool_object)
970
976
  vm_hash = get_vm_details(pool_name, vm_name, connection)
971
- $redis.hset("vmpooler__vm__#{vm_name}", 'host', vm_hash['host_name'])
972
- migration_limit = @config[:config]['migration_limit'] if @config[:config].key?('migration_limit')
973
- migration_count = $redis.scard('vmpooler__migration')
974
- if migration_enabled? @config
975
- if migration_count >= migration_limit
976
- logger.log('s', "[ ] [#{pool_name}] '#{vm_name}' is running on #{vm_hash['host_name']}. No migration will be evaluated since the migration_limit has been reached")
977
- break
978
- end
979
- run_select_hosts(pool_name, @provider_hosts)
980
- if vm_in_target?(pool_name, vm_hash['host_name'], vm_hash['architecture'], @provider_hosts)
981
- logger.log('s', "[ ] [#{pool_name}] No migration required for '#{vm_name}' running on #{vm_hash['host_name']}")
977
+ @redis.with_metrics do |redis|
978
+ redis.hset("vmpooler__vm__#{vm_name}", 'host', vm_hash['host_name'])
979
+ migration_count = redis.scard('vmpooler__migration')
980
+ migration_limit = @config[:config]['migration_limit'] if @config[:config].key?('migration_limit')
981
+ if migration_enabled? @config
982
+ if migration_count >= migration_limit
983
+ logger.log('s', "[ ] [#{pool_name}] '#{vm_name}' is running on #{vm_hash['host_name']}. No migration will be evaluated since the migration_limit has been reached")
984
+ break
985
+ end
986
+ run_select_hosts(pool_name, @provider_hosts)
987
+ if vm_in_target?(pool_name, vm_hash['host_name'], vm_hash['architecture'], @provider_hosts)
988
+ logger.log('s', "[ ] [#{pool_name}] No migration required for '#{vm_name}' running on #{vm_hash['host_name']}")
989
+ else
990
+ migrate_vm_to_new_host(pool_name, vm_name, vm_hash, connection)
991
+ end
982
992
  else
983
- migrate_vm_to_new_host(pool_name, vm_name, vm_hash, connection)
993
+ logger.log('s', "[ ] [#{pool_name}] '#{vm_name}' is running on #{vm_hash['host_name']}")
984
994
  end
985
- else
986
- logger.log('s', "[ ] [#{pool_name}] '#{vm_name}' is running on #{vm_hash['host_name']}")
987
995
  end
988
996
  rescue StandardError
989
997
  logger.log('s', "[!] [#{pool_name}] '#{vm_name}' is running on #{vm_hash['host_name']}")
@@ -993,15 +1001,23 @@ module Vmpooler
993
1001
  end
994
1002
 
995
1003
  def migrate_vm_to_new_host(pool_name, vm_name, vm_hash, connection)
996
- $redis.sadd('vmpooler__migration', vm_name)
1004
+ @redis.with_metrics do |redis|
1005
+ redis.sadd('vmpooler__migration', vm_name)
1006
+ end
997
1007
  target_host_name = select_next_host(pool_name, @provider_hosts, vm_hash['architecture'])
998
1008
  target_host_object = find_host_by_dnsname(connection, target_host_name)
999
1009
  finish = migrate_vm_and_record_timing(pool_name, vm_name, vm_hash, target_host_object, target_host_name)
1000
- $redis.hset("vmpooler__vm__#{vm_name}", 'host', target_host_name)
1001
- $redis.hset("vmpooler__vm__#{vm_name}", 'migrated', true)
1010
+ @redis.with_metrics do |redis|
1011
+ redis.multi
1012
+ redis.hset("vmpooler__vm__#{vm_name}", 'host', target_host_name)
1013
+ redis.hset("vmpooler__vm__#{vm_name}", 'migrated', true)
1014
+ redis.exec
1015
+ end
1002
1016
  logger.log('s', "[>] [#{pool_name}] '#{vm_name}' migrated from #{vm_hash['host_name']} to #{target_host_name} in #{finish} seconds")
1003
1017
  ensure
1004
- $redis.srem('vmpooler__migration', vm_name)
1018
+ @redis.with_metrics do |redis|
1019
+ redis.srem('vmpooler__migration', vm_name)
1020
+ end
1005
1021
  end
1006
1022
 
1007
1023
  def migrate_vm_and_record_timing(pool_name, vm_name, vm_hash, target_host_object, dest_host_name)
@@ -1011,9 +1027,13 @@ module Vmpooler
1011
1027
  metrics.timing("migrate.#{pool_name}", finish)
1012
1028
  metrics.increment("migrate_from.#{vm_hash['host_name']}")
1013
1029
  metrics.increment("migrate_to.#{dest_host_name}")
1014
- checkout_to_migration = format('%<time>.2f', time: Time.now - Time.parse($redis.hget("vmpooler__vm__#{vm_name}", 'checkout')))
1015
- $redis.hset("vmpooler__vm__#{vm_name}", 'migration_time', finish)
1016
- $redis.hset("vmpooler__vm__#{vm_name}", 'checkout_to_migration', checkout_to_migration)
1030
+ @redis.with_metrics do |redis|
1031
+ checkout_to_migration = format('%<time>.2f', time: Time.now - Time.parse(redis.hget("vmpooler__vm__#{vm_name}", 'checkout')))
1032
+ redis.multi
1033
+ redis.hset("vmpooler__vm__#{vm_name}", 'migration_time', finish)
1034
+ redis.hset("vmpooler__vm__#{vm_name}", 'checkout_to_migration', checkout_to_migration)
1035
+ redis.exec
1036
+ end
1017
1037
  finish
1018
1038
  end
1019
1039
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Vmpooler
4
- VERSION = '0.12.0'
4
+ VERSION = '0.13.0'
5
5
  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.12.0
4
+ version: 0.13.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Puppet
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-05-28 00:00:00.000000000 Z
11
+ date: 2020-06-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pickup
@@ -150,6 +150,20 @@ dependencies:
150
150
  - - "~>"
151
151
  - !ruby/object:Gem::Version
152
152
  version: '2.2'
153
+ - !ruby/object:Gem::Dependency
154
+ name: concurrent-ruby
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: '1.1'
160
+ type: :runtime
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: '1.1'
153
167
  - !ruby/object:Gem::Dependency
154
168
  name: nokogiri
155
169
  requirement: !ruby/object:Gem::Requirement