update test project worker

This commit is contained in:
Anton Chuchkalov 2015-09-03 17:03:47 +03:00
parent 871d24948b
commit 9e56624870
4 changed files with 61 additions and 45 deletions

View File

@ -84,7 +84,6 @@ class Project < Handler
when "test" when "test"
self.options = @options_parser.test_options self.options = @options_parser.test_options
test_handler @options_parser.args test_handler @options_parser.args
output(output_type: :test)
else else
@options_parser.invalid_command @options_parser.invalid_command
end end
@ -285,7 +284,8 @@ class Project < Handler
@options_parser.invalid_test_command @options_parser.invalid_test_command
abort(r) abort(r)
end end
@test = post "/project/test/#{args[2]}/#{args[3]}" response = post "/project/test/#{args[2]}/#{args[3]}"
puts response.inspect
end end
protected protected

View File

@ -201,19 +201,14 @@ module Devops
raise InvalidRecord.new(msg) raise InvalidRecord.new(msg)
end end
dir = DevopsConfig[:report_dir_v2] uri = Worker.start_async(ProjectTestWorker, @request,
uri = URI.parse(request.url) project: project.id,
p = { deploy_env: env.identifier,
:project => project.id, user: @request.env['REMOTE_USER']
: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
sleep 1 sleep 1
return [uri.to_s] return [uri]
end end
def create_roles project_id, envs def create_roles project_id, envs

View File

@ -112,20 +112,29 @@ module Devops
ip = @server.public_ip ip = @server.public_ip
@out << "\nPublic IP is present\n" @out << "\nPublic IP is present\n"
end end
@out << "\nWaiting for SSH..."
@out.flush address = "#{@server.remote_user}@#{ip}"
i = 0
cmd = "ssh -i #{cert_path} -q #{@server.remote_user}@#{ip} 'exit'" cmd = 'ssh '
@out << "Test command: '#{cmd}'\n" cmd << "-i #{cert_path} "
cmd << '-q '
cmd << '-o ConnectTimeout=2 -o ConnectionAttempts=1 '
cmd << "#{address} 'exit'"
cmd << " 2>&1" cmd << " 2>&1"
@out << "\nWaiting for SSH..."
@out << "Test command: '#{cmd}'\n"
@out.flush
retries_amount = 0
begin begin
sleep(5) sleep(5)
res = `#{cmd}` res = `#{cmd}`
i += 1 retries_amount += 1
if i == 120 if retries_amount == max_retries_amount
@out << "\nCan not connect to #{@server.remote_user}@#{ip}" @out << "\nCan not connect to #{address}"
@out << "\n" + res @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 return false
end end
raise ArgumentError.new("Can not connect with command '#{cmd}' ") unless $?.success? 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" out << "New deploy run list: #{deploy_info["run_list"].join(", ")}\nRun list has been generated\n\n"
end end
private
def max_retries_amount
120
end
end end
end end
end end

View File

@ -10,28 +10,20 @@ require "db/mongo/models/report"
class ProjectTestWorker < Worker class ProjectTestWorker < Worker
include StatusCommands include StatusCommands
def perform(dir, params, conf) def perform(params)
call(conf, nil, dir) do |provider, out, file| user = params.fetch('user')
user = params["user"] project_name = params.fetch('project')
DevopsLogger.logger.info "Test project '#{params["project"]}' and env '#{params["env"]}' (user - #{user})" deploy_env_name = params.fetch('deploy_env')
mongo = Devops::Db.connector
project = mongo.project(params["project"]) call(nil) do |not_used, out, file|
env = project.deploy_env(params["env"]) DevopsLogger.logger.info "Test project '#{project_name}' and env '#{deploy_env_name}' (user - #{user})"
o = { project = mongo.project(project_name)
"file" => file, env = project.deploy_env(deploy_env_name)
"_id" => jid, save_report(file, user, project_name, deploy_env_name)
"created_by" => user,
"project" => params["project"],
"deploy_env" => params["env"],
"type" => Report::PROJECT_TEST_TYPE
}
mongo.save_report(Report.new(o))
executor = Devops::Executor::ServerExecutor.new(nil, out) executor = Devops::Executor::ServerExecutor.new(nil, out)
executor.project = project executor.project = project
executor.deploy_env = env executor.deploy_env = env
params["created_by"] = user
result = {:servers => []} result = {:servers => []}
project.deploy_envs = [ env ] project.deploy_envs = [ env ]
@ -41,7 +33,7 @@ class ProjectTestWorker < Worker
t1 = Time.now t1 = Time.now
out << "\n=== Create server ===\n" out << "\n=== Create server ===\n"
out.flush out.flush
if executor.create_server({"without_bootstrap" => true}) if executor.create_server("without_bootstrap" => true)
out << "\n=== Create server - OK ===\n" out << "\n=== Create server - OK ===\n"
out.flush out.flush
t2 = Time.now t2 = Time.now
@ -64,7 +56,7 @@ class ProjectTestWorker < Worker
out << "\n=== Check server ===\n" out << "\n=== Check server ===\n"
out.flush out.flush
if executor.check_server if executor.check_server
# mongo.server_insert s # mongo.server_insert s
out << "\n=== OK, server has been inserted ===\n" out << "\n=== OK, server has been inserted ===\n"
out.flush out.flush
end end
@ -79,7 +71,7 @@ class ProjectTestWorker < Worker
t1 = Time.now t1 = Time.now
out << "\n=== Delete server ===\n" out << "\n=== Delete server ===\n"
out.flush out.flush
r = executor.delete_from_chef_server r = executor.delete_from_chef_server(s.chef_node_name)
begin begin
r[:server] = s.provider_instance.delete_server s r[:server] = s.provider_instance.delete_server s
out << "\n=== Delete server - OK ===\n" out << "\n=== Delete server - OK ===\n"
@ -88,7 +80,7 @@ class ProjectTestWorker < Worker
status = 3 status = 3
out << "\n=== Delete server - FAIL ===\n" out << "\n=== Delete server - FAIL ===\n"
out.flush 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] DevopsLogger.logger.warn r[:server]
end end
mongo.server_delete s.id mongo.server_delete s.id
@ -106,4 +98,18 @@ class ProjectTestWorker < Worker
status status
end end
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 end