| 
									
										
										
										
											2015-08-12 09:41:19 +03:00
										 |  |  | require "lib/executors/server_executor" | 
					
						
							| 
									
										
										
										
											2014-12-22 14:22:04 +03:00
										 |  |  | require "commands/status" | 
					
						
							|  |  |  | require "workers/deploy_worker" | 
					
						
							| 
									
										
										
										
											2015-07-30 15:37:43 +03:00
										 |  |  | require "exceptions/deploy_info_error" | 
					
						
							|  |  |  | require "app/api2/parsers/deploy" | 
					
						
							|  |  |  | require_relative "request_handler" | 
					
						
							| 
									
										
										
										
											2014-12-22 14:22:04 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | module Devops | 
					
						
							| 
									
										
										
										
											2015-07-23 16:56:51 +03:00
										 |  |  |   module API2_0 | 
					
						
							| 
									
										
										
										
											2014-12-22 14:22:04 +03:00
										 |  |  |     module Handler | 
					
						
							| 
									
										
										
										
											2015-07-30 15:37:43 +03:00
										 |  |  |       class Deploy < RequestHandler | 
					
						
							| 
									
										
										
										
											2015-08-11 19:47:54 +03:00
										 |  |  | #        extend DeployCommands | 
					
						
							| 
									
										
										
										
											2014-12-22 14:22:04 +03:00
										 |  |  |         extend StatusCommands | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-30 15:37:43 +03:00
										 |  |  |         set_parser Devops::API2_0::Parser::DeployParser | 
					
						
							| 
									
										
										
										
											2015-07-23 16:56:51 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-30 15:37:43 +03:00
										 |  |  |         def deploy | 
					
						
							|  |  |  |           body = parser.deploy | 
					
						
							|  |  |  |           names = body["names"] | 
					
						
							|  |  |  |           tags = body["tags"] || [] | 
					
						
							| 
									
										
										
										
											2015-07-23 16:56:51 +03:00
										 |  |  |           dir = DevopsConfig.config[:report_dir_v2] | 
					
						
							|  |  |  |           files = [] | 
					
						
							| 
									
										
										
										
											2015-07-30 15:37:43 +03:00
										 |  |  |           jid = nil | 
					
						
							|  |  |  |           uri = URI.parse(parser.request.url) | 
					
						
							|  |  |  |           owner = parser.current_user | 
					
						
							|  |  |  |           @deploy_info_buf = {} | 
					
						
							| 
									
										
										
										
											2015-07-23 16:56:51 +03:00
										 |  |  |           servers(names).each do |s| | 
					
						
							|  |  |  |             project = begin | 
					
						
							| 
									
										
										
										
											2015-07-30 15:37:43 +03:00
										 |  |  |               Devops::Db.connector.check_project_auth s.project, s.deploy_env, owner | 
					
						
							| 
									
										
										
										
											2015-07-23 16:56:51 +03:00
										 |  |  |             rescue InvalidPrivileges, RecordNotFound  => e | 
					
						
							| 
									
										
										
										
											2015-07-30 15:37:43 +03:00
										 |  |  |               DevopsLogger.logger.warn e.message | 
					
						
							| 
									
										
										
										
											2015-07-23 16:56:51 +03:00
										 |  |  |               next | 
					
						
							|  |  |  |             end | 
					
						
							| 
									
										
										
										
											2015-07-30 15:37:43 +03:00
										 |  |  |             begin | 
					
						
							|  |  |  |               deploy_info = create_deploy_info(s, project, body["build_number"]) | 
					
						
							|  |  |  |               jid = DeployWorker.perform_async(dir, s.to_hash, tags, owner, DevopsConfig.config, deploy_info) | 
					
						
							|  |  |  |               Worker.set_status jid, Worker::STATUS::IN_QUEUE | 
					
						
							|  |  |  |               DevopsLogger.logger.info "Job '#{jid}' has been queued" | 
					
						
							|  |  |  |             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| | 
					
						
							|  |  |  |                 #unless attributes.nil? | 
					
						
							|  |  |  |                 #  out << "Report attributes: #{attributes.inspect}\n" | 
					
						
							|  |  |  |                 #end | 
					
						
							|  |  |  |                 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 | 
					
						
							| 
									
										
										
										
											2015-08-12 14:42:21 +03:00
										 |  |  |             uri.path =  "#{DevopsConfig[:url_prefix]}/v2.0/report/" + jid | 
					
						
							|  |  |  |             files.push uri.to_s | 
					
						
							| 
									
										
										
										
											2015-07-23 16:56:51 +03:00
										 |  |  |           end | 
					
						
							|  |  |  |           files | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2014-12-22 14:22:04 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-30 15:37:43 +03:00
										 |  |  |         def deploy_stream out | 
					
						
							|  |  |  |           body = parser.deploy | 
					
						
							|  |  |  |           names = body["names"] | 
					
						
							|  |  |  |           tags = body["tags"] || [] | 
					
						
							| 
									
										
										
										
											2015-07-23 16:56:51 +03:00
										 |  |  |           status = [] | 
					
						
							| 
									
										
										
										
											2015-07-30 15:37:43 +03:00
										 |  |  |           owner = parser.current_user | 
					
						
							|  |  |  |           @deploy_info_buf = {} | 
					
						
							| 
									
										
										
										
											2015-07-23 16:56:51 +03:00
										 |  |  |           servers(names).each do |s| | 
					
						
							|  |  |  |             project = begin | 
					
						
							| 
									
										
										
										
											2015-07-30 15:37:43 +03:00
										 |  |  |               Devops::Db.connector.check_project_auth s.project, s.deploy_env, owner | 
					
						
							| 
									
										
										
										
											2015-07-23 16:56:51 +03:00
										 |  |  |             rescue InvalidPrivileges, RecordNotFound  => e | 
					
						
							|  |  |  |               out << e.message + "\n" | 
					
						
							|  |  |  |               status.push 2
 | 
					
						
							|  |  |  |               next | 
					
						
							| 
									
										
										
										
											2014-12-22 14:22:04 +03:00
										 |  |  |             end | 
					
						
							| 
									
										
										
										
											2015-07-30 15:37:43 +03:00
										 |  |  |             begin | 
					
						
							|  |  |  |               deploy_info = create_deploy_info(s, project, body["build_number"]) | 
					
						
							| 
									
										
										
										
											2015-08-11 19:47:54 +03:00
										 |  |  |               res = Devops::Executor::ServerExecutor.new(s, out).deploy_server_with_tags(tags, deploy_info) | 
					
						
							| 
									
										
										
										
											2015-07-30 15:37:43 +03:00
										 |  |  |               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 | 
					
						
							| 
									
										
										
										
											2015-07-23 16:56:51 +03:00
										 |  |  |           end | 
					
						
							| 
									
										
										
										
											2015-07-30 15:37:43 +03:00
										 |  |  |           status | 
					
						
							| 
									
										
										
										
											2015-07-23 16:56:51 +03:00
										 |  |  |         rescue RecordNotFound  => e | 
					
						
							|  |  |  |           out << e.message | 
					
						
							| 
									
										
										
										
											2015-07-30 15:37:43 +03:00
										 |  |  |           [-10] | 
					
						
							| 
									
										
										
										
											2015-07-23 16:56:51 +03:00
										 |  |  |         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 | 
					
						
							| 
									
										
										
										
											2014-12-22 14:22:04 +03:00
										 |  |  |         end | 
					
						
							| 
									
										
										
										
											2015-07-30 15:37:43 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |         def create_deploy_info server, project, build_number | 
					
						
							|  |  |  |           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(server.deploy_env, build_number) | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2014-12-22 14:22:04 +03:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end | 
					
						
							|  |  |  | 
 |