| 
									
										
										
										
											2014-12-22 14:22:04 +03:00
										 |  |  | require "commands/status" | 
					
						
							|  |  |  | require "db/mongo/models/project" | 
					
						
							|  |  |  | require "workers/project_test_worker" | 
					
						
							| 
									
										
										
										
											2015-07-30 15:37:43 +03:00
										 |  |  | require "app/api2/parsers/project" | 
					
						
							| 
									
										
										
										
											2015-07-31 15:08:40 +03:00
										 |  |  | require "lib/project/type/types_factory" | 
					
						
							| 
									
										
										
										
											2015-07-27 18:27:52 +03:00
										 |  |  | require_relative "../helpers/version_2.rb" | 
					
						
							| 
									
										
										
										
											2015-07-27 15:40:10 +03:00
										 |  |  | require_relative "request_handler" | 
					
						
							| 
									
										
										
										
											2014-12-22 14:22:04 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | module Devops | 
					
						
							| 
									
										
										
										
											2015-07-27 15:40:10 +03:00
										 |  |  |   module API2_0 | 
					
						
							| 
									
										
										
										
											2014-12-22 14:22:04 +03:00
										 |  |  |     module Handler | 
					
						
							| 
									
										
										
										
											2015-07-27 15:40:10 +03:00
										 |  |  |       class Project < RequestHandler | 
					
						
							| 
									
										
										
										
											2015-07-30 15:37:43 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |         set_parser Devops::API2_0::Parser::ProjectParser | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-27 18:27:52 +03:00
										 |  |  |         include Devops::API2_0::Helpers | 
					
						
							| 
									
										
										
										
											2014-12-22 14:22:04 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |         extend StatusCommands | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-31 15:08:40 +03:00
										 |  |  |         def project_types | 
					
						
							|  |  |  |           Devops::TypesFactory.types_names | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-27 15:40:10 +03:00
										 |  |  |         def projects | 
					
						
							| 
									
										
										
										
											2015-08-03 15:09:04 +03:00
										 |  |  |           Devops::Db.connector.projects(nil, nil, parser.projects, parser.archived_projects) | 
					
						
							| 
									
										
										
										
											2014-12-22 14:22:04 +03:00
										 |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-27 15:40:10 +03:00
										 |  |  |         def project id | 
					
						
							|  |  |  |           Devops::Db.connector.project(id) | 
					
						
							| 
									
										
										
										
											2014-12-22 14:22:04 +03:00
										 |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-27 15:40:10 +03:00
										 |  |  |         def project_servers id | 
					
						
							|  |  |  |           Devops::Db.connector.project(id) | 
					
						
							| 
									
										
										
										
											2015-07-30 15:37:43 +03:00
										 |  |  |           Devops::Db.connector.servers(id, parser.project_servers) | 
					
						
							| 
									
										
										
										
											2014-12-22 14:22:04 +03:00
										 |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-27 18:27:52 +03:00
										 |  |  |         def project_stacks id | 
					
						
							|  |  |  |           # check if project exists | 
					
						
							|  |  |  |           Devops::Db.connector.project(id) | 
					
						
							| 
									
										
										
										
											2015-07-30 15:37:43 +03:00
										 |  |  |           options = {project: id} | 
					
						
							|  |  |  |           deploy_env = parser.project_stacks | 
					
						
							|  |  |  |           options[:deploy_env] = deploy_env if deploy_env | 
					
						
							| 
									
										
										
										
											2015-07-27 18:27:52 +03:00
										 |  |  |           Devops::Db.connector.stacks(options) | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-30 15:37:43 +03:00
										 |  |  |         def create_project | 
					
						
							|  |  |  |           p = parser.create_project | 
					
						
							| 
									
										
										
										
											2015-07-27 18:27:52 +03:00
										 |  |  |           raise InvalidRecord.new("Project '#{p.id}' already exist") if Devops::Db.connector.is_project_exists?(p) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-30 15:37:43 +03:00
										 |  |  |           p.add_authorized_user [parser.current_user] | 
					
						
							| 
									
										
										
										
											2015-07-27 15:40:10 +03:00
										 |  |  |           p.create | 
					
						
							|  |  |  |           if p.multi? | 
					
						
							|  |  |  |             "Project '#{p.id}' with type 'multi' created" | 
					
						
							|  |  |  |           else | 
					
						
							| 
									
										
										
										
											2015-08-13 15:49:37 +03:00
										 |  |  |             #roles = create_roles p.id, p.deploy_envs | 
					
						
							|  |  |  |             "Project '#{p.id}' created. "# + create_roles_response(roles) | 
					
						
							| 
									
										
										
										
											2015-07-27 15:40:10 +03:00
										 |  |  |           end | 
					
						
							| 
									
										
										
										
											2014-12-22 14:22:04 +03:00
										 |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-14 17:47:18 +03:00
										 |  |  |         def add_deploy_env_to_project id | 
					
						
							|  |  |  |           project = Devops::Db.connector.project(id) | 
					
						
							|  |  |  |           env = parser.add_deploy_env_to_project | 
					
						
							|  |  |  |           project.add_deploy_env env | 
					
						
							|  |  |  |           "Deploy environment '#{env.identifier}' has been added to project '#{project.id}'" | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-30 15:37:43 +03:00
										 |  |  |         def update_project id | 
					
						
							|  |  |  |           project = parser.update | 
					
						
							| 
									
										
										
										
											2015-07-27 15:40:10 +03:00
										 |  |  |           project.id = id | 
					
						
							|  |  |  |           old_project = Devops::Db.connector.project id | 
					
						
							|  |  |  |           Devops::Db.connector.project_update project | 
					
						
							| 
									
										
										
										
											2015-08-13 15:49:37 +03:00
										 |  |  | #          roles = create_new_roles(old_project, project) | 
					
						
							|  |  |  | #          create_roles_response(roles) | 
					
						
							| 
									
										
										
										
											2014-12-22 14:22:04 +03:00
										 |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # TODO: multi project | 
					
						
							| 
									
										
										
										
											2015-07-30 15:37:43 +03:00
										 |  |  |         def update_project_users id | 
					
						
							|  |  |  |           deploy_env, users = parser.project_users | 
					
						
							| 
									
										
										
										
											2015-07-27 15:40:10 +03:00
										 |  |  |           project = Devops::Db.connector.project(id) | 
					
						
							|  |  |  |           dbusers = Devops::Db.connector.users(users).map{|u| u.id} | 
					
						
							|  |  |  |           buf = dbusers - users | 
					
						
							|  |  |  |           project.add_authorized_user users, deploy_env | 
					
						
							|  |  |  |           Devops::Db.connector.project_update(project) | 
					
						
							|  |  |  |           info = "Users '#{dbusers.join("', '")}' has been added to '#{id}' project's authorized users" | 
					
						
							|  |  |  |           info << ", invalid users: '#{buf.join("', '")}'" unless buf.empty? | 
					
						
							|  |  |  |           info | 
					
						
							| 
									
										
										
										
											2014-12-22 14:22:04 +03:00
										 |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # TODO: multi project | 
					
						
							| 
									
										
										
										
											2015-07-30 15:37:43 +03:00
										 |  |  |         def delete_project_users id | 
					
						
							|  |  |  |           deploy_env, users = parser.project_users | 
					
						
							| 
									
										
										
										
											2015-07-27 15:40:10 +03:00
										 |  |  |           project = Devops::Db.connector.project(id) | 
					
						
							|  |  |  |           project.remove_authorized_user users, deploy_env | 
					
						
							|  |  |  |           Devops::Db.connector.project_update project | 
					
						
							|  |  |  |           "Users '#{users.join("', '")}' have been removed from '#{id}' project's authorized users" | 
					
						
							| 
									
										
										
										
											2014-12-22 14:22:04 +03:00
										 |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-04 12:36:10 +03:00
										 |  |  |         def set_project_run_list id | 
					
						
							|  |  |  |           list = parser.run_list | 
					
						
							|  |  |  |           project = Devops::Db.connector.project(id) | 
					
						
							|  |  |  |           Devops::Db.connector.set_project_run_list id, list | 
					
						
							|  |  |  |           "Updated project with run_list '#{list.inspect}'" | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-30 15:37:43 +03:00
										 |  |  |         def set_project_env_run_list id, deploy_env | 
					
						
							|  |  |  |           list = parser.run_list | 
					
						
							| 
									
										
										
										
											2015-07-27 15:40:10 +03:00
										 |  |  |           project = Devops::Db.connector.project(id) | 
					
						
							|  |  |  |           env = project.deploy_env deploy_env | 
					
						
							| 
									
										
										
										
											2015-08-04 12:36:10 +03:00
										 |  |  |           Devops::Db.connector.set_project_env_run_list id, deploy_env, list | 
					
						
							|  |  |  |           "Updated environment '#{env.identifier}' with run_list '#{list.inspect}' in project '#{project.id}'" | 
					
						
							| 
									
										
										
										
											2015-07-27 15:40:10 +03:00
										 |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-30 15:37:43 +03:00
										 |  |  |         def delete_project id | 
					
						
							|  |  |  |           deploy_env = parser.delete | 
					
						
							| 
									
										
										
										
											2015-07-27 15:40:10 +03:00
										 |  |  |           servers = Devops::Db.connector.servers id | 
					
						
							|  |  |  |           raise DependencyError.new "Deleting #{id} is forbidden: Project has servers" if !servers.empty? | 
					
						
							|  |  |  |           project = Devops::Db.connector.project(id) | 
					
						
							|  |  |  |           info = if deploy_env.nil? | 
					
						
							|  |  |  |             project.delete | 
					
						
							|  |  |  |             "Project '#{id}' is deleted" | 
					
						
							|  |  |  |           else | 
					
						
							|  |  |  |             project.remove_env deploy_env | 
					
						
							|  |  |  |             Devops::Db.connector.project_update project | 
					
						
							|  |  |  |             "Project '#{id}'. Deploy environment '#{deploy_env}' has been deleted" | 
					
						
							|  |  |  |           end | 
					
						
							| 
									
										
										
										
											2014-12-22 14:22:04 +03:00
										 |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-30 15:37:43 +03:00
										 |  |  |         def deploy_project_stream out, id | 
					
						
							|  |  |  |           deploy_env, servers = parser.deploy | 
					
						
							| 
									
										
										
										
											2015-07-27 15:40:10 +03:00
										 |  |  |           keys = {} | 
					
						
							|  |  |  |           dbserver = servers(id, deploy_env, servers) | 
					
						
							|  |  |  |           out << (dbservers.empty? ? "No reserved servers to deploy\n" : "Deploy servers: '#{dbservers.map{|s| s.chef_node_name}.join("', '")}'\n") | 
					
						
							|  |  |  |           status = [] | 
					
						
							|  |  |  |           servers.each do |s| | 
					
						
							| 
									
										
										
										
											2015-08-12 16:39:41 +03:00
										 |  |  |             project = begin | 
					
						
							|  |  |  |               Devops::Db.connector.check_project_auth s.project, s.deploy_env, parser.current_user | 
					
						
							| 
									
										
										
										
											2015-07-27 15:40:10 +03:00
										 |  |  |             rescue InvalidPrivileges, RecordNotFound  => e | 
					
						
							|  |  |  |               out << e.message + "\n" | 
					
						
							|  |  |  |               status.push 2
 | 
					
						
							|  |  |  |               next | 
					
						
							| 
									
										
										
										
											2014-12-22 14:22:04 +03:00
										 |  |  |             end | 
					
						
							| 
									
										
										
										
											2015-08-12 16:39:41 +03:00
										 |  |  |             deploy_info = project.deploy_info(s.deploy_env, nil) | 
					
						
							|  |  |  |             status.push(Devops::Executor::ServerExecutor.new(s, out).deploy_server(deploy_info)) | 
					
						
							| 
									
										
										
										
											2015-07-27 15:40:10 +03:00
										 |  |  |           end | 
					
						
							|  |  |  |           status | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-30 15:37:43 +03:00
										 |  |  |         def deploy_project id | 
					
						
							|  |  |  |           deploy_env, servers = parser.deploy | 
					
						
							| 
									
										
										
										
											2015-07-27 15:40:10 +03:00
										 |  |  |           files = [] | 
					
						
							|  |  |  |           servers(id, deploy_env, servers).each do |s| | 
					
						
							| 
									
										
										
										
											2015-09-02 11:38:58 +03:00
										 |  |  |             begin | 
					
						
							| 
									
										
										
										
											2015-08-12 16:39:41 +03:00
										 |  |  |               Devops::Db.connector.check_project_auth s.project, s.deploy_env, parser.current_user | 
					
						
							| 
									
										
										
										
											2015-07-27 15:40:10 +03:00
										 |  |  |             rescue InvalidPrivileges, RecordNotFound  => e | 
					
						
							|  |  |  |               next | 
					
						
							|  |  |  |             end | 
					
						
							| 
									
										
										
										
											2015-09-02 11:38:58 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |             project_model = project(s.project) | 
					
						
							|  |  |  |             deploy_env_model = project_model.deploy_env(deploy_env) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             puts '!!! WARNING !!!' | 
					
						
							|  |  |  |             puts 'build_number is set to empty string' | 
					
						
							|  |  |  |             build_number = '' | 
					
						
							|  |  |  |             deploy_info = project_model.deploy_info(deploy_env_model, build_number) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             uri = Worker.start_async(DeployWorker, @request, | 
					
						
							|  |  |  |               server_attrs: s.to_hash, | 
					
						
							|  |  |  |               owner: parser.current_user, | 
					
						
							|  |  |  |               tags: [], | 
					
						
							|  |  |  |               deploy_info: deploy_info | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |             files.push uri | 
					
						
							| 
									
										
										
										
											2015-07-27 15:40:10 +03:00
										 |  |  |           end | 
					
						
							|  |  |  |           files | 
					
						
							| 
									
										
										
										
											2014-12-22 14:22:04 +03:00
										 |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-27 15:40:10 +03:00
										 |  |  |         def servers project_id, deploy_env, servers | 
					
						
							|  |  |  |           project = Devops::Db.connector.project(project_id) | 
					
						
							|  |  |  |           dbservers = Devops::Db.connector.servers(project_id, deploy_env, servers, true) | 
					
						
							| 
									
										
										
										
											2014-12-22 14:22:04 +03:00
										 |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-27 15:40:10 +03:00
										 |  |  |         def archive_project id | 
					
						
							|  |  |  |           project = Devops::Db.connector.project(id) | 
					
						
							|  |  |  |           Devops::Db.connector.archive_project(id) | 
					
						
							|  |  |  |           "Project '#{id}' has been archived" | 
					
						
							| 
									
										
										
										
											2015-03-03 12:46:35 +03:00
										 |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-27 15:40:10 +03:00
										 |  |  |         def unarchive_project id | 
					
						
							|  |  |  |           project = Devops::Db.connector.project(id) | 
					
						
							|  |  |  |           Devops::Db.connector.unarchive_project(id) | 
					
						
							|  |  |  |           "Project '#{id}' has been unarchived" | 
					
						
							| 
									
										
										
										
											2015-03-03 12:46:35 +03:00
										 |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-27 15:40:10 +03:00
										 |  |  |         def test_project id, deploy_env | 
					
						
							|  |  |  |           project = Devops::Db.connector.project(id) | 
					
						
							|  |  |  |           env = project.deploy_env deploy_env | 
					
						
							| 
									
										
										
										
											2015-07-30 15:37:43 +03:00
										 |  |  |           DevopsLogger.logger.info "Test project '#{project.id}' and environment '#{env.identifier}'" | 
					
						
							| 
									
										
										
										
											2015-07-27 15:40:10 +03:00
										 |  |  |           if env.provider == ::Provider::Static::PROVIDER | 
					
						
							|  |  |  |             msg = "Can not test environment with provider '#{::Provider::Static::PROVIDER}'" | 
					
						
							|  |  |  |             Logger.warn msg | 
					
						
							|  |  |  |             raise InvalidRecord.new(msg) | 
					
						
							|  |  |  |           end | 
					
						
							| 
									
										
										
										
											2014-12-22 14:22:04 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-03 17:03:47 +03:00
										 |  |  |           uri = Worker.start_async(ProjectTestWorker, @request, | 
					
						
							|  |  |  |             project: project.id, | 
					
						
							|  |  |  |             deploy_env: env.identifier, | 
					
						
							|  |  |  |             user: @request.env['REMOTE_USER'] | 
					
						
							|  |  |  |           ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-27 15:40:10 +03:00
										 |  |  |           sleep 1
 | 
					
						
							| 
									
										
										
										
											2015-09-03 17:03:47 +03:00
										 |  |  |           return [uri] | 
					
						
							| 
									
										
										
										
											2014-12-22 14:22:04 +03:00
										 |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-30 15:37:43 +03:00
										 |  |  |         def create_roles project_id, envs | 
					
						
							| 
									
										
										
										
											2015-08-13 15:49:37 +03:00
										 |  |  |           all_roles = KnifeFactory.instance.roles | 
					
						
							| 
									
										
										
										
											2014-12-22 14:22:04 +03:00
										 |  |  |           return " Can't get roles list" if all_roles.nil? | 
					
						
							|  |  |  |           roles = {:new => [], :error => [], :exist => []} | 
					
						
							|  |  |  |           envs.each do |e| | 
					
						
							|  |  |  |             role_name = KnifeCommands.role_name(project_id, e.identifier) | 
					
						
							|  |  |  |             begin | 
					
						
							|  |  |  |               if all_roles.include? role_name | 
					
						
							|  |  |  |                 roles[:exist].push role_name | 
					
						
							|  |  |  |               else | 
					
						
							|  |  |  |                 KnifeCommands.create_role role_name, project_id, e.identifier | 
					
						
							|  |  |  |                 roles[:new].push role_name | 
					
						
							| 
									
										
										
										
											2015-07-30 15:37:43 +03:00
										 |  |  |                 DevopsLogger.logger.info "Role '#{role_name}' created" | 
					
						
							| 
									
										
										
										
											2014-12-22 14:22:04 +03:00
										 |  |  |               end | 
					
						
							|  |  |  |             rescue => er | 
					
						
							|  |  |  |               roles[:error].push role_name | 
					
						
							| 
									
										
										
										
											2015-07-30 15:37:43 +03:00
										 |  |  |               DevopsLogger.logger.error "Role '#{role_name}' can not be created: #{er.message}" | 
					
						
							| 
									
										
										
										
											2014-12-22 14:22:04 +03:00
										 |  |  |             end | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |           roles | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-30 15:37:43 +03:00
										 |  |  |         def create_new_roles old_project, new_project | 
					
						
							| 
									
										
										
										
											2014-12-22 14:22:04 +03:00
										 |  |  |           old_project.deploy_envs.each do |e| | 
					
						
							|  |  |  |             new_project.remove_env(e.identifier) | 
					
						
							|  |  |  |           end | 
					
						
							| 
									
										
										
										
											2015-07-30 15:37:43 +03:00
										 |  |  |           create_roles new_project.id, new_project.deploy_envs | 
					
						
							| 
									
										
										
										
											2014-12-22 14:22:04 +03:00
										 |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-27 15:40:10 +03:00
										 |  |  |         def create_roles_response roles | 
					
						
							| 
									
										
										
										
											2014-12-22 14:22:04 +03:00
										 |  |  |           if roles.is_a?(String) | 
					
						
							|  |  |  |             roles | 
					
						
							|  |  |  |           else | 
					
						
							|  |  |  |             info = "" | 
					
						
							|  |  |  |             info += " Project roles '#{roles[:new].join("', '")}' have been automaticaly created" unless roles[:new].empty? | 
					
						
							|  |  |  |             info += " Project roles '#{roles[:exist].join("', '")}' weren't created because they exist" unless roles[:exist].empty? | 
					
						
							|  |  |  |             info += " Project roles '#{roles[:error].join("', '")}' weren't created because of internal error" unless roles[:error].empty? | 
					
						
							|  |  |  |             info | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end | 
					
						
							|  |  |  | 
 |