From 9e566248708b6a120bb06f44eb287523939a5184 Mon Sep 17 00:00:00 2001 From: Anton Chuchkalov Date: Thu, 3 Sep 2015 17:03:47 +0300 Subject: [PATCH] update test project worker --- .../lib/devops-client/handler/project.rb | 4 +- devops-service/app/api2/handlers/project.rb | 19 +++---- .../lib/executors/server_executor.rb | 33 ++++++++---- devops-service/workers/project_test_worker.rb | 50 +++++++++++-------- 4 files changed, 61 insertions(+), 45 deletions(-) diff --git a/devops-client/lib/devops-client/handler/project.rb b/devops-client/lib/devops-client/handler/project.rb index f9b2211..80feb88 100644 --- a/devops-client/lib/devops-client/handler/project.rb +++ b/devops-client/lib/devops-client/handler/project.rb @@ -84,7 +84,6 @@ class Project < Handler when "test" self.options = @options_parser.test_options test_handler @options_parser.args - output(output_type: :test) else @options_parser.invalid_command end @@ -285,7 +284,8 @@ class Project < Handler @options_parser.invalid_test_command abort(r) end - @test = post "/project/test/#{args[2]}/#{args[3]}" + response = post "/project/test/#{args[2]}/#{args[3]}" + puts response.inspect end protected diff --git a/devops-service/app/api2/handlers/project.rb b/devops-service/app/api2/handlers/project.rb index d45fbd1..42b7fed 100644 --- a/devops-service/app/api2/handlers/project.rb +++ b/devops-service/app/api2/handlers/project.rb @@ -201,19 +201,14 @@ module Devops raise InvalidRecord.new(msg) end - dir = DevopsConfig[:report_dir_v2] - uri = URI.parse(request.url) - p = { - :project => project.id, - :env => env.identifier, - :user => @request.env['REMOTE_USER'] - } - jid = ProjectTestWorker.perform_async(dir, p, DevopsConfig.config) - Worker.set_status jid, Worker::STATUS::IN_QUEUE - DevopsLogger.logger.info "Job '#{jid}' has been created" - uri.path = "#{DevopsConfig[:url_prefix]}/v2.0/report/" + jid + uri = Worker.start_async(ProjectTestWorker, @request, + project: project.id, + deploy_env: env.identifier, + user: @request.env['REMOTE_USER'] + ) + sleep 1 - return [uri.to_s] + return [uri] end def create_roles project_id, envs diff --git a/devops-service/lib/executors/server_executor.rb b/devops-service/lib/executors/server_executor.rb index 92543bb..601f2b1 100644 --- a/devops-service/lib/executors/server_executor.rb +++ b/devops-service/lib/executors/server_executor.rb @@ -112,20 +112,29 @@ module Devops ip = @server.public_ip @out << "\nPublic IP is present\n" end - @out << "\nWaiting for SSH..." - @out.flush - i = 0 - cmd = "ssh -i #{cert_path} -q #{@server.remote_user}@#{ip} 'exit'" - @out << "Test command: '#{cmd}'\n" + + address = "#{@server.remote_user}@#{ip}" + + cmd = 'ssh ' + cmd << "-i #{cert_path} " + cmd << '-q ' + cmd << '-o ConnectTimeout=2 -o ConnectionAttempts=1 ' + cmd << "#{address} 'exit'" cmd << " 2>&1" + + @out << "\nWaiting for SSH..." + @out << "Test command: '#{cmd}'\n" + @out.flush + + retries_amount = 0 begin sleep(5) res = `#{cmd}` - i += 1 - if i == 120 - @out << "\nCan not connect to #{@server.remote_user}@#{ip}" + retries_amount += 1 + if retries_amount == max_retries_amount + @out << "\nCan not connect to #{address}" @out << "\n" + res - DevopsLogger.logger.error "Can not connect with command 'ssh -i #{cert_path} #{@server.remote_user}@#{ip}':\n#{res}" + DevopsLogger.logger.error "Can not connect with command '#{cmd}':\n#{res}" return false end raise ArgumentError.new("Can not connect with command '#{cmd}' ") unless $?.success? @@ -366,6 +375,12 @@ module Devops out << "New deploy run list: #{deploy_info["run_list"].join(", ")}\nRun list has been generated\n\n" end + private + + def max_retries_amount + 120 + end + end end end diff --git a/devops-service/workers/project_test_worker.rb b/devops-service/workers/project_test_worker.rb index cf9c6db..b384ec5 100644 --- a/devops-service/workers/project_test_worker.rb +++ b/devops-service/workers/project_test_worker.rb @@ -10,28 +10,20 @@ require "db/mongo/models/report" class ProjectTestWorker < Worker include StatusCommands - def perform(dir, params, conf) - call(conf, nil, dir) do |provider, out, file| - user = params["user"] - DevopsLogger.logger.info "Test project '#{params["project"]}' and env '#{params["env"]}' (user - #{user})" - mongo = Devops::Db.connector - project = mongo.project(params["project"]) - env = project.deploy_env(params["env"]) - o = { - "file" => file, - "_id" => jid, - "created_by" => user, - "project" => params["project"], - "deploy_env" => params["env"], - "type" => Report::PROJECT_TEST_TYPE - } - mongo.save_report(Report.new(o)) + def perform(params) + user = params.fetch('user') + project_name = params.fetch('project') + deploy_env_name = params.fetch('deploy_env') + + call(nil) do |not_used, out, file| + DevopsLogger.logger.info "Test project '#{project_name}' and env '#{deploy_env_name}' (user - #{user})" + project = mongo.project(project_name) + env = project.deploy_env(deploy_env_name) + save_report(file, user, project_name, deploy_env_name) executor = Devops::Executor::ServerExecutor.new(nil, out) executor.project = project executor.deploy_env = env - params["created_by"] = user - result = {:servers => []} project.deploy_envs = [ env ] @@ -41,7 +33,7 @@ class ProjectTestWorker < Worker t1 = Time.now out << "\n=== Create server ===\n" out.flush - if executor.create_server({"without_bootstrap" => true}) + if executor.create_server("without_bootstrap" => true) out << "\n=== Create server - OK ===\n" out.flush t2 = Time.now @@ -64,7 +56,7 @@ class ProjectTestWorker < Worker out << "\n=== Check server ===\n" out.flush if executor.check_server -# mongo.server_insert s + # mongo.server_insert s out << "\n=== OK, server has been inserted ===\n" out.flush end @@ -79,7 +71,7 @@ class ProjectTestWorker < Worker t1 = Time.now out << "\n=== Delete server ===\n" out.flush - r = executor.delete_from_chef_server + r = executor.delete_from_chef_server(s.chef_node_name) begin r[:server] = s.provider_instance.delete_server s out << "\n=== Delete server - OK ===\n" @@ -88,7 +80,7 @@ class ProjectTestWorker < Worker status = 3 out << "\n=== Delete server - FAIL ===\n" out.flush - r[:server] = "Server with id '#{s.id}' not found in '#{provider.name}' servers" + r[:server] = "Server with id '#{s.id}' not found in '#{s.provider_instance.name}' servers" DevopsLogger.logger.warn r[:server] end mongo.server_delete s.id @@ -106,4 +98,18 @@ class ProjectTestWorker < Worker status end end + + private + + def save_report(file, user, project_name, deploy_env_name) + report = { + "file" => file, + "_id" => jid, + "created_by" => user, + "project" => project_name, + "deploy_env" => deploy_env_name, + "type" => Devops::Model::Report::PROJECT_TEST_TYPE + } + mongo.save_report(Devops::Model::Report.new(report)) + end end