From dec95ba693fbe510225d3eee5008512562396753 Mon Sep 17 00:00:00 2001 From: Colin Date: Wed, 13 May 2015 10:54:25 -0700 Subject: [PATCH] (QENG-2360) check_running_vm Spec Tests Add spec tests for pool_manager#check_running_vm. In the process of writing these tests, the method was broken in to smaller methods for testability reasons. --- lib/vmpooler/pool_manager.rb | 37 +++++++++-------- spec/vmpooler/pool_manager_spec.rb | 65 ++++++++++++++++++++++++++++++ 2 files changed, 85 insertions(+), 17 deletions(-) diff --git a/lib/vmpooler/pool_manager.rb b/lib/vmpooler/pool_manager.rb index f9d778f..7cb702b 100644 --- a/lib/vmpooler/pool_manager.rb +++ b/lib/vmpooler/pool_manager.rb @@ -132,31 +132,34 @@ module Vmpooler def check_running_vm(vm, pool, ttl) Thread.new do - host = $vsphere[pool].find_vm(vm) + _check_running_vm(vm, pool, ttl) + end + end - if host - if - (host.runtime) && + def _check_running_vm(vm, pool, ttl) + host = $vsphere[pool].find_vm(vm) + + if host + queue_from, queue_to = 'running', 'completed' + + if (host.runtime) && (host.runtime.powerState != 'poweredOn') - - $redis.smove('vmpooler__running__' + pool, 'vmpooler__completed__' + pool, vm) - - $logger.log('d', "[!] [#{pool}] '#{vm}' appears to be powered off or dead") - else - if - (host.runtime) && + move_vm_queue(pool, vm, queue_from, queue_to, 'appears to be powered off or dead') + else + if (host.runtime) && (host.runtime.bootTime) - ((((Time.now - host.runtime.bootTime) / 60).to_s[/^\d+\.\d{1}/].to_f) > ttl) - - $redis.smove('vmpooler__running__' + pool, 'vmpooler__completed__' + pool, vm) - - $logger.log('d', "[!] [#{pool}] '#{vm}' reached end of TTL after #{ttl} minutes") - end + ((((Time.now - host.runtime.bootTime) / 60).to_s[/^\d+\.\d{1}/].to_f) > ttl) + move_vm_queue(pool, vm, queue_from, queue_to, "reached end of TTL after #{ttl} minutes") end end end end + def move_vm_queue(pool, vm, queue_from, queue_to, msg) + $redis.smove("vmpooler__#{queue_from}__#{pool}", "vmpooler__#{queue_to}__#{pool}", vm) + $logger.log('d', "[!] [#{pool}] '#{vm}' #{msg}") + end + # Clone a VM def clone_vm(template, folder, datastore, target) Thread.new do diff --git a/spec/vmpooler/pool_manager_spec.rb b/spec/vmpooler/pool_manager_spec.rb index 78fbdbc..d94d3b3 100644 --- a/spec/vmpooler/pool_manager_spec.rb +++ b/spec/vmpooler/pool_manager_spec.rb @@ -1,4 +1,5 @@ require 'spec_helper' +require 'time' describe 'Pool Manager' do let(:logger) { double('logger') } @@ -145,5 +146,69 @@ describe 'Pool Manager' do end end + describe '#_check_running_vm' do + let(:pool_helper) { double('pool') } + let(:vsphere) { {pool => pool_helper} } + + before do + expect(subject).not_to be_nil + $vsphere = vsphere + end + + 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) + end + + context 'valid host' do + let(:vm_host) { double('vmhost') } + + it 'moves vm when not poweredOn' do + allow(pool_helper).to receive(:find_vm).and_return vm_host + allow(vm_host).to receive(:runtime).and_return true + allow(vm_host).to receive_message_chain(:runtime, :powerState).and_return 'poweredOff' + + expect(redis).to receive(:smove) + expect(logger).to receive(:log).with('d', "[!] [#{pool}] '#{vm}' appears to be powered off or dead") + + subject._check_running_vm(vm, pool, timeout) + end + + it 'moves vm when poweredOn, but past TTL' do + allow(pool_helper).to receive(:find_vm).and_return vm_host + allow(vm_host).to receive(:runtime).and_return true + allow(vm_host).to receive_message_chain(:runtime, :powerState).and_return 'poweredOn' + allow(vm_host).to receive_message_chain(:runtime, :bootTime).and_return Time.parse('2005-01-01') + + expect(redis).to receive(:smove) + expect(logger).to receive(:log).with('d', "[!] [#{pool}] '#{vm}' reached end of TTL after #{timeout} minutes") + + subject._check_running_vm(vm, pool, timeout) + end + + end + + end + + describe '#move_running_to_completed' do + before do + expect(subject).not_to be_nil + end + + it 'uses the pool in smove' do + allow(redis).to receive(:smove).with(String, String, String) + allow(logger).to receive(:log) + expect(redis).to receive(:smove).with('vmpooler__running__p1', 'vmpooler__completed__p1', 'vm1') + subject.move_vm_queue('p1', 'vm1', 'running', 'completed', 'msg') + end + + it 'logs msg' do + allow(redis).to receive(:smove) + allow(logger).to receive(:log) + expect(logger).to receive(:log).with('d', "[!] [p1] 'vm1' a msg here") + subject.move_vm_queue('p1', 'vm1', 'running', 'completed', 'a msg here') + end + end end