scheduling expiration handlers in sidekiq
This commit is contained in:
parent
844c11ae3f
commit
9c21fc0fe4
@ -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,
|
||||
|
||||
@ -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'
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
34
devops-service/workers/delete_server_worker.rb
Normal file
34
devops-service/workers/delete_server_worker.rb
Normal 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
|
||||
Loading…
Reference in New Issue
Block a user