From d1c86eaf9b8fc1945213dad009db1172dffac7f2 Mon Sep 17 00:00:00 2001 From: Gene Liverman Date: Mon, 29 Nov 2021 16:09:15 -0500 Subject: [PATCH] Move vsphere provider to its own gem --- lib/vmpooler.rb | 1 - lib/vmpooler/pool_manager.rb | 8 +- lib/vmpooler/providers/vsphere.rb | 1172 --------- scripts/create_template_deltas.rb | 98 - spec/rbvmomi_helper.rb | 922 ------- spec/spec_helper.rb | 2 - spec/unit/pool_manager_spec.rb | 60 +- spec/unit/providers/vsphere_spec.rb | 3589 --------------------------- spec/unit/providers_spec.rb | 25 +- vmpooler.gemspec | 1 - 10 files changed, 21 insertions(+), 5857 deletions(-) delete mode 100644 lib/vmpooler/providers/vsphere.rb delete mode 100755 scripts/create_template_deltas.rb delete mode 100644 spec/rbvmomi_helper.rb delete mode 100644 spec/unit/providers/vsphere_spec.rb diff --git a/lib/vmpooler.rb b/lib/vmpooler.rb index 7d39f18..7bd7c22 100644 --- a/lib/vmpooler.rb +++ b/lib/vmpooler.rb @@ -7,7 +7,6 @@ module Vmpooler require 'net/ldap' require 'open-uri' require 'pickup' - require 'rbvmomi' require 'redis' require 'set' require 'sinatra/base' diff --git a/lib/vmpooler/pool_manager.rb b/lib/vmpooler/pool_manager.rb index 1c9551e..7c8c727 100644 --- a/lib/vmpooler/pool_manager.rb +++ b/lib/vmpooler/pool_manager.rb @@ -628,7 +628,7 @@ module Vmpooler end # @return [Array] - a list of used providers from the config file, defaults to the default providers - # ie. ["vsphere", "dummy"] + # ie. ["dummy"] def used_providers pools = config[:pools] || [] @used_providers ||= (pools.map { |pool| pool[:provider] || pool['provider'] }.compact + default_providers).uniq @@ -638,7 +638,7 @@ module Vmpooler # note: vsphere is the default if user does not specify although this should not be # if vsphere is to no longer be loaded by default please remove def default_providers - @default_providers ||= %w[vsphere dummy] + @default_providers ||= %w[dummy] end def get_pool_name_for_vm(vm_name, redis) @@ -1561,8 +1561,8 @@ module Vmpooler # Set default provider for all pools that do not have one defined $config[:pools].each do |pool| if pool['provider'].nil? - $logger.log('d', "[!] Setting provider for pool '#{pool['name']}' to 'vsphere' as default") - pool['provider'] = 'vsphere' + $logger.log('d', "[!] Setting provider for pool '#{pool['name']}' to 'dummy' as default") + pool['provider'] = 'dummy' end end diff --git a/lib/vmpooler/providers/vsphere.rb b/lib/vmpooler/providers/vsphere.rb deleted file mode 100644 index 1933f64..0000000 --- a/lib/vmpooler/providers/vsphere.rb +++ /dev/null @@ -1,1172 +0,0 @@ -# frozen_string_literal: true - -require 'vmpooler/providers/base' -require 'bigdecimal' -require 'bigdecimal/util' - -module Vmpooler - class PoolManager - class Provider - class VSphere < Vmpooler::PoolManager::Provider::Base - # The connection_pool method is normally used only for testing - attr_reader :connection_pool - - def initialize(config, logger, metrics, redis_connection_pool, name, options) - super(config, logger, metrics, redis_connection_pool, name, options) - - task_limit = global_config[:config].nil? || global_config[:config]['task_limit'].nil? ? 10 : global_config[:config]['task_limit'].to_i - # The default connection pool size is: - # Whatever is biggest from: - # - How many pools this provider services - # - Maximum number of cloning tasks allowed - # - Need at least 2 connections so that a pool can have inventory functions performed while cloning etc. - default_connpool_size = [provided_pools.count, task_limit, 2].max - connpool_size = provider_config['connection_pool_size'].nil? ? default_connpool_size : provider_config['connection_pool_size'].to_i - # The default connection pool timeout should be quite large - 60 seconds - connpool_timeout = provider_config['connection_pool_timeout'].nil? ? 60 : provider_config['connection_pool_timeout'].to_i - logger.log('d', "[#{name}] ConnPool - Creating a connection pool of size #{connpool_size} with timeout #{connpool_timeout}") - @connection_pool = Vmpooler::PoolManager::GenericConnectionPool.new( - metrics: metrics, - connpool_type: 'provider_connection_pool', - connpool_provider: name, - size: connpool_size, - timeout: connpool_timeout - ) do - logger.log('d', "[#{name}] Connection Pool - Creating a connection object") - # Need to wrap the vSphere connection object in another object. The generic connection pooler will preserve - # the object reference for the connection, which means it cannot "reconnect" by creating an entirely new connection - # object. Instead by wrapping it in a Hash, the Hash object reference itself never changes but the content of the - # Hash can change, and is preserved across invocations. - new_conn = connect_to_vsphere - { connection: new_conn } - end - @provider_hosts = {} - @provider_hosts_lock = Mutex.new - @redis = redis_connection_pool - end - - # name of the provider class - def name - 'vsphere' - end - - def folder_configured?(folder_title, base_folder, configured_folders, whitelist) - return true if whitelist&.include?(folder_title) - return false unless configured_folders.keys.include?(folder_title) - return false unless configured_folders[folder_title] == base_folder - - true - end - - def destroy_vm_and_log(vm_name, vm_object, pool, data_ttl) - try = 0 if try.nil? - max_tries = 3 - @redis.with_metrics do |redis| - redis.multi - redis.srem("vmpooler__completed__#{pool}", vm_name) - redis.hdel("vmpooler__active__#{pool}", vm_name) - redis.hset("vmpooler__vm__#{vm_name}", 'destroy', Time.now) - - # Auto-expire metadata key - redis.expire("vmpooler__vm__#{vm_name}", (data_ttl * 60 * 60)) - redis.exec - end - - start = Time.now - - if vm_object.is_a? RbVmomi::VIM::Folder - logger.log('s', "[!] [#{pool}] '#{vm_name}' is a folder, bailing on destroying") - raise('Expected VM, but received a folder object') - end - vm_object.PowerOffVM_Task.wait_for_completion if vm_object.runtime&.powerState && vm_object.runtime.powerState == 'poweredOn' - vm_object.Destroy_Task.wait_for_completion - - finish = format('%