From ee9605fc4d6a6b175b2d994feb81f9ce78c67d40 Mon Sep 17 00:00:00 2001 From: Anton Chuchkalov Date: Wed, 20 Jan 2016 01:43:34 +0300 Subject: [PATCH] introduced ExpirationScheduler --- .../lib/executors/expiration_scheduler.rb | 35 ++++++++++++++ .../lib/executors/server_executor.rb | 33 +++---------- .../executors/expiration_scheduler_spec.rb | 47 +++++++++++++++++++ .../spec/executors/server_executor_spec.rb | 2 +- .../workers/delete_server_worker.rb | 1 + 5 files changed, 90 insertions(+), 28 deletions(-) create mode 100644 devops-service/lib/executors/expiration_scheduler.rb create mode 100644 devops-service/spec/executors/expiration_scheduler_spec.rb diff --git a/devops-service/lib/executors/expiration_scheduler.rb b/devops-service/lib/executors/expiration_scheduler.rb new file mode 100644 index 0000000..5eee52f --- /dev/null +++ b/devops-service/lib/executors/expiration_scheduler.rb @@ -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 \ No newline at end of file diff --git a/devops-service/lib/executors/server_executor.rb b/devops-service/lib/executors/server_executor.rb index ef0b9c9..16b53da 100644 --- a/devops-service/lib/executors/server_executor.rb +++ b/devops-service/lib/executors/server_executor.rb @@ -1,6 +1,5 @@ require "lib/knife/knife_factory" -require "workers/worker" -require "workers/delete_server_worker" +require "lib/executors/expiration_scheduler" require "hooks" module Devops @@ -108,7 +107,7 @@ module Devops @out.flush DevopsLogger.logger.info "Server with parameters: #{@server.to_hash.inspect} is running" - schedule_expiration(@server) + schedule_expiration() unless options["without_bootstrap"] bootstrap_options = { @@ -491,30 +490,10 @@ module Devops private - def schedule_expiration(server) - expires = @deploy_env.expires - return unless expires - interval = interval_in_seconds(expires) - @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' + def schedule_expiration + if @deploy_env.expires + @out << "Planning expiration in #{@deploy_env.expires}" + ExpirationScheduler.new(@deploy_env.expires, @server).schedule_expiration! end end diff --git a/devops-service/spec/executors/expiration_scheduler_spec.rb b/devops-service/spec/executors/expiration_scheduler_spec.rb new file mode 100644 index 0000000..6964e5d --- /dev/null +++ b/devops-service/spec/executors/expiration_scheduler_spec.rb @@ -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 \ No newline at end of file diff --git a/devops-service/spec/executors/server_executor_spec.rb b/devops-service/spec/executors/server_executor_spec.rb index f3e8ff1..6e8db02 100644 --- a/devops-service/spec/executors/server_executor_spec.rb +++ b/devops-service/spec/executors/server_executor_spec.rb @@ -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(:json_file_name) { 'json.json' } let(:json_file_path) { File.join(SpecSupport.tmp_dir, json_file_name) } diff --git a/devops-service/workers/delete_server_worker.rb b/devops-service/workers/delete_server_worker.rb index c8fe476..c4e02eb 100644 --- a/devops-service/workers/delete_server_worker.rb +++ b/devops-service/workers/delete_server_worker.rb @@ -1,6 +1,7 @@ require "db/mongo/models/server" require "db/mongo/models/report" require "lib/executors/server_executor" +require "workers/worker" class DeleteServerWorker < Worker