115 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
		
		
			
		
	
	
			115 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
|   | require File.join(File.dirname(__FILE__), "worker") | ||
|  | 
 | ||
|  | require "providers/provider_factory" | ||
|  | require "commands/server" | ||
|  | require "db/mongo/models/server" | ||
|  | require "json" | ||
|  | require "fileutils" | ||
|  | require "commands/status" | ||
|  | 
 | ||
|  | class ProjectTestWorker < Worker | ||
|  |   include ServerCommands | ||
|  |   include StatusCommands | ||
|  | 
 | ||
|  |   def perform(dir, params, conf) | ||
|  |     FileUtils.mkdir_p(dir) unless File.exists?(dir) | ||
|  |     set_status jid, "init" | ||
|  |     config = convert_config(conf) | ||
|  |     File.open(File.join(dir, jid), "w") do |out| | ||
|  |       begin | ||
|  |         set_status jid, "running" | ||
|  |         logger.info "Test project '#{params["project"]}' and env '#{params["env"]}' (user - #{params["user"]})" | ||
|  |         mongo = mongo_connector(config) | ||
|  |         ::Provider::ProviderFactory.init(config) | ||
|  |         project = mongo.project(params["project"]) | ||
|  |         env = project.deploy_env(params["env"]) | ||
|  |         user = params["user"] | ||
|  |         provider = ::Provider::ProviderFactory.get(env.provider) | ||
|  |         logger.debug "Provider: #{provider.inspect}" | ||
|  |         servers = extract_servers(provider, project, env, {}, user, mongo) | ||
|  |         result = {:servers => []} | ||
|  |         project.deploy_envs = [ env ] | ||
|  |         result[:project] = project.to_hash | ||
|  |         status = 0
 | ||
|  |         servers.each do |s| | ||
|  |           sr = {} | ||
|  |           t1 = Time.now | ||
|  |           out << "\n=== Create server ===\n" | ||
|  |           out.flush | ||
|  |           if provider.create_server(s, out) | ||
|  |             out << "\n=== Create server - OK ===\n" | ||
|  |             out.flush | ||
|  |             t2 = Time.now | ||
|  |             sr[:id] = s.id | ||
|  |             sr[:create] = {:status => true} | ||
|  |             sr[:create][:time] = time_diff_s(t1, t2) | ||
|  |             s.chef_node_name = provider.create_default_chef_node_name(s) | ||
|  |             logger.info "Server with parameters: #{s.to_hash.inspect} is running" | ||
|  |             key = mongo.key(s.key) | ||
|  |             out << "\n=== Bootstrap ===\n" | ||
|  |             out.flush | ||
|  |             r = bootstrap(s, out, key.path, logger) | ||
|  |             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) | ||
|  |               logger.info "Server with id '#{s.id}' is bootstraped" | ||
|  |               out << "\n=== Check server ===\n" | ||
|  |               out.flush | ||
|  |               if check_server(s) | ||
|  |                 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 = delete_from_chef_server(s.chef_node_name) | ||
|  |             begin | ||
|  |               r[:server] = provider.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 '#{provider.name}' servers" | ||
|  |               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 | ||
|  |         end | ||
|  |         out << "\n\n#{result.to_json}" | ||
|  | 
 | ||
|  |         set_status jid, (status == 0 ? "completed" : "failed") | ||
|  |       rescue Exception => e | ||
|  |         out << "\n" | ||
|  |         out << e.message | ||
|  |         out << "\n" | ||
|  |         out << e.backtrace.join("\n") | ||
|  |         set_status jid, "failed" | ||
|  |       end | ||
|  |     end | ||
|  |   end | ||
|  | end |