From 6ade8a015a4be964b48e9b0cae871cf72ac5b511 Mon Sep 17 00:00:00 2001 From: Anton Chuchkalov Date: Tue, 1 Sep 2015 16:54:21 +0300 Subject: [PATCH] refactore create server worker --- devops-service/app/api2/handlers/key.rb | 4 +- devops-service/app/api2/handlers/server.rb | 65 ++++++------------- devops-service/app/api2/routes/key.rb | 2 +- .../db/validators/key/file_existence.rb | 4 +- .../workers/create_server_worker.rb | 51 +++++++-------- devops-service/workers/worker.rb | 2 +- 6 files changed, 51 insertions(+), 77 deletions(-) diff --git a/devops-service/app/api2/handlers/key.rb b/devops-service/app/api2/handlers/key.rb index eb1a228..9bb3b09 100644 --- a/devops-service/app/api2/handlers/key.rb +++ b/devops-service/app/api2/handlers/key.rb @@ -15,10 +15,10 @@ module Devops Devops::Db.connector.keys({}) end - def create + def create(keys_dir) body = parser.create fname = body["file_name"] - file_name = File.join(settings.keys_dir, fname) + file_name = File.join(keys_dir, fname) raise InvalidRecord.new("File '#{fname}' already exist") if File.exists?(file_name) File.open(file_name, "w") do |f| f.write(body["content"]) diff --git a/devops-service/app/api2/handlers/server.rb b/devops-service/app/api2/handlers/server.rb index e79bb1f..c03791e 100644 --- a/devops-service/app/api2/handlers/server.rb +++ b/devops-service/app/api2/handlers/server.rb @@ -63,38 +63,15 @@ module Devops end def create_server - dir = DevopsConfig[:report_dir_v2] - uri = URI.parse(parser.request.url) - file = prepare_create_server do |project, env, user, body| - jid = CreateServerWorker.perform_async(dir, body, user, DevopsConfig.config) - Worker.set_status jid, Worker::STATUS::IN_QUEUE - DevopsLogger.logger.info "Job '#{jid}' has been queued" - uri.path = "#{DevopsConfig[:url_prefix]}/v2.0/report/" + jid - uri.to_s - end - sleep 1 - [file] - end - - def prepare_create_server body = parser.create user = parser.current_user - key_name = body["key"] - new_key = Devops::Db.connector.key(key_name) unless key_name.nil? - p = Devops::Db.connector.check_project_auth(body["project"], body["deploy_env"], user) - env = p.deploy_env(body["deploy_env"]) - - provider = env.provider_instance - server_name = body["name"] - check_chef_node_name(server_name, provider, KnifeFactory.instance) unless server_name.nil? - groups = body["groups"] - unless groups.nil? - buf = groups - provider.groups.keys - halt_response("Invalid security groups '#{buf.join("', '")}' for provider '#{provider.name}'") if buf.empty? - end - - yield p, env, user, body + check_if_server_attrs_are_valid(body, user) + file = Worker.start_async(CreateServerWorker, @request, + server_attrs: body, + owner: user + ) + [file] end def pause_server node_name @@ -276,28 +253,26 @@ module Devops raise InvalidRecord.new("Chef client with name '#{name}' already exist") unless s.nil? end - end + private -=begin - class ExpireHandler - include ServerCommands + def check_if_server_attrs_are_valid(body, user) + key_name = body["key"] + Devops::Db.connector.key(key_name) unless key_name.nil? - def initialize server, logger - @server = server - @logger = logger - end + project = Devops::Db.connector.check_project_auth(body["project"], body["deploy_env"], user) + env = project.deploy_env(body["deploy_env"]) - def call(job) - @logger.info("Removing node '#{@server.chef_node_name}' form project '#{@server.project}' and env '#{@server.deploy_env}'") - begin - delete_server(@server, Devops::Db.connector, @logger) - rescue => e - logger.error "ExpiredHandler error: " + e.message + provider = env.provider_instance + server_name = body["name"] + check_chef_node_name(server_name, provider, KnifeFactory.instance) unless server_name.nil? + groups = body["groups"] + unless groups.nil? + buf = groups - provider.groups.keys + halt_response("Invalid security groups '#{buf.join("', '")}' for provider '#{provider.name}'") if buf.empty? end end - end -=end + end end end end diff --git a/devops-service/app/api2/routes/key.rb b/devops-service/app/api2/routes/key.rb index a4d5a64..09a0449 100644 --- a/devops-service/app/api2/routes/key.rb +++ b/devops-service/app/api2/routes/key.rb @@ -43,7 +43,7 @@ module Devops # 201 - Created app.post_with_headers "/key", :headers => [:accept, :content_type] do check_privileges("key", "w") - Devops::API2_0::Handler::Key.new(request).create + Devops::API2_0::Handler::Key.new(request).create(settings.keys_dir) create_response("Created", nil, 201) end diff --git a/devops-service/db/validators/key/file_existence.rb b/devops-service/db/validators/key/file_existence.rb index e11885a..648a70f 100644 --- a/devops-service/db/validators/key/file_existence.rb +++ b/devops-service/db/validators/key/file_existence.rb @@ -1,9 +1,9 @@ +require_relative '../helpers/file_existence' + module Validators module Key class FileExistence < Base - delegate_to_helper_validator { Helpers::FileExistence.new(@model.path) } - end end end diff --git a/devops-service/workers/create_server_worker.rb b/devops-service/workers/create_server_worker.rb index 1b708e1..5131595 100644 --- a/devops-service/workers/create_server_worker.rb +++ b/devops-service/workers/create_server_worker.rb @@ -1,42 +1,41 @@ -#root = File.join(File.dirname(__FILE__), "..") -#$LOAD_PATH.push root unless $LOAD_PATH.include? root - require File.join(File.dirname(__FILE__), "worker") require "providers/provider_factory" -#require "commands/server" require "db/mongo/models/server" require "db/mongo/models/report" require "lib/executors/server_executor" class CreateServerWorker < Worker -# include ServerCommands - def perform(dir, params, owner, conf) - logger.info "Create server" - call(conf, nil, dir) do |provider, out, file| - mongo = Devops::Db.connector - project = mongo.project(params["project"]) - env = project.deploy_env(params["deploy_env"]) -# s = Devops::Model::Server.new(server) -# s.options = convert_config(server["options"]) - o = { - "file" => file, - "_id" => jid, - "created_by" => owner, - "project" => project.id, - "deploy_env" => env.identifier, - "type" => Devops::Model::Report::SERVER_TYPE - } - mongo.save_report(Devops::Model::Report.new(o)) + def perform(options) + server_attrs = options.fetch('server_attrs') + owner = options.fetch('owner') + + call(nil) do |not_used, out, file| + project = mongo.project(server_attrs["project"]) + env = project.deploy_env(server_attrs["deploy_env"]) + save_report(file, project, env, owner) e = Devops::Executor::ServerExecutor.new(nil, out) e.project = project e.deploy_env = env - params["created_by"] = owner - status = e.create_server(params) -# status = create_server(project, env, params, owner, out) - status + server_attrs["created_by"] = owner + e.create_server(server_attrs) end end + + private + + def save_report(file, project, env, owner) + report = { + "file" => file, + "_id" => jid, + "created_by" => owner, + "project" => project.id, + "deploy_env" => env.identifier, + "type" => Devops::Model::Report::SERVER_TYPE + } + mongo.save_report(Devops::Model::Report.new(report)) + end + end diff --git a/devops-service/workers/worker.rb b/devops-service/workers/worker.rb index bbb783b..c3da35c 100644 --- a/devops-service/workers/worker.rb +++ b/devops-service/workers/worker.rb @@ -27,7 +27,7 @@ class Worker 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 - DevopsLogger.logger.info "Job '#{jid}' has been started" + DevopsLogger.logger.info "Job '#{jid}' has been queued" uri = URI.parse(request.url) uri.path = "#{DevopsConfig[:url_prefix]}/v2.0/report/#{jid}"