| 
									
										
										
										
											2015-02-12 13:01:05 +03:00
										 |  |  | module Connectors | 
					
						
							|  |  |  |   class Project < Base | 
					
						
							|  |  |  |     include Helpers::InsertCommand, | 
					
						
							|  |  |  |       Helpers::ShowCommand, | 
					
						
							| 
									
										
										
										
											2015-07-10 10:30:14 +03:00
										 |  |  | #      Helpers::ListCommand, | 
					
						
							| 
									
										
										
										
											2015-09-15 13:06:25 +03:00
										 |  |  |       Helpers::DeleteCommand | 
					
						
							|  |  |  | #      Helpers::UpdateCommand | 
					
						
							| 
									
										
										
										
											2015-02-12 13:01:05 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def initialize(db) | 
					
						
							| 
									
										
										
										
											2015-09-21 15:54:33 +03:00
										 |  |  |       super(db) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def collection_name | 
					
						
							|  |  |  |       'projects' | 
					
						
							| 
									
										
										
										
											2015-02-12 13:01:05 +03:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def is_project_exists?(project) | 
					
						
							|  |  |  |       self.project(project.id) | 
					
						
							|  |  |  |       return true | 
					
						
							|  |  |  |     rescue RecordNotFound => e | 
					
						
							|  |  |  |       return false | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def projects_all | 
					
						
							|  |  |  |       list | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-03 12:46:35 +03:00
										 |  |  |     def projects ids=nil, type=nil, fields=[], archived=false | 
					
						
							| 
									
										
										
										
											2015-02-12 13:01:05 +03:00
										 |  |  |       query = {} | 
					
						
							|  |  |  |       query['_id'] = {'$in' => ids} if ids | 
					
						
							|  |  |  |       query['type'] = 'multi' if type == :multi | 
					
						
							| 
									
										
										
										
											2015-03-03 12:46:35 +03:00
										 |  |  |       if archived | 
					
						
							|  |  |  |         query["archived"] = true | 
					
						
							|  |  |  |       else | 
					
						
							|  |  |  |         query["archived"] = {"$exists" => false} | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2015-02-12 13:01:05 +03:00
										 |  |  |       list(query, fields: fields) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # names - array of project names | 
					
						
							|  |  |  |     def project_names_with_envs(names=nil) | 
					
						
							|  |  |  |       # db.projects.aggregate({$unwind:"$deploy_envs"}, {$project:{"deploy_envs.identifier":1}}, {$group:{_id:"$_id", envs: {$addToSet: "$deploy_envs.identifier"}}}) | 
					
						
							|  |  |  |       q = [] | 
					
						
							|  |  |  |       unless names.nil? | 
					
						
							|  |  |  |         q.push({ | 
					
						
							|  |  |  |           '$match' => { | 
					
						
							|  |  |  |             '_id' => { | 
					
						
							|  |  |  |               '$in' => names | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |       q.push({ | 
					
						
							|  |  |  |         '$unwind' => '$deploy_envs' | 
					
						
							|  |  |  |       }) | 
					
						
							|  |  |  |       q.push({ | 
					
						
							|  |  |  |         '$project' => { | 
					
						
							|  |  |  |           'deploy_envs.identifier' => 1
 | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }) | 
					
						
							|  |  |  |       q.push({ | 
					
						
							|  |  |  |         '$group' => { | 
					
						
							|  |  |  |           '_id' => '$_id', | 
					
						
							|  |  |  |           'envs' => { | 
					
						
							|  |  |  |             '$addToSet' => '$deploy_envs.identifier' | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }) | 
					
						
							|  |  |  |       res = @collection.aggregate(q) | 
					
						
							|  |  |  |       r = {} | 
					
						
							|  |  |  |       res.each do |ar| | 
					
						
							|  |  |  |         r[ar['_id']] = ar['envs'] | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |       return r | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def projects_by_image(image) | 
					
						
							|  |  |  |       list('deploy_envs.image' => image) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def projects_by_user(user) | 
					
						
							|  |  |  |       list('deploy_envs.users' => user) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-03 12:46:35 +03:00
										 |  |  |     def archive_project id | 
					
						
							|  |  |  |       @collection.update({"_id" => id}, {"$set" => {"archived" => true}}) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def unarchive_project id | 
					
						
							|  |  |  |       @collection.update({"_id" => id}, {"$unset" => {"archived" => ""}}) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-12 13:01:05 +03:00
										 |  |  |     def check_project_auth(project_id, env, user_id) | 
					
						
							|  |  |  |       project = show(project_id) | 
					
						
							|  |  |  |       raise InvalidPrivileges.new("User '#{user_id}' unauthorized to work with project '#{project_id}'") unless project.check_authorization(user_id, env) | 
					
						
							|  |  |  |       project | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-04 12:36:10 +03:00
										 |  |  |     def set_project_env_run_list(project_id, env, run_list) | 
					
						
							|  |  |  |       Helpers::RunList.new(run_list).validate! | 
					
						
							|  |  |  |       @collection.update({"_id" => project_id, "deploy_envs.identifier" => env}, {"$set" => {"deploy_envs.$.run_list" => run_list}}) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def set_project_run_list(project_id, env, run_list) | 
					
						
							|  |  |  |       Helpers::RunList.new(run_list).validate! | 
					
						
							|  |  |  |       @collection.update({"_id" => project_id}, {"$set" => {run_list: run_list}}) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-14 17:47:18 +03:00
										 |  |  |     def add_deploy_env_to_project id, env | 
					
						
							|  |  |  |       @collection.update({"_id" => id}, {'$push' => {deploy_envs: env.to_hash} }) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-11 16:18:20 +03:00
										 |  |  |     def remove_deploy_env_from_project id, env | 
					
						
							|  |  |  |       @collection.update({"_id" => id}, {'$pull' => {deploy_envs: {identifier: env}} }) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-14 18:43:03 +03:00
										 |  |  |     def project_update_field id, field, value | 
					
						
							| 
									
										
										
										
											2015-09-14 17:47:11 +03:00
										 |  |  |       obj = {} | 
					
						
							|  |  |  |       obj[field] = value | 
					
						
							|  |  |  |       @collection.update({"_id" => id}, {'$set' => obj }) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-15 13:06:25 +03:00
										 |  |  |     def project_update id, params | 
					
						
							| 
									
										
										
										
											2015-09-21 15:54:33 +03:00
										 |  |  |       #raise InvalidRecord.new("You can not change project name for '#{id}'.") if params["name"] | 
					
						
							| 
									
										
										
										
											2015-09-15 13:06:25 +03:00
										 |  |  |       keys = %w(run_list description) | 
					
						
							|  |  |  |       params.delete_if{|k,v| !keys.include?(k)} | 
					
						
							|  |  |  |       @collection.update({"_id" => id}, {'$set' => params }) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-12 13:01:05 +03:00
										 |  |  |     private | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-10 10:30:14 +03:00
										 |  |  |     def list(query={}, query_options={}) | 
					
						
							|  |  |  |       @collection.find(query, query_options).to_a.map {|bson| model_from_bson(bson)} | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-12 13:01:05 +03:00
										 |  |  |     def model_from_bson(bson) | 
					
						
							| 
									
										
										
										
											2015-03-06 12:20:30 +03:00
										 |  |  |       Devops::Model::Project.build_from_bson(bson) | 
					
						
							| 
									
										
										
										
											2015-02-12 13:01:05 +03:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | end |