diff --git a/devops-service/commands/commands_storage.rb b/devops-service/commands/commands_storage.rb new file mode 100644 index 0000000..97a255c --- /dev/null +++ b/devops-service/commands/commands_storage.rb @@ -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 \ No newline at end of file diff --git a/devops-service/commands/stack.rb b/devops-service/commands/stack.rb index 0ea2316..fb60cfc 100644 --- a/devops-service/commands/stack.rb +++ b/devops-service/commands/stack.rb @@ -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 diff --git a/devops-service/db/mongo/models/stack/stack_base.rb b/devops-service/db/mongo/models/stack/stack_base.rb index 3ae32c9..b704aea 100644 --- a/devops-service/db/mongo/models/stack/stack_base.rb +++ b/devops-service/db/mongo/models/stack/stack_base.rb @@ -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 diff --git a/devops-service/routes/v2.0/handlers/stack_preset.rb b/devops-service/routes/v2.0/handlers/stack_preset.rb index 63f5682..2cf3953 100644 --- a/devops-service/routes/v2.0/handlers/stack_preset.rb +++ b/devops-service/routes/v2.0/handlers/stack_preset.rb @@ -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}" diff --git a/devops-service/workers/job_starter.rb b/devops-service/workers/job_starter.rb new file mode 100644 index 0000000..052874c --- /dev/null +++ b/devops-service/workers/job_starter.rb @@ -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 diff --git a/devops-service/workers/stack_sync_worker.rb b/devops-service/workers/stack_sync_worker.rb index 7400436..1258beb 100644 --- a/devops-service/workers/stack_sync_worker.rb +++ b/devops-service/workers/stack_sync_worker.rb @@ -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) diff --git a/devops-service/workers/workers_storage.rb b/devops-service/workers/workers_storage.rb new file mode 100644 index 0000000..d789fd5 --- /dev/null +++ b/devops-service/workers/workers_storage.rb @@ -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 \ No newline at end of file