2014-10-22 15:01:55 +04:00
|
|
|
root = File.join(File.dirname(__FILE__), "..")
|
|
|
|
|
$LOAD_PATH.push root unless $LOAD_PATH.include? root
|
|
|
|
|
|
|
|
|
|
require "sidekiq"
|
|
|
|
|
require "sidekiq/api"
|
|
|
|
|
|
2014-12-04 13:07:25 +03:00
|
|
|
require "fileutils"
|
|
|
|
|
|
2015-08-19 19:37:58 +03:00
|
|
|
require "core/devops-service"
|
2015-07-30 15:37:43 +03:00
|
|
|
require "core/devops-config"
|
|
|
|
|
require "core/devops-logger"
|
|
|
|
|
require "core/devops-db"
|
2014-12-04 13:07:25 +03:00
|
|
|
require "providers/provider_factory"
|
2015-08-12 11:37:17 +03:00
|
|
|
require "lib/knife/knife_factory"
|
2014-10-22 15:01:55 +04:00
|
|
|
|
|
|
|
|
class Worker
|
|
|
|
|
include Sidekiq::Worker
|
|
|
|
|
|
2015-09-11 12:05:13 +03:00
|
|
|
attr_accessor :out
|
|
|
|
|
|
2014-12-04 13:07:25 +03:00
|
|
|
module STATUS
|
|
|
|
|
INIT = "init"
|
|
|
|
|
RUNNING = "running"
|
|
|
|
|
COMPLETED = "completed"
|
|
|
|
|
FAILED = "failed"
|
2015-06-02 12:49:39 +03:00
|
|
|
IN_QUEUE = "queued"
|
2014-12-04 13:07:25 +03:00
|
|
|
end
|
|
|
|
|
|
2015-09-01 16:31:31 +03:00
|
|
|
def self.start_async(worker_class, request, job_options)
|
|
|
|
|
jid = worker_class.perform_async(job_options.dup)
|
|
|
|
|
Worker.set_status jid, Worker::STATUS::IN_QUEUE
|
2015-09-01 16:54:21 +03:00
|
|
|
DevopsLogger.logger.info "Job '#{jid}' has been queued"
|
2014-10-22 15:01:55 +04:00
|
|
|
|
2015-09-01 16:31:31 +03:00
|
|
|
uri = URI.parse(request.url)
|
|
|
|
|
uri.path = "#{DevopsConfig[:url_prefix]}/v2.0/report/#{jid}"
|
|
|
|
|
uri.to_s
|
2014-10-22 15:01:55 +04:00
|
|
|
end
|
|
|
|
|
|
2015-09-11 12:05:13 +03:00
|
|
|
def self.start_sync(worker_class, request, job_options, out)
|
2015-09-02 12:50:24 +03:00
|
|
|
stringified_options = {}
|
|
|
|
|
job_options.each do |key, value|
|
|
|
|
|
stringified_options[key.to_s] = value
|
|
|
|
|
end
|
2015-09-11 12:05:13 +03:00
|
|
|
w = worker_class.new
|
|
|
|
|
w.out = out
|
|
|
|
|
w.perform(stringified_options)
|
2015-09-02 12:50:24 +03:00
|
|
|
end
|
|
|
|
|
|
2015-06-02 12:49:39 +03:00
|
|
|
def self.set_status id, status
|
|
|
|
|
Sidekiq.redis {|con| con.hset "devops", id, status}
|
|
|
|
|
end
|
|
|
|
|
|
2015-09-01 16:31:31 +03:00
|
|
|
def call provider_name, &block
|
2014-12-04 13:07:25 +03:00
|
|
|
begin
|
2015-09-01 16:31:31 +03:00
|
|
|
initialize_devops(provider_name)
|
|
|
|
|
provider = ::Provider::ProviderFactory.get(provider_name) if provider_name
|
|
|
|
|
if jid
|
|
|
|
|
call_async(provider, &block)
|
|
|
|
|
else
|
|
|
|
|
call_sync(provider, &block)
|
2014-12-04 13:07:25 +03:00
|
|
|
end
|
2015-09-01 16:31:31 +03:00
|
|
|
rescue StandardError => e
|
2015-11-02 13:09:53 +03:00
|
|
|
DevopsLogger.logger.error "#{e.message}:\n#{e.backtrace.join("\n")}"
|
2014-12-04 13:07:25 +03:00
|
|
|
end
|
2015-09-01 16:31:31 +03:00
|
|
|
end
|
|
|
|
|
|
|
|
|
|
private
|
|
|
|
|
|
|
|
|
|
def initialize_devops(provider_name)
|
|
|
|
|
DevopsLogger.logger = logger
|
|
|
|
|
DevopsConfig.read
|
|
|
|
|
DevopsService.init
|
|
|
|
|
::Provider::ProviderFactory.init(DevopsConfig.config)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
# outputs to file
|
|
|
|
|
def call_async(provider)
|
|
|
|
|
dir = DevopsConfig[:report_dir_v2]
|
|
|
|
|
# directory is created on server start in config.ru
|
|
|
|
|
file = File.join(dir, jid)
|
|
|
|
|
|
|
|
|
|
update_job_status(STATUS::INIT)
|
2014-12-04 13:07:25 +03:00
|
|
|
File.open(file, "w") do |out|
|
|
|
|
|
begin
|
2015-09-01 16:31:31 +03:00
|
|
|
update_job_status(STATUS::RUNNING)
|
2015-09-11 12:05:13 +03:00
|
|
|
self.out = out
|
2015-09-01 16:31:31 +03:00
|
|
|
|
2015-09-14 10:44:34 +03:00
|
|
|
job_result = yield(provider, out, file)
|
2015-09-01 16:31:31 +03:00
|
|
|
canonical_status = (job_result == 0 ? STATUS::COMPLETED : STATUS::FAILED)
|
|
|
|
|
update_job_status(canonical_status)
|
|
|
|
|
rescue StandardError, RecordNotFound => e
|
|
|
|
|
out << "\n #{e.class}\n #{e.message}\n"
|
2014-12-04 13:07:25 +03:00
|
|
|
out << e.backtrace.join("\n")
|
2015-09-01 16:31:31 +03:00
|
|
|
update_job_status(STATUS::FAILED)
|
2014-12-04 13:07:25 +03:00
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
2015-09-01 16:31:31 +03:00
|
|
|
# outputs to STDOUT
|
2015-09-02 12:50:24 +03:00
|
|
|
def call_sync(provider)
|
2015-09-01 16:31:31 +03:00
|
|
|
out = STDOUT
|
|
|
|
|
begin
|
|
|
|
|
yield(provider, out, '')
|
|
|
|
|
rescue StandardError, RecordNotFound => e
|
|
|
|
|
out << "\n"
|
|
|
|
|
out << e.message
|
|
|
|
|
out << "\n"
|
|
|
|
|
out << e.backtrace.join("\n")
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def mongo
|
|
|
|
|
::Devops::Db.connector
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def update_job_status(status)
|
|
|
|
|
set_status(jid, status)
|
|
|
|
|
mongo.set_report_status(jid, status)
|
|
|
|
|
status
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def init_provider(provider_name)
|
|
|
|
|
::Provider::ProviderFactory.init(DevopsConfig.config)
|
|
|
|
|
::Provider::ProviderFactory.get(provider_name) if provider_name
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def convert_config conf
|
|
|
|
|
config = {}
|
|
|
|
|
conf.each {|k,v| config[k.is_a?(String) ? k.to_sym : k] = v}
|
|
|
|
|
config
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def set_status id, status
|
|
|
|
|
self.class.set_status(id, status)
|
|
|
|
|
end
|
|
|
|
|
|
2014-10-22 15:01:55 +04:00
|
|
|
end
|