138 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			138 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| require "lib/executors/server_executor"
 | |
| require "commands/status"
 | |
| require "workers/deploy_worker"
 | |
| require "exceptions/deploy_info_error"
 | |
| require "app/api2/parsers/deploy"
 | |
| require_relative "request_handler"
 | |
| 
 | |
| module Devops
 | |
|   module API2_0
 | |
|     module Handler
 | |
|       class Deploy < RequestHandler
 | |
| #        extend DeployCommands
 | |
|         extend StatusCommands
 | |
| 
 | |
|         set_parser Devops::API2_0::Parser::DeployParser
 | |
| 
 | |
|         def deploy
 | |
|           body = parser.deploy
 | |
|           names = body["names"]
 | |
|           tags = body["tags"] || []
 | |
|           run_list = body["run_list"]
 | |
|           files = []
 | |
|           jid = nil
 | |
|           owner = parser.current_user
 | |
|           @deploy_info_buf = {}
 | |
|           servers(names).each do |s|
 | |
|             project = begin
 | |
|               Devops::Db.connector.check_project_auth s.project, s.deploy_env, owner
 | |
|             rescue InvalidPrivileges, RecordNotFound  => e
 | |
|               DevopsLogger.logger.warn e.message
 | |
|               next
 | |
|             end
 | |
|             begin
 | |
|               deploy_info = create_deploy_info(s, project, body["build_number"])
 | |
|               deploy_info["run_list"] = run_list if run_list
 | |
|               set_chef_client_options(deploy_info, s, project, body['chef_client_options'])
 | |
|               deploy_info["named_task"] = body["named_task"]
 | |
| 
 | |
|               jid = Worker.start_async(DeployWorker,
 | |
|                 server_attrs: s.to_hash,
 | |
|                 owner: owner,
 | |
|                 tags: tags,
 | |
|                 deploy_info: deploy_info
 | |
|               )
 | |
| 
 | |
|             rescue DeployInfoError => e
 | |
|               msg = "Can not get deploy info: " + e.message
 | |
|               DevopsLogger.logger.error msg
 | |
|               jid = "error_#{s.chef_node_name}_#{Time.new.to_i}"
 | |
|               file = File.jon(dir, jid)
 | |
|               File.open(file, "w") do |out|
 | |
|                 out.write msg
 | |
|               end
 | |
|               o = {
 | |
|                 "file" => file,
 | |
|                 "_id" => jid,
 | |
|                 "created_by" => owner,
 | |
|                 "project" => s.project,
 | |
|                 "deploy_env" => s.deploy_env,
 | |
|                 "type" => Report::DEPLOY_TYPE,
 | |
|                 "status" => Worker::STATUS::FAILED
 | |
| #                "attributes" => attributes
 | |
|               }
 | |
|               Devops::Db.connector.save_report(Report.new(o))
 | |
|             end
 | |
|             files.push(jid)
 | |
|           end
 | |
|           files
 | |
|         end
 | |
| 
 | |
|         def deploy_stream out
 | |
|           body = parser.deploy
 | |
|           names = body["names"]
 | |
|           tags = body["tags"] || []
 | |
|           run_list = body["run_list"]
 | |
|           status = []
 | |
|           owner = parser.current_user
 | |
|           @deploy_info_buf = {}
 | |
|           servers(names).each do |s|
 | |
|             project = begin
 | |
|               Devops::Db.connector.check_project_auth s.project, s.deploy_env, owner
 | |
|             rescue InvalidPrivileges, RecordNotFound  => e
 | |
|               out << e.message + "\n"
 | |
|               status.push 2
 | |
|               next
 | |
|             end
 | |
|             begin
 | |
|               deploy_info = create_deploy_info(s, project, body["build_number"])
 | |
|               deploy_info["run_list"] = run_list if run_list
 | |
|               res = Devops::Executor::ServerExecutor.new(s, out, current_user: owner).deploy_server_with_tags(tags, deploy_info)
 | |
|               status.push(res)
 | |
|             rescue DeployInfoError => e
 | |
|               msg = "Can not get deploy info: " + e.message
 | |
|               DevopsLogger.logger.error msg
 | |
|               out << msg + "\n"
 | |
|               status.push 2
 | |
|               next
 | |
|             end
 | |
|           end
 | |
|           status
 | |
|         rescue RecordNotFound  => e
 | |
|           out << e.message
 | |
|           [-10]
 | |
|         end
 | |
| 
 | |
|         def servers names
 | |
|           servers = Devops::Db.connector.servers(nil, nil, names, true)
 | |
|           raise RecordNotFound.new("No reserved servers found for names '#{names.join("', '")}'") if servers.empty?
 | |
|           servers.sort_by!{|s| names.index(s.chef_node_name)}
 | |
|           servers
 | |
|         end
 | |
| 
 | |
|         def create_deploy_info server, project, build_number
 | |
|           deploy_env_model = project.deploy_env(server.deploy_env)
 | |
|           buf_key = "#{server.project}_#{server.deploy_env}"
 | |
|           deploy_info = if @deploy_info_buf.key?(buf_key)
 | |
|             @deploy_info_buf[buf_key]
 | |
|           else
 | |
|             @deploy_info_buf[buf_key] = project.deploy_info(deploy_env_model, build_number)
 | |
|           end
 | |
|         end
 | |
| 
 | |
|         private
 | |
| 
 | |
|         # env's chef client options may be nil or empty string; it's OK.
 | |
|         def set_chef_client_options(deploy_info, server, project, single_run_options)
 | |
|           if single_run_options
 | |
|             deploy_info['chef_client_options'] = single_run_options
 | |
|           else
 | |
|             deploy_info['chef_client_options'] = project.deploy_env(server.deploy_env).chef_client_options
 | |
|           end
 | |
|         end
 | |
|       end
 | |
|     end
 | |
|   end
 | |
| end
 | |
| 
 | 
