| 
									
										
										
										
											2015-08-14 13:28:03 +03:00
										 |  |  | require "lib/executors/server_executor" | 
					
						
							| 
									
										
										
										
											2015-04-16 17:54:40 +03:00
										 |  |  | require 'db/mongo/models/stack/stack_factory' | 
					
						
							| 
									
										
										
										
											2015-07-30 15:37:43 +03:00
										 |  |  | require "app/api2/parsers/stack" | 
					
						
							| 
									
										
										
										
											2015-07-27 11:14:01 +03:00
										 |  |  | require_relative "request_handler" | 
					
						
							| 
									
										
										
										
											2015-04-16 17:54:40 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | module Devops | 
					
						
							| 
									
										
										
										
											2015-07-27 11:14:01 +03:00
										 |  |  |   module API2_0 | 
					
						
							| 
									
										
										
										
											2015-04-16 17:54:40 +03:00
										 |  |  |     module Handler | 
					
						
							| 
									
										
										
										
											2015-07-27 11:14:01 +03:00
										 |  |  |       class Stack < RequestHandler | 
					
						
							| 
									
										
										
										
											2015-04-16 17:54:40 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-30 15:37:43 +03:00
										 |  |  |         set_parser Devops::API2_0::Parser::StackParser | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-27 11:14:01 +03:00
										 |  |  |         def stacks | 
					
						
							|  |  |  |           Devops::Db.connector.stacks | 
					
						
							| 
									
										
										
										
											2015-04-16 17:54:40 +03:00
										 |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-27 16:42:28 +03:00
										 |  |  |         def stacks_for_provider provider | 
					
						
							| 
									
										
										
										
											2015-10-05 13:21:48 +03:00
										 |  |  |           Devops::Db.connector.stacks(provider: provider) | 
					
						
							| 
									
										
										
										
											2015-04-16 17:54:40 +03:00
										 |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-30 15:37:43 +03:00
										 |  |  |         def create_stack | 
					
						
							|  |  |  |           object = parser.create | 
					
						
							| 
									
										
										
										
											2015-08-14 17:48:07 +03:00
										 |  |  |           project = Devops::Db.connector.project(object["project"]) | 
					
						
							|  |  |  |           env = project.deploy_env(object["deploy_env"]) | 
					
						
							|  |  |  |           raise InvalidRecord.new("Environment '#{env.identifier}' of project '#{project.id}' has no stack template") if env.stack_template.nil? | 
					
						
							|  |  |  |           object["stack_template"] = env.stack_template | 
					
						
							|  |  |  |           object["owner"] = parser.current_user | 
					
						
							| 
									
										
										
										
											2015-08-05 16:06:29 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-02 11:38:58 +03:00
										 |  |  |           uri = Worker.start_async(StackBootstrapWorker, @request, | 
					
						
							| 
									
										
										
										
											2015-09-01 16:31:31 +03:00
										 |  |  |             provider_name: env.provider, | 
					
						
							|  |  |  |             stack_attributes: object | 
					
						
							| 
									
										
										
										
											2015-08-05 16:06:29 +03:00
										 |  |  |           ) | 
					
						
							| 
									
										
										
										
											2015-09-02 11:38:58 +03:00
										 |  |  |           puts "Syncing report is located here: #{uri}" | 
					
						
							|  |  |  |           [uri] | 
					
						
							| 
									
										
										
										
											2015-04-16 17:54:40 +03:00
										 |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-27 11:14:01 +03:00
										 |  |  |         def stack id | 
					
						
							|  |  |  |           Devops::Db.connector.stack(id) | 
					
						
							| 
									
										
										
										
											2015-04-16 17:54:40 +03:00
										 |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-18 16:37:33 +03:00
										 |  |  |         def delete_stack name | 
					
						
							| 
									
										
										
										
											2015-08-18 16:41:16 +03:00
										 |  |  |           stack = self.stack(name) | 
					
						
							| 
									
										
										
										
											2015-07-27 11:14:01 +03:00
										 |  |  |           stack.delete_stack_in_cloud! | 
					
						
							| 
									
										
										
										
											2015-08-31 14:26:16 +03:00
										 |  |  |           Devops::Db.connector.stack_servers_delete(stack.name) | 
					
						
							| 
									
										
										
										
											2015-08-18 16:44:55 +03:00
										 |  |  |           Devops::Db.connector.stack_delete(stack.id) | 
					
						
							| 
									
										
										
										
											2015-04-16 17:54:40 +03:00
										 |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-27 16:42:28 +03:00
										 |  |  |         def sync_details id | 
					
						
							|  |  |  |           stack = self.stack(id) | 
					
						
							|  |  |  |           stack.sync_details! | 
					
						
							|  |  |  |           Devops::Db.connector.stack_update(stack) | 
					
						
							| 
									
										
										
										
											2015-08-05 15:06:18 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |           stack | 
					
						
							| 
									
										
										
										
											2015-07-27 16:42:28 +03:00
										 |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-19 16:52:01 +03:00
										 |  |  |         def stack_servers name | 
					
						
							|  |  |  |           stack = Devops::Db.connector.stack(name) | 
					
						
							|  |  |  |           Devops::Db.connector.stack_servers(stack.id) | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-27 16:42:28 +03:00
										 |  |  |         def resources id | 
					
						
							|  |  |  |           stack = Devops::Db.connector.stack(id) | 
					
						
							|  |  |  |           stack.resources | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-30 02:22:54 +03:00
										 |  |  |         def resource id, resource_id | 
					
						
							| 
									
										
										
										
											2015-07-27 16:42:28 +03:00
										 |  |  |           stack = Devops::Db.connector.stack(id) | 
					
						
							|  |  |  |           stack.resource(resource_id) | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2015-08-04 12:36:10 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |         def set_run_list id | 
					
						
							|  |  |  |           Devops::Db.connector.set_stack_run_list(id, parser.run_list) | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2015-08-14 13:28:03 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-15 17:14:26 +03:00
										 |  |  |         def set_tags id | 
					
						
							|  |  |  |           tags = parser.tags | 
					
						
							|  |  |  |           prepare_tags do |id, provider| | 
					
						
							|  |  |  |             provider.set_tags id, tags | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def unset_tags id | 
					
						
							|  |  |  |           tags = parser.tags | 
					
						
							|  |  |  |           prepare_tags do |id, provider| | 
					
						
							|  |  |  |             provider.unset_tags id, tags | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def prepare_tags node_name | 
					
						
							|  |  |  |           stack = Devops::Db.connector.stack(id) | 
					
						
							|  |  |  |           Devops::Db.connector.check_project_auth stack.project, stack.deploy_env, parser.current_user | 
					
						
							|  |  |  |           stack_servers = Devops::Db.connector.stack_servers(id) | 
					
						
							|  |  |  |           provider = stack.provider_instance | 
					
						
							|  |  |  |           stack_servers.each do |s| | 
					
						
							|  |  |  |             yield s.id, provider | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-14 13:28:03 +03:00
										 |  |  |         def deploy id | 
					
						
							|  |  |  |           stack = self.stack(id) | 
					
						
							|  |  |  |           owner = parser.current_user | 
					
						
							|  |  |  |           status = [] | 
					
						
							|  |  |  |           project = Devops::Db.connector.check_project_auth(stack.project, stack.deploy_env, owner) | 
					
						
							| 
									
										
										
										
											2015-09-02 11:38:58 +03:00
										 |  |  |           deploy_env_model = project.deploy_env(stack.deploy_env) | 
					
						
							| 
									
										
										
										
											2015-08-14 13:28:03 +03:00
										 |  |  |           body = parser.deploy | 
					
						
							|  |  |  |           names = body["names"] | 
					
						
							|  |  |  |           tags = body["tags"] || [] | 
					
						
							|  |  |  |           files = [] | 
					
						
							|  |  |  |           jid = nil | 
					
						
							| 
									
										
										
										
											2015-09-02 11:38:58 +03:00
										 |  |  |           servers = Devops::Db.connector.stack_servers(id, true) | 
					
						
							| 
									
										
										
										
											2015-08-14 13:28:03 +03:00
										 |  |  |           servers.each do |s| | 
					
						
							|  |  |  |             begin | 
					
						
							| 
									
										
										
										
											2015-09-02 11:38:58 +03:00
										 |  |  |               deploy_info = project.deploy_info(deploy_env_model, nil) | 
					
						
							|  |  |  |               uri = Worker.start_async(DeployWorker, @request, | 
					
						
							|  |  |  |                 server_attrs: s.to_hash, | 
					
						
							|  |  |  |                 owner: owner, | 
					
						
							|  |  |  |                 tags: tags, | 
					
						
							|  |  |  |                 deploy_info: deploy_info | 
					
						
							|  |  |  |               ) | 
					
						
							| 
									
										
										
										
											2015-08-14 13:28:03 +03:00
										 |  |  |             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}" | 
					
						
							| 
									
										
										
										
											2015-09-02 11:38:58 +03:00
										 |  |  |               dir = DevopsConfig.config[:report_dir_v2] | 
					
						
							| 
									
										
										
										
											2015-08-14 13:28:03 +03:00
										 |  |  |               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 | 
					
						
							|  |  |  |               } | 
					
						
							|  |  |  |               Devops::Db.connector.save_report(Report.new(o)) | 
					
						
							|  |  |  |             end | 
					
						
							| 
									
										
										
										
											2015-09-02 11:38:58 +03:00
										 |  |  |             files.push uri | 
					
						
							| 
									
										
										
										
											2015-08-14 13:28:03 +03:00
										 |  |  |           end | 
					
						
							|  |  |  |           files | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def deploy_stream id, out | 
					
						
							|  |  |  |           stack = self.stack(id) | 
					
						
							|  |  |  |           owner = parser.current_user | 
					
						
							|  |  |  |           status = [] | 
					
						
							|  |  |  |           project = Devops::Db.connector.check_project_auth(stack.project, stack.deploy_env, owner) | 
					
						
							|  |  |  |           body = parser.deploy | 
					
						
							|  |  |  |           #TODO: deploy servers names | 
					
						
							|  |  |  | #          names = body["names"] | 
					
						
							|  |  |  |           tags = body["tags"] || [] | 
					
						
							|  |  |  |           # find all stack reserved servers | 
					
						
							|  |  |  |           servers = Devops::Db.connector.stack_servers(stack_id, true) | 
					
						
							|  |  |  |           deploy_info = project.deploy_info(stack.deploy_env, nil) | 
					
						
							|  |  |  |           servers.each do |s| | 
					
						
							|  |  |  |             begin | 
					
						
							|  |  |  |               res = Devops::Executor::ServerExecutor.new(s, out).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 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-24 15:06:02 +03:00
										 |  |  |         def reserve_servers(stack_id) | 
					
						
							|  |  |  |           stack = self.stack(stack_id) | 
					
						
							|  |  |  |           user = parser.current_user | 
					
						
							|  |  |  |           Devops::Db.connector.check_project_auth stack.project, stack.deploy_env, user | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           # check if none of servers are reserved by somebody else | 
					
						
							|  |  |  |           servers = Devops::Db.connector.stack_servers(stack_id) | 
					
						
							|  |  |  |           servers.each do |server| | 
					
						
							|  |  |  |             if server.reserved_by.present? && server.reserved_by != user | 
					
						
							|  |  |  |               raise ConflictException.new("Server '#{server.chef_node_name}' already reserved by #{server.reserved_by}") | 
					
						
							|  |  |  |             end | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           # reserve them | 
					
						
							|  |  |  |           servers.each do |server| | 
					
						
							|  |  |  |             server.reserved_by = user | 
					
						
							|  |  |  |             Devops::Db.connector.server_update(server) | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def unreserve_servers(stack_id) | 
					
						
							|  |  |  |           stack = self.stack(stack_id) | 
					
						
							|  |  |  |           user = parser.current_user | 
					
						
							|  |  |  |           Devops::Db.connector.check_project_auth stack.project, stack.deploy_env, user | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           servers = Devops::Db.connector.stack_servers(stack_id) | 
					
						
							|  |  |  |           servers.each do |server| | 
					
						
							|  |  |  |             server.reserved_by = nil | 
					
						
							|  |  |  |             Devops::Db.connector.server_update(server) | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-16 17:54:40 +03:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2015-07-27 11:14:01 +03:00
										 |  |  | end |