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|
|
options do |parser, options|
|
||||||
parser.banner << self.create_banner
|
parser.banner << self.create_banner
|
||||||
|
|
||||||
parser.recognize_option_value('without-bootstrap', 'server',
|
parser.recognize_option_value('without_bootstrap', 'server',
|
||||||
type: :switch,
|
type: :switch,
|
||||||
switch_value: true,
|
switch_value: true,
|
||||||
option_key: :without_bootstrap,
|
option_key: :without_bootstrap,
|
||||||
|
|||||||
@ -13,7 +13,7 @@ gem "chef", ">=12"
|
|||||||
gem "mongo"
|
gem "mongo"
|
||||||
gem "bson_ext"
|
gem "bson_ext"
|
||||||
gem "multi_json", "1.7.8"
|
gem "multi_json", "1.7.8"
|
||||||
gem "rufus-scheduler", "2.0.24"
|
# gem "rufus-scheduler", "2.0.24"
|
||||||
gem "sidekiq", "3.2.6"
|
gem "sidekiq", "3.2.6"
|
||||||
gem 'wisper'
|
gem 'wisper'
|
||||||
gem 'rake', '10.2.0'
|
gem 'rake', '10.2.0'
|
||||||
|
|||||||
@ -244,8 +244,6 @@ GEM
|
|||||||
rspec_junit_formatter (0.2.3)
|
rspec_junit_formatter (0.2.3)
|
||||||
builder (< 4)
|
builder (< 4)
|
||||||
rspec-core (>= 2, < 4, != 2.12.0)
|
rspec-core (>= 2, < 4, != 2.12.0)
|
||||||
rufus-scheduler (2.0.24)
|
|
||||||
tzinfo (>= 0.3.22)
|
|
||||||
serverspec (2.19.0)
|
serverspec (2.19.0)
|
||||||
multi_json
|
multi_json
|
||||||
rspec (~> 3.0)
|
rspec (~> 3.0)
|
||||||
@ -283,11 +281,8 @@ GEM
|
|||||||
daemons (>= 1.0.9)
|
daemons (>= 1.0.9)
|
||||||
eventmachine (>= 0.12.6)
|
eventmachine (>= 0.12.6)
|
||||||
rack (>= 1.0.0)
|
rack (>= 1.0.0)
|
||||||
thread_safe (0.3.5)
|
|
||||||
tilt (1.4.1)
|
tilt (1.4.1)
|
||||||
timers (1.1.0)
|
timers (1.1.0)
|
||||||
tzinfo (1.2.2)
|
|
||||||
thread_safe (~> 0.1)
|
|
||||||
uber (0.0.13)
|
uber (0.0.13)
|
||||||
uuidtools (2.1.5)
|
uuidtools (2.1.5)
|
||||||
wisper (1.6.0)
|
wisper (1.6.0)
|
||||||
@ -311,7 +306,6 @@ DEPENDENCIES
|
|||||||
rack (= 1.5.2)
|
rack (= 1.5.2)
|
||||||
rack-accept-media-types
|
rack-accept-media-types
|
||||||
rake (= 10.2.0)
|
rake (= 10.2.0)
|
||||||
rufus-scheduler (= 2.0.24)
|
|
||||||
sidekiq (= 3.2.6)
|
sidekiq (= 3.2.6)
|
||||||
sinatra (= 1.4.5)
|
sinatra (= 1.4.5)
|
||||||
sinatra-contrib
|
sinatra-contrib
|
||||||
@ -319,3 +313,6 @@ DEPENDENCIES
|
|||||||
test-unit
|
test-unit
|
||||||
thin (~> 1.5.1)
|
thin (~> 1.5.1)
|
||||||
wisper
|
wisper
|
||||||
|
|
||||||
|
BUNDLED WITH
|
||||||
|
1.10.5
|
||||||
|
|||||||
@ -1,4 +1,3 @@
|
|||||||
require "lib/expire_handler"
|
|
||||||
module Devops
|
module Devops
|
||||||
class DevopsApi2Application < Application
|
class DevopsApi2Application < Application
|
||||||
|
|
||||||
@ -49,7 +48,6 @@ module Devops
|
|||||||
mongo.key_insert k
|
mongo.key_insert k
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
ExpireHandler.init
|
|
||||||
|
|
||||||
Stubber.stub_providers!(config[:stub_providers])
|
Stubber.stub_providers!(config[:stub_providers])
|
||||||
end
|
end
|
||||||
|
|||||||
@ -9,6 +9,7 @@ module Devops
|
|||||||
BOOTSTRAP_TYPE = 3
|
BOOTSTRAP_TYPE = 3
|
||||||
PROJECT_TEST_TYPE = 4
|
PROJECT_TEST_TYPE = 4
|
||||||
STACK_TYPE = 5
|
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
|
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 "lib/knife/knife_factory"
|
||||||
|
require "workers/worker"
|
||||||
|
require "workers/delete_server_worker"
|
||||||
require "hooks"
|
require "hooks"
|
||||||
|
|
||||||
module Devops
|
module Devops
|
||||||
@ -73,6 +75,9 @@ module Devops
|
|||||||
@out << "Done\n"
|
@out << "Done\n"
|
||||||
@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)
|
||||||
|
|
||||||
unless options["without_bootstrap"]
|
unless options["without_bootstrap"]
|
||||||
bootstrap_options = {
|
bootstrap_options = {
|
||||||
bootstrap_template: i.bootstrap_template
|
bootstrap_template: i.bootstrap_template
|
||||||
@ -388,6 +393,33 @@ module Devops
|
|||||||
120
|
120
|
||||||
end
|
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
|
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