From d0275f5fba0b86879386108d28a2a700169a0d14 Mon Sep 17 00:00:00 2001 From: Colin Date: Mon, 30 Mar 2015 12:07:23 -0700 Subject: [PATCH] (QENG-1906) Add spec tests for Janitor Add spec tests to verify Janitor deletes stale vms correctly. This required a small refactor of Janitor to move the logic out of the for loop. --- lib/vmpooler/janitor.rb | 23 +++++++----- spec/spec_helper.rb | 3 ++ spec/vmpooler/janitor_spec.rb | 71 +++++++++++++++++++++++++++++++++++ 3 files changed, 87 insertions(+), 10 deletions(-) create mode 100644 spec/spec_helper.rb create mode 100644 spec/vmpooler/janitor_spec.rb diff --git a/lib/vmpooler/janitor.rb b/lib/vmpooler/janitor.rb index 075c477b5..f949de87e 100644 --- a/lib/vmpooler/janitor.rb +++ b/lib/vmpooler/janitor.rb @@ -12,21 +12,24 @@ def initialize(logger, redis, data_ttl) end def execute! - loop do - $redis.keys('vmpooler__vm__*').each do |key| - data = $redis.hgetall(key) + find_stale_vms + + sleep(600) + end + end + + def find_stale_vms + $redis.keys('vmpooler__vm__*').each do |key| + data = $redis.hgetall(key) - if data['destroy'] - lifetime = (Time.now - Time.parse(data['destroy'])) / 60 / 60 + if data['destroy'] + lifetime = (Time.now - Time.parse(data['destroy'])) / 60 / 60 - if lifetime > $data_ttl - $redis.del(key) - end + if lifetime > $data_ttl + $redis.del(key) end end - - sleep(600) end end end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb new file mode 100644 index 000000000..6493ba8a8 --- /dev/null +++ b/spec/spec_helper.rb @@ -0,0 +1,3 @@ +require 'rspec' +require 'vmpooler' +require 'rbvmomi' \ No newline at end of file diff --git a/spec/vmpooler/janitor_spec.rb b/spec/vmpooler/janitor_spec.rb new file mode 100644 index 000000000..b57e1c248 --- /dev/null +++ b/spec/vmpooler/janitor_spec.rb @@ -0,0 +1,71 @@ +require 'spec_helper' + +describe 'Janitor' do + let(:logger) { double('logger') } + let(:redis) { double('redis') } + let(:data_ttl) { 3 } # number of hours to retain + let(:old_destroy) { '2015-01-30 11:24:30 -0700' } + let(:fut_destroy) { '3015-01-30 11:24:30 -0700' } + + subject { Vmpooler::Janitor.new(logger, redis, data_ttl) } + + before do + allow(redis).to receive(:hgetall).with('key1').and_return({'destroy' => old_destroy}) + allow(redis).to receive(:hgetall).with('key2').and_return({'destroy' => old_destroy}) + allow(redis).to receive(:hgetall).with('key3').and_return({'destroy' => Time.now.to_s}) + allow(redis).to receive(:hgetall).with('key4').and_return({'destroy' => Time.now.to_s}) + allow(redis).to receive(:hgetall).with('key5').and_return({'destroy' => fut_destroy}) + + allow(redis).to receive(:del) + end + + describe '#find_stale_vms' do + + context 'has stale vms' do + + it 'has one key' do + allow(redis).to receive(:keys) {['key1']} + + expect(redis).to receive(:del).with('key1').once + expect(redis).to receive(:hgetall).with('key1').once + expect(redis).not_to receive(:hgetall).with('key2') + + subject.find_stale_vms + end + + it 'has two keys' do + allow(redis).to receive(:keys) {(%w(key1 key2))} + + expect(redis).to receive(:hgetall).twice + expect(redis).to receive(:del).with('key1') + expect(redis).to receive(:del).with('key2') + + subject.find_stale_vms + end + + it 'has 5 keys and 2 stales' do + allow(redis).to receive(:keys) {(%w(key1 key2 key3 key4 key5))} + + + expect(redis).to receive(:hgetall).exactly(5).times + expect(redis).to receive(:del).with('key1') + expect(redis).to receive(:del).with('key2') + expect(redis).not_to receive(:del).with('key3') + expect(redis).not_to receive(:del).with('key4') + expect(redis).not_to receive(:del).with('key5') + + subject.find_stale_vms + end + end + + it 'does not have stale vms' do + allow(redis).to receive(:keys).and_return(['key1']) + allow(redis).to receive(:hgetall).with('key1') {{'destroy' => Time.now.to_s}} + allow(redis).to receive(:del).with('key1') + + expect(redis).not_to receive(:del).with('key1') + + subject.find_stale_vms + end + end +end \ No newline at end of file