provide convinient way to start jobs

This commit is contained in:
Anton Chuchkalov 2015-07-23 13:54:36 +04:00
parent 499d05ad32
commit 673c74aa3a
7 changed files with 95 additions and 22 deletions

View File

@ -0,0 +1,9 @@
module CommandsStorage
def self.add_job_lambda(job_with_lambda)
job_lambdas.merge!(job_with_lambda)
end
def self.job_lambdas
@job_lambdas ||= {}
end
end

View File

@ -1,9 +1,14 @@
require "commands/server"
require 'commands/commands_storage'
module StackCommands module StackCommands
include ServerCommands
extend self
def sync_stack_till_not_in_progress_proc def sync_stack_till_not_in_progress_proc
lambda do |out, stack, mongo| lambda do |out, stack, mongo|
# two tries each 5 seconds, then 5 tries each 10 seconds, then 5 tries each minute. # two tries each 2 seconds, then 5 tries each 10 seconds, then 5 tries each minute.
sleep_times = [5]*2 + [10]*5 + [60]*5 sleep_times = [2]*2 + [10]*5 + [60]*5
begin begin
out << "Syncing stack '#{stack.id}'...\n" out << "Syncing stack '#{stack.id}'...\n"
@ -24,4 +29,30 @@ module StackCommands
end end
end end
def create_devops_servers_from_stack_resources
lambda do |out, stack, mongo, owner|
project = mongo.project(stack.project)
deploy_env = project.deploy_envs.detect {|env| env.identifier == stack.deploy_env}
provider = ::Provider::ProviderFactory.get(stack.provider)
stack.resources.each do |resource|
logical_name = resource['resource_name']
attrs = stack.resource(logical_name)
body = {
'name' => logical_name,
'key' => attrs['key_name']
}
server = extract_servers(provider, project, deploy_env, body, owner, mongo)
server.private_ip = attrs['addresses']['devops-net-1'].first['addr']
end
end
end
CommandsStorage.add_job_lambda(
sync_stack_till_not_in_progress: sync_stack_till_not_in_progress_proc,
create_devops_servers_from_stack_resources: create_devops_servers_from_stack_resources
)
end end

View File

@ -59,6 +59,7 @@ module Devops
provider_class.stack_resources(self) provider_class.stack_resources(self)
end end
# resource_id is logical
def resource(resource_id) def resource(resource_id)
provider_class.stack_resource(self, resource_id) provider_class.stack_resource(self, resource_id)
end end

View File

@ -1,6 +1,7 @@
require 'json' require 'json'
require 'lib/stack_presets/factory' require 'lib/stack_presets/factory'
require 'workers/stack_sync_worker' require 'workers/stack_sync_worker'
require 'workers/job_starter'
module Devops module Devops
module Version2_0 module Version2_0
@ -31,19 +32,11 @@ module Devops
stack = preset.create_stack_from_preset(attrs) stack = preset.create_stack_from_preset(attrs)
settings.mongo.stack_insert(stack) settings.mongo.stack_insert(stack)
file = JobStarter.start_job(:worker, :sync_stack_till_not_in_progress,
jid = StackSyncWorker.perform_async( provider: stack.provider,
DevopsConfig[:report_dir_v2], stack_id: stack.id,
stack.provider, request: request
stack.id,
request.env['REMOTE_USER'], # owner
DevopsConfig.config
) )
Worker.set_status jid, Worker::STATUS::IN_QUEUE
logger.info "Job '#{jid}' has been started"
uri = URI.parse(request.url)
uri.path = "#{DevopsConfig[:url_prefix]}/v2.0/report/" + jid
file = uri.to_s
puts "Syncing report is located here: #{file}" puts "Syncing report is located here: #{file}"

View File

@ -0,0 +1,28 @@
require 'commands/commands_storage'
require 'workers/workers_storage'
module JobStarter
def self.start_job(strategy, job_name, job_options)
case strategy
when :worker
start_job_as_worker(WorkersStorage.workers[job_name], job_options)
end
end
def self.start_job_as_worker(worker_class, options)
job_options = options.dup
job_options[:owner] ||= options[:request].env['REMOTE_USER']
job_options[:config] ||= DevopsConfig.config
job_options[:dir] ||= DevopsConfig[:report_dir_v2]
job_options[:url] ||= options[:request].url
jid = worker_class.perform_async(job_options)
Worker.set_status jid, Worker::STATUS::IN_QUEUE
DevopsLogger.logger.info "Job '#{jid}' has been started"
uri = URI.parse(job_options[:url])
uri.path = "#{job_options[:config][:url_prefix]}/v2.0/report/#{jid}"
uri.to_s
end
end

View File

@ -1,22 +1,22 @@
#root = File.join(File.dirname(__FILE__), "..")
#$LOAD_PATH.push root unless $LOAD_PATH.include? root
# require File.join(File.dirname(__FILE__), "workers")
require "providers/provider_factory" require "providers/provider_factory"
require "commands/stack" require "commands/stack"
require "db/mongo/models/stack/stack_factory" require "db/mongo/models/stack/stack_factory"
require "db/mongo/models/report" require "db/mongo/models/report"
require 'workers/workers_storage'
class StackSyncWorker < Worker class StackSyncWorker < Worker
include StackCommands include StackCommands
def perform(dir, provider, stack_id, owner, conf) # besides options came from JobStarter we need:
call(conf, provider, dir) do |mongo, provider, out, file| # :provider
stack = mongo.stack(stack_id) # :stack_id
def perform(options)
call(options['config'], options['provider'], options['dir']) do |mongo, provider, out, file|
stack = mongo.stack(options['stack_id'])
o = { o = {
"file" => file, "file" => file,
"_id" => jid, "_id" => jid,
"created_by" => owner, "created_by" => options['owner'],
"project" => stack.project, "project" => stack.project,
"deploy_env" => stack.deploy_env, "deploy_env" => stack.deploy_env,
"type" => ::Devops::Model::Report::STACK_TYPE "type" => ::Devops::Model::Report::STACK_TYPE
@ -28,3 +28,5 @@ class StackSyncWorker < Worker
end end
end end
end end
WorkersStorage.add_worker(sync_stack_till_not_in_progress: StackSyncWorker)

View File

@ -0,0 +1,9 @@
module WorkersStorage
def self.add_worker(job_with_worker)
workers.merge!(job_with_worker)
end
def self.workers
@job_workers ||= {}
end
end