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
include ServerCommands
extend self
def sync_stack_till_not_in_progress_proc
lambda do |out, stack, mongo|
# two tries each 5 seconds, then 5 tries each 10 seconds, then 5 tries each minute.
sleep_times = [5]*2 + [10]*5 + [60]*5
# two tries each 2 seconds, then 5 tries each 10 seconds, then 5 tries each minute.
sleep_times = [2]*2 + [10]*5 + [60]*5
begin
out << "Syncing stack '#{stack.id}'...\n"
@ -24,4 +29,30 @@ module StackCommands
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

View File

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

View File

@ -1,6 +1,7 @@
require 'json'
require 'lib/stack_presets/factory'
require 'workers/stack_sync_worker'
require 'workers/job_starter'
module Devops
module Version2_0
@ -31,19 +32,11 @@ module Devops
stack = preset.create_stack_from_preset(attrs)
settings.mongo.stack_insert(stack)
jid = StackSyncWorker.perform_async(
DevopsConfig[:report_dir_v2],
stack.provider,
stack.id,
request.env['REMOTE_USER'], # owner
DevopsConfig.config
file = JobStarter.start_job(:worker, :sync_stack_till_not_in_progress,
provider: stack.provider,
stack_id: stack.id,
request: request
)
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}"

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 "commands/stack"
require "db/mongo/models/stack/stack_factory"
require "db/mongo/models/report"
require 'workers/workers_storage'
class StackSyncWorker < Worker
include StackCommands
def perform(dir, provider, stack_id, owner, conf)
call(conf, provider, dir) do |mongo, provider, out, file|
stack = mongo.stack(stack_id)
# besides options came from JobStarter we need:
# :provider
# :stack_id
def perform(options)
call(options['config'], options['provider'], options['dir']) do |mongo, provider, out, file|
stack = mongo.stack(options['stack_id'])
o = {
"file" => file,
"_id" => jid,
"created_by" => owner,
"created_by" => options['owner'],
"project" => stack.project,
"deploy_env" => stack.deploy_env,
"type" => ::Devops::Model::Report::STACK_TYPE
@ -28,3 +28,5 @@ class StackSyncWorker < Worker
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