introduced ExpirationScheduler

This commit is contained in:
Anton Chuchkalov 2016-01-20 01:43:34 +03:00
parent 2055d8bd36
commit ee9605fc4d
5 changed files with 90 additions and 28 deletions

View File

@ -0,0 +1,35 @@
require "workers/delete_server_worker"
module Devops
module Executor
class ExpirationScheduler
def initialize(expires, server)
@expires, @server = expires, server
end
def schedule_expiration!
return unless @expires
DeleteServerWorker.perform_in(interval_in_seconds, server_chef_node_name: @server.chef_node_name)
end
def interval_in_seconds
interval = @expires.to_i
measure_unit = @expires.chars.last
case measure_unit
when 's'
interval
when 'm'
interval * 60
when 'h'
interval * 60 * 60
when 'd'
interval * 60 * 60 * 24
when 'w'
interval * 60 * 60 * 24 * 7
else
raise 'Wrong interval format'
end
end
end
end
end

View File

@ -1,6 +1,5 @@
require "lib/knife/knife_factory" require "lib/knife/knife_factory"
require "workers/worker" require "lib/executors/expiration_scheduler"
require "workers/delete_server_worker"
require "hooks" require "hooks"
module Devops module Devops
@ -108,7 +107,7 @@ module Devops
@out.flush @out.flush
DevopsLogger.logger.info "Server with parameters: #{@server.to_hash.inspect} is running" DevopsLogger.logger.info "Server with parameters: #{@server.to_hash.inspect} is running"
schedule_expiration(@server) schedule_expiration()
unless options["without_bootstrap"] unless options["without_bootstrap"]
bootstrap_options = { bootstrap_options = {
@ -491,30 +490,10 @@ module Devops
private private
def schedule_expiration(server) def schedule_expiration
expires = @deploy_env.expires if @deploy_env.expires
return unless expires @out << "Planning expiration in #{@deploy_env.expires}"
interval = interval_in_seconds(expires) ExpirationScheduler.new(@deploy_env.expires, @server).schedule_expiration!
@out << "Planning expiration in #{expires}"
DeleteServerWorker.perform_in(interval, server_chef_node_name: server.chef_node_name)
end
def interval_in_seconds(interval_as_string)
interval = interval_as_string.to_i
measure_unit = interval_as_string.chars.last
case measure_unit
when 's'
interval
when 'm'
interval * 60
when 'h'
interval * 60 * 60
when 'd'
interval * 60 * 60 * 24
when 'w'
interval * 60 * 60 * 24 * 7
else
raise 'Wrong interval format'
end end
end end

View File

@ -0,0 +1,47 @@
require 'lib/executors/expiration_scheduler'
RSpec.describe Devops::Executor::ExpirationScheduler do
let(:server) { build(:server) }
describe '#schedule_expiration!' do
it 'schedules server deleting at given time' do
expect(DeleteServerWorker).to receive(:perform_in).with(120, server_chef_node_name: 'chef_node_name')
described_class.new('2m', server).schedule_expiration!
end
it "doesn't schedule job if expires is nil" do
expect(DeleteServerWorker).not_to receive(:perform_in)
described_class.new(nil, server).schedule_expiration!
end
end
describe '#interval_in_seconds' do
def interval_in_seconds(expires)
described_class.new(expires, server).interval_in_seconds
end
it 'recognizes seconds' do
expect(interval_in_seconds('2s')).to eq 2
end
it 'recognizes minutes' do
expect(interval_in_seconds('3m')).to eq 180
end
it 'recognizes hours' do
expect(interval_in_seconds('1h')).to eq 3600
end
it 'recognizes days' do
expect(interval_in_seconds('1d')).to eq 86400
end
it 'recognizes weeks' do
expect(interval_in_seconds('1w')).to eq 604800
end
it 'raises on wrong format' do
expect { interval_in_seconds('wrong') }.to raise_error(StandardError)
end
end
end

View File

@ -464,7 +464,7 @@ RSpec.describe Devops::Executor::ServerExecutor, type: :executor, stubbed_connec
describe '#deploy_server', stubbed_knife: true, stubbed_connector: true do describe '#deploy_server', stubbed_knife: true do
let(:deploy_info) { @deploy_info } let(:deploy_info) { @deploy_info }
let(:json_file_name) { 'json.json' } let(:json_file_name) { 'json.json' }
let(:json_file_path) { File.join(SpecSupport.tmp_dir, json_file_name) } let(:json_file_path) { File.join(SpecSupport.tmp_dir, json_file_name) }

View File

@ -1,6 +1,7 @@
require "db/mongo/models/server" require "db/mongo/models/server"
require "db/mongo/models/report" require "db/mongo/models/report"
require "lib/executors/server_executor" require "lib/executors/server_executor"
require "workers/worker"
class DeleteServerWorker < Worker class DeleteServerWorker < Worker