scheduling expiration handlers in sidekiq

This commit is contained in:
Anton Chuchkalov 2015-09-15 19:54:43 +03:00
parent 844c11ae3f
commit 9c21fc0fe4
8 changed files with 72 additions and 53 deletions

View File

@ -103,7 +103,7 @@ class ServerOptions < CommonOptions
options do |parser, options|
parser.banner << self.create_banner
parser.recognize_option_value('without-bootstrap', 'server',
parser.recognize_option_value('without_bootstrap', 'server',
type: :switch,
switch_value: true,
option_key: :without_bootstrap,

View File

@ -13,7 +13,7 @@ gem "chef", ">=12"
gem "mongo"
gem "bson_ext"
gem "multi_json", "1.7.8"
gem "rufus-scheduler", "2.0.24"
# gem "rufus-scheduler", "2.0.24"
gem "sidekiq", "3.2.6"
gem 'wisper'
gem 'rake', '10.2.0'

View File

@ -244,8 +244,6 @@ GEM
rspec_junit_formatter (0.2.3)
builder (< 4)
rspec-core (>= 2, < 4, != 2.12.0)
rufus-scheduler (2.0.24)
tzinfo (>= 0.3.22)
serverspec (2.19.0)
multi_json
rspec (~> 3.0)
@ -283,11 +281,8 @@ GEM
daemons (>= 1.0.9)
eventmachine (>= 0.12.6)
rack (>= 1.0.0)
thread_safe (0.3.5)
tilt (1.4.1)
timers (1.1.0)
tzinfo (1.2.2)
thread_safe (~> 0.1)
uber (0.0.13)
uuidtools (2.1.5)
wisper (1.6.0)
@ -311,7 +306,6 @@ DEPENDENCIES
rack (= 1.5.2)
rack-accept-media-types
rake (= 10.2.0)
rufus-scheduler (= 2.0.24)
sidekiq (= 3.2.6)
sinatra (= 1.4.5)
sinatra-contrib
@ -319,3 +313,6 @@ DEPENDENCIES
test-unit
thin (~> 1.5.1)
wisper
BUNDLED WITH
1.10.5

View File

@ -1,4 +1,3 @@
require "lib/expire_handler"
module Devops
class DevopsApi2Application < Application
@ -49,7 +48,6 @@ module Devops
mongo.key_insert k
end
end
ExpireHandler.init
Stubber.stub_providers!(config[:stub_providers])
end

View File

@ -9,6 +9,7 @@ module Devops
BOOTSTRAP_TYPE = 3
PROJECT_TEST_TYPE = 4
STACK_TYPE = 5
DELETE_SERVER_TYPE = 6
attr_accessor :id, :file, :created_at, :updated_at, :created_by, :project, :deploy_env, :type, :chef_node_name, :host, :status

View File

@ -1,4 +1,6 @@
require "lib/knife/knife_factory"
require "workers/worker"
require "workers/delete_server_worker"
require "hooks"
module Devops
@ -73,6 +75,9 @@ module Devops
@out << "Done\n"
@out.flush
DevopsLogger.logger.info "Server with parameters: #{@server.to_hash.inspect} is running"
schedule_expiration(@server)
unless options["without_bootstrap"]
bootstrap_options = {
bootstrap_template: i.bootstrap_template
@ -388,6 +393,33 @@ module Devops
120
end
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'
end
end
end
end
end

View File

@ -1,43 +0,0 @@
require 'rufus-scheduler'
class ExpireHandler
@@scheduler = Rufus::Scheduler.start_new
def self.add server
unless server.expires_at.nil?
if server.expires_at < Time.now.to_i
ExpireHandler.do_it server
else
time = Time.at(server.expires_at)
@@scheduler.at time, ExpireHandler.new(server, chef_env)
DevopsLogger.logger "Server '#{server.chef_node_name}' will be expired at '#{time}'"
end
end
end
def self.init
Devops::Db.connector.servers_find({"expires_at" => {"$ne" => nil}}, nil).each do |s|
ExpireHandler.add s
end
end
def initialize server
@server = server
end
def call(job)
ExpireHandler.do_it @server
end
def self.do_it server
logger = DevopsLogger.logger
logger.info("Removing node '#{server.chef_node_name}' form project '#{server.project}' and env '#{server.deploy_env}'")
begin
delete_server(server, DevopsService.mongo, logger)
rescue => e
logger.error "ExpiredHandler error: " + e.message
end
end
end

View File

@ -0,0 +1,34 @@
require "db/mongo/models/server"
require "db/mongo/models/report"
require "lib/executors/server_executor"
class DeleteServerWorker < Worker
def perform(options)
chef_node_name = options.fetch('server_chef_node_name')
puts "Expire server '#{chef_node_name}'."
call(nil) do |not_used, out, file|
server = mongo.server_by_chef_node_name(chef_node_name)
save_report(file, server)
e = Devops::Executor::ServerExecutor.new(server, out)
e.delete_server
end
end
private
def save_report(file, server)
report = Devops::Model::Report.new(
"file" => file,
"_id" => jid,
"created_by" => 'SYSTEM',
"project" => server.project,
"deploy_env" => server.deploy_env,
"type" => Devops::Model::Report::DELETE_SERVER_TYPE
)
mongo.save_report(report)
end
end