diff --git a/lib/vmpooler/pool_manager.rb b/lib/vmpooler/pool_manager.rb index 1a0454c..4d69bb1 100644 --- a/lib/vmpooler/pool_manager.rb +++ b/lib/vmpooler/pool_manager.rb @@ -22,12 +22,6 @@ module Vmpooler # Check the state of a VM def check_pending_vm(vm, pool, timeout) - Thread.new do - _check_pending_vm(vm, pool, timeout) - end - end - - def _check_pending_vm(vm, pool, timeout) host = $vsphere[pool].find_vm(vm) if host @@ -78,72 +72,61 @@ module Vmpooler end def check_ready_vm(vm, pool, ttl) - Thread.new do - if ttl > 0 - if (((Time.now - host.runtime.bootTime) / 60).to_s[/^\d+\.\d{1}/].to_f) > ttl - $redis.smove('vmpooler__ready__' + pool, 'vmpooler__completed__' + pool, vm) + if ttl > 0 + if (((Time.now - host.runtime.bootTime) / 60).to_s[/^\d+\.\d{1}/].to_f) > ttl + $redis.smove('vmpooler__ready__' + pool, 'vmpooler__completed__' + pool, vm) - $logger.log('d', "[!] [#{pool}] '#{vm}' reached end of TTL after #{ttl} minutes, removed from 'ready' queue") - end + $logger.log('d', "[!] [#{pool}] '#{vm}' reached end of TTL after #{ttl} minutes, removed from 'ready' queue") end + end - check_stamp = $redis.hget('vmpooler__vm__' + vm, 'check') + check_stamp = $redis.hget('vmpooler__vm__' + vm, 'check') - if - (!check_stamp) || + if (!check_stamp) || (((Time.now - Time.parse(check_stamp)) / 60) > $config[:config]['vm_checktime']) - $redis.hset('vmpooler__vm__' + vm, 'check', Time.now) + $redis.hset('vmpooler__vm__' + vm, 'check', Time.now) - host = $vsphere[pool].find_vm(vm) || - $vsphere[pool].find_vm_heavy(vm)[vm] + host = $vsphere[pool].find_vm(vm) || + $vsphere[pool].find_vm_heavy(vm)[vm] - if host - if - (host.runtime) && + if host + if (host.runtime) && (host.runtime.powerState) && (host.runtime.powerState != 'poweredOn') - $redis.smove('vmpooler__ready__' + pool, 'vmpooler__completed__' + pool, vm) + $redis.smove('vmpooler__ready__' + pool, 'vmpooler__completed__' + pool, vm) - $logger.log('d', "[!] [#{pool}] '#{vm}' appears to be powered off, removed from 'ready' queue") - end + $logger.log('d', "[!] [#{pool}] '#{vm}' appears to be powered off, removed from 'ready' queue") + end - if - (host.summary.guest) && + if (host.summary.guest) && (host.summary.guest.hostName) && (host.summary.guest.hostName != vm) - $redis.smove('vmpooler__ready__' + pool, 'vmpooler__completed__' + pool, vm) + $redis.smove('vmpooler__ready__' + pool, 'vmpooler__completed__' + pool, vm) - $logger.log('d', "[!] [#{pool}] '#{vm}' has mismatched hostname, removed from 'ready' queue") - end - else - $redis.srem('vmpooler__ready__' + pool, vm) - - $logger.log('s', "[!] [#{pool}] '#{vm}' not found in vCenter inventory, removed from 'ready' queue") + $logger.log('d', "[!] [#{pool}] '#{vm}' has mismatched hostname, removed from 'ready' queue") end + else + $redis.srem('vmpooler__ready__' + pool, vm) - begin - Timeout.timeout(5) do - TCPSocket.new vm, 22 - end - rescue - if $redis.smove('vmpooler__ready__' + pool, 'vmpooler__completed__' + pool, vm) - $logger.log('d', "[!] [#{pool}] '#{vm}' is unreachable, removed from 'ready' queue") - end + $logger.log('s', "[!] [#{pool}] '#{vm}' not found in vCenter inventory, removed from 'ready' queue") + end + + begin + Timeout.timeout(5) do + TCPSocket.new vm, 22 + end + rescue + if $redis.smove('vmpooler__ready__' + pool, 'vmpooler__completed__' + pool, vm) + $logger.log('d', "[!] [#{pool}] '#{vm}' is unreachable, removed from 'ready' queue") end end end end def check_running_vm(vm, pool, ttl) - Thread.new do - _check_running_vm(vm, pool, ttl) - end - end - - def _check_running_vm(vm, pool, ttl) host = $vsphere[pool].find_vm(vm) if host diff --git a/spec/vmpooler/pool_manager_spec.rb b/spec/vmpooler/pool_manager_spec.rb index a402bf4..ecbd245 100644 --- a/spec/vmpooler/pool_manager_spec.rb +++ b/spec/vmpooler/pool_manager_spec.rb @@ -13,7 +13,7 @@ describe 'Pool Manager' do subject { Vmpooler::PoolManager.new(config, logger, redis, graphite) } - describe '#_check_pending_vm' do + describe '#check_pending_vm' do let(:pool_helper) { double('pool') } let(:vsphere) { {pool => pool_helper} } @@ -28,7 +28,7 @@ describe 'Pool Manager' do allow(pool_helper).to receive(:find_vm).and_return(nil) allow(redis).to receive(:hget) expect(redis).to receive(:hget).with(String, 'clone').once - subject._check_pending_vm(vm, pool, timeout) + subject.check_pending_vm(vm, pool, timeout) end end @@ -47,7 +47,7 @@ describe 'Pool Manager' do expect(vm_finder).to receive(:summary).once expect(redis).not_to receive(:hget).with(String, 'clone') - subject._check_pending_vm(vm, pool, timeout) + subject.check_pending_vm(vm, pool, timeout) end end end @@ -150,7 +150,7 @@ describe 'Pool Manager' do end end - describe '#_check_running_vm' do + describe '#check_running_vm' do let(:pool_helper) { double('pool') } let(:vsphere) { {pool => pool_helper} } @@ -162,7 +162,7 @@ describe 'Pool Manager' do it 'does nothing with nil host' do allow(pool_helper).to receive(:find_vm).and_return(nil) expect(redis).not_to receive(:smove) - subject._check_running_vm(vm, pool, timeout) + subject.check_running_vm(vm, pool, timeout) end context 'valid host' do @@ -177,7 +177,7 @@ describe 'Pool Manager' do expect(redis).not_to receive(:smove) expect(logger).not_to receive(:log).with('d', "[!] [#{pool}] '#{vm}' appears to be powered off or dead") - subject._check_running_vm(vm, pool, timeout) + subject.check_running_vm(vm, pool, timeout) end it 'moves vm when poweredOn, but past TTL' do @@ -189,7 +189,7 @@ describe 'Pool Manager' do expect(redis).to receive(:smove) expect(logger).to receive(:log).with('d', "[!] [#{pool}] '#{vm}' reached end of TTL after #{timeout} hours") - subject._check_running_vm(vm, pool, timeout) + subject.check_running_vm(vm, pool, timeout) end end