fluke/devops-service/workers/project_test_worker.rb
2015-09-03 17:03:47 +03:00

116 lines
3.6 KiB
Ruby

require File.join(File.dirname(__FILE__), "worker")
require "providers/provider_factory"
require "db/mongo/models/server"
require "json"
require "fileutils"
require "commands/status"
require "db/mongo/models/report"
class ProjectTestWorker < Worker
include StatusCommands
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
result = {:servers => []}
project.deploy_envs = [ env ]
result[:project] = project.to_hash
status = 0
sr = {}
t1 = Time.now
out << "\n=== Create server ===\n"
out.flush
if executor.create_server("without_bootstrap" => true)
out << "\n=== Create server - OK ===\n"
out.flush
t2 = Time.now
s = executor.server
sr[:id] = s.id
sr[:create] = {:status => true}
sr[:create][:time] = time_diff_s(t1, t2)
DevopsLogger.logger.info "Server with parameters: #{s.to_hash.inspect} is running"
out << "\n=== Bootstrap ===\n"
out.flush
r = executor.bootstrap({})
t1 = Time.now
sr[:chef_node_name] = s.chef_node_name
if r == 0
out << "\n=== Bootstrap - OK ===\n"
out.flush
sr[:bootstrap] = {:status => true}
sr[:bootstrap][:time] = time_diff_s(t2, t1)
DevopsLogger.logger.info "Server with id '#{s.id}' is bootstraped"
out << "\n=== Check server ===\n"
out.flush
if executor.check_server
# mongo.server_insert s
out << "\n=== OK, server has been inserted ===\n"
out.flush
end
else
status = 2
out << "\n=== Bootstrap - FAIL ===\n"
out.flush
sr[:bootstrap] = {:status => false}
sr[:bootstrap][:return_code] = r
end
t1 = Time.now
out << "\n=== Delete server ===\n"
out.flush
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"
out.flush
rescue Fog::Compute::OpenStack::NotFound, Fog::Compute::AWS::Error
status = 3
out << "\n=== Delete server - FAIL ===\n"
out.flush
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
t2 = Time.now
sr[:delete] = {:status => true}
sr[:delete][:time] = time_diff_s(t1, t2)
else
status = 1
out << "\n=== Create server - FAIL ===\n"
out.flush
sr[:create] = {:status => false}
end
result[:servers].push sr
out << "\n\n#{result.to_json}"
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