provide convinient way to start jobs
This commit is contained in:
parent
499d05ad32
commit
673c74aa3a
9
devops-service/commands/commands_storage.rb
Normal file
9
devops-service/commands/commands_storage.rb
Normal 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
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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}"
|
||||
|
||||
|
||||
28
devops-service/workers/job_starter.rb
Normal file
28
devops-service/workers/job_starter.rb
Normal 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
|
||||
@ -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)
|
||||
|
||||
9
devops-service/workers/workers_storage.rb
Normal file
9
devops-service/workers/workers_storage.rb
Normal 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
|
||||
Loading…
Reference in New Issue
Block a user