| 
									
										
										
										
											2014-12-22 14:22:04 +03:00
										 |  |  | require "commands/deploy" | 
					
						
							|  |  |  | require "commands/status" | 
					
						
							|  |  |  | require "workers/deploy_worker" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | module Devops | 
					
						
							|  |  |  |   module Version2_0 | 
					
						
							|  |  |  |     module Handler | 
					
						
							|  |  |  |       class Deploy | 
					
						
							|  |  |  |         extend DeployCommands | 
					
						
							|  |  |  |         extend StatusCommands | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def self.deploy | 
					
						
							|  |  |  |           lambda { | 
					
						
							| 
									
										
										
										
											2015-02-18 13:50:02 +03:00
										 |  |  |             check_privileges("server", "x") | 
					
						
							|  |  |  |             # TODO: send message | 
					
						
							|  |  |  |             #broadcast(:devops_deploy, "deploy") | 
					
						
							| 
									
										
										
										
											2014-12-22 14:22:04 +03:00
										 |  |  |             r = create_object_from_json_body | 
					
						
							|  |  |  |             names = check_array(r["names"], "Parameter 'names' should be a not empty array of strings") | 
					
						
							|  |  |  |             tags = check_array(r["tags"], "Parameter 'tags' should be an array of strings", String, true) || [] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             servers = settings.mongo.servers(nil, nil, names, true) | 
					
						
							|  |  |  |             halt(404, "No reserved servers found for names '#{names.join("', '")}'") if servers.empty? | 
					
						
							|  |  |  |             keys = {} | 
					
						
							|  |  |  |             servers.sort_by!{|s| names.index(s.chef_node_name)} | 
					
						
							|  |  |  |             if r.key?("trace") | 
					
						
							|  |  |  |               stream() do |out| | 
					
						
							|  |  |  |                 status = [] | 
					
						
							|  |  |  |                 begin | 
					
						
							|  |  |  |                   servers.each do |s| | 
					
						
							|  |  |  |                     project = begin | 
					
						
							|  |  |  |                       settings.mongo.check_project_auth s.project, s.deploy_env, request.env['REMOTE_USER'] | 
					
						
							|  |  |  |                     rescue InvalidPrivileges, RecordNotFound  => e | 
					
						
							|  |  |  |                       out << e.message + "\n" | 
					
						
							|  |  |  |                       status.push 2
 | 
					
						
							|  |  |  |                       next | 
					
						
							|  |  |  |                     end | 
					
						
							|  |  |  |                     res = deploy_server_proc.call(out, s, settings.mongo, tags) | 
					
						
							|  |  |  |                     status.push(res) | 
					
						
							|  |  |  |                   end | 
					
						
							|  |  |  |                   out << create_status(status) | 
					
						
							|  |  |  |                 rescue IOError => e | 
					
						
							|  |  |  |                   logger.error e.message | 
					
						
							|  |  |  |                   break | 
					
						
							|  |  |  |                 end | 
					
						
							|  |  |  |               end # stream | 
					
						
							|  |  |  |             else | 
					
						
							|  |  |  |               dir = DevopsService.config[:report_dir_v2] | 
					
						
							|  |  |  |               files = [] | 
					
						
							|  |  |  |               uri = URI.parse(request.url) | 
					
						
							|  |  |  |               servers.each do |s| | 
					
						
							|  |  |  |                 project = begin | 
					
						
							|  |  |  |                   settings.mongo.check_project_auth s.project, s.deploy_env, request.env['REMOTE_USER'] | 
					
						
							|  |  |  |                 rescue InvalidPrivileges, RecordNotFound  => e | 
					
						
							|  |  |  |                   next | 
					
						
							|  |  |  |                 end | 
					
						
							|  |  |  |                 jid = DeployWorker.perform_async(dir, s.to_hash, tags, request.env['REMOTE_USER'], DevopsService.config) | 
					
						
							|  |  |  |                 logger.info "Job '#{jid}' has been started" | 
					
						
							|  |  |  |                 uri.path = "#{DevopsService.config[:url_prefix]}/v2.0/report/" + jid | 
					
						
							|  |  |  |                 files.push uri.to_s | 
					
						
							|  |  |  |               end | 
					
						
							|  |  |  |               sleep 1
 | 
					
						
							|  |  |  |               json files | 
					
						
							|  |  |  |             end | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end | 
					
						
							|  |  |  | 
 |