Skip to content

Commit

Permalink
(QENG-1906) Add spec tests for Janitor
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
colinPL committed Mar 31, 2015
1 parent fd90756 commit d0275f5
Show file tree
Hide file tree
Showing 3 changed files with 87 additions and 10 deletions.
23 changes: 13 additions & 10 deletions lib/vmpooler/janitor.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
3 changes: 3 additions & 0 deletions spec/spec_helper.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
require 'rspec'
require 'vmpooler'
require 'rbvmomi'
71 changes: 71 additions & 0 deletions spec/vmpooler/janitor_spec.rb
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit d0275f5

Please sign in to comment.