| 
									
										
										
										
											2015-02-12 13:01:05 +03:00
										 |  |  | require "db/mongo/models/deploy_env/deploy_env_factory" | 
					
						
							| 
									
										
										
										
											2014-05-08 15:34:26 +04:00
										 |  |  | require "db/mongo/models/user" | 
					
						
							| 
									
										
										
										
											2015-02-12 13:01:05 +03:00
										 |  |  | require "db/mongo/models/deploy_env/deploy_env_multi" | 
					
						
							| 
									
										
										
										
											2014-05-08 15:34:26 +04:00
										 |  |  | require "db/mongo/models/mongo_model" | 
					
						
							|  |  |  | require "json" | 
					
						
							| 
									
										
										
										
											2015-07-27 15:56:30 +03:00
										 |  |  | require "hooks" | 
					
						
							| 
									
										
										
										
											2015-07-01 17:14:23 +03:00
										 |  |  | require "lib/project/handler/types_factory" | 
					
						
							| 
									
										
										
										
											2014-05-08 15:34:26 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-06 12:20:30 +03:00
										 |  |  | module Devops | 
					
						
							|  |  |  |   module Model | 
					
						
							|  |  |  |     class Project < MongoModel | 
					
						
							| 
									
										
										
										
											2014-05-08 15:34:26 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-01 17:14:23 +03:00
										 |  |  |       include Hooks | 
					
						
							|  |  |  |       include Hooks::InstanceHooks | 
					
						
							|  |  |  |       define_hook :before_create | 
					
						
							|  |  |  |       define_hook :after_create | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-01 17:22:38 +03:00
										 |  |  |       define_hook :before_delete | 
					
						
							|  |  |  |       define_hook :after_delete | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-06 12:20:30 +03:00
										 |  |  |       attr_accessor :id, :deploy_envs, :type, :archived, :description | 
					
						
							| 
									
										
										
										
											2014-05-08 15:34:26 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-06 12:20:30 +03:00
										 |  |  |       types :id => {:type => String, :empty => false}, | 
					
						
							|  |  |  |             :deploy_envs => {:type => Array, :value_type => false, :empty => false}, | 
					
						
							|  |  |  |             :description => {:type => String, :empty => true, :nil => true} | 
					
						
							| 
									
										
										
										
											2014-05-08 15:34:26 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-06 12:20:30 +03:00
										 |  |  |       MULTI_TYPE = "multi" | 
					
						
							| 
									
										
										
										
											2014-05-08 15:34:26 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-06 12:20:30 +03:00
										 |  |  |       def self.fields | 
					
						
							|  |  |  |         ["deploy_envs", "type", "description"] | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2014-08-26 10:45:47 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-06 12:20:30 +03:00
										 |  |  |       def initialize p={} | 
					
						
							|  |  |  |         self.id = p["name"] | 
					
						
							|  |  |  |         #raise InvalidRecord.new "No deploy envirenments for project #{self.id}" if p["deploy_envs"].nil? or p["deploy_envs"].empty? | 
					
						
							| 
									
										
										
										
											2015-07-01 17:14:23 +03:00
										 |  |  |         self.type = p["type"] || Devops::GenericType.name | 
					
						
							| 
									
										
										
										
											2015-03-06 12:20:30 +03:00
										 |  |  |         self.description = p["description"] | 
					
						
							|  |  |  |         self.archived = p["archived"] || false | 
					
						
							| 
									
										
										
										
											2015-07-01 17:14:23 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |         handler = Devops::TypesFactory.type self.type | 
					
						
							|  |  |  |         handler.prepare(self) unless handler.nil? | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-06 12:20:30 +03:00
										 |  |  |         env_class = ( self.multi? ? DeployEnvMulti : DeployEnvFactory ) | 
					
						
							|  |  |  |         unless p["deploy_envs"].nil? | 
					
						
							|  |  |  |           self.deploy_envs = [] | 
					
						
							|  |  |  |           p["deploy_envs"].each do |e| | 
					
						
							|  |  |  |             env = env_class.create(e) | 
					
						
							|  |  |  |             self.deploy_envs.push env | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2014-08-26 10:45:47 +04:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2014-05-08 15:34:26 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-06 12:20:30 +03:00
										 |  |  |       def deploy_env env | 
					
						
							|  |  |  |         de = self.deploy_envs.detect {|e| e.identifier == env} | 
					
						
							|  |  |  |         raise RecordNotFound.new("Project '#{self.id}' does not have deploy environment '#{env}'") if de.nil? | 
					
						
							|  |  |  |         de | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2014-05-08 15:34:26 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-06 12:20:30 +03:00
										 |  |  |       def add_authorized_user user, env=nil | 
					
						
							|  |  |  |         return if user.nil? | 
					
						
							|  |  |  |         new_users = ( user.is_a?(Array) ? user : [ user ] ) | 
					
						
							|  |  |  |         if env.nil? | 
					
						
							|  |  |  |           self.deploy_envs.each do |e| | 
					
						
							|  |  |  |             return unless e.users.is_a?(Array) | 
					
						
							|  |  |  |             e.users = (e.users + new_users).uniq | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |           e = self.deploy_env(env) | 
					
						
							|  |  |  |           return unless e.users.is_a?(Array) | 
					
						
							|  |  |  |           e.users = (e.users + new_users).uniq | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2014-05-08 15:34:26 +04:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-06 12:20:30 +03:00
										 |  |  |       def remove_authorized_user user, env=nil | 
					
						
							|  |  |  |         return if user.nil? | 
					
						
							|  |  |  |         users = ( user.is_a?(Array) ? user : [ user ] ) | 
					
						
							|  |  |  |         if env.nil? | 
					
						
							|  |  |  |           self.deploy_envs.each do |e| | 
					
						
							|  |  |  |             return unless e.users.is_a?(Array) | 
					
						
							|  |  |  |             e.users = e.users - users | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |           e = self.deploy_env(env) | 
					
						
							|  |  |  |           return unless e.users.is_a?(Array) | 
					
						
							|  |  |  |           e.users = e.users - users | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2014-05-08 15:34:26 +04:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-06 12:20:30 +03:00
										 |  |  |       def check_authorization user_id, env | 
					
						
							|  |  |  |         e = self.deploy_env(env) | 
					
						
							|  |  |  |         return true if user_id == User::ROOT_USER_NAME | 
					
						
							|  |  |  |         return e.users.include? user_id | 
					
						
							|  |  |  |       rescue RecordNotFound => e | 
					
						
							|  |  |  |         return false | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2014-05-08 15:34:26 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-06 12:20:30 +03:00
										 |  |  |       def validate! | 
					
						
							|  |  |  |         super | 
					
						
							|  |  |  |         check_name_value(self.id) | 
					
						
							|  |  |  |         envs = self.deploy_envs.map {|d| d.identifier} | 
					
						
							|  |  |  |         non_uniq = envs.uniq.select{|u| envs.count(u) > 1} | 
					
						
							|  |  |  |         raise InvalidRecord.new "Deploy environment(s) '#{non_uniq.join("', '")}' is/are not unique" unless non_uniq.empty? | 
					
						
							|  |  |  |         self.deploy_envs.each do |d| | 
					
						
							|  |  |  |           d.validate! | 
					
						
							| 
									
										
										
										
											2015-07-01 17:14:23 +03:00
										 |  |  | =begin | 
					
						
							| 
									
										
										
										
											2015-03-06 12:20:30 +03:00
										 |  |  |           unless self.multi? | 
					
						
							|  |  |  |             rn = "#{self.id}#{DevopsConfig.config[:role_separator] || "_"}#{d.identifier}" | 
					
						
							|  |  |  |             role = "role[#{rn}]" | 
					
						
							|  |  |  |             d.run_list = d.run_list - [rn, role] | 
					
						
							|  |  |  |             d.run_list.unshift(role) | 
					
						
							|  |  |  |           end | 
					
						
							| 
									
										
										
										
											2015-07-01 17:14:23 +03:00
										 |  |  | =end | 
					
						
							| 
									
										
										
										
											2015-03-06 12:20:30 +03:00
										 |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         true | 
					
						
							|  |  |  |       rescue InvalidRecord, ArgumentError => e | 
					
						
							|  |  |  |         raise InvalidRecord.new "Project '#{self.id}'. #{e.message}" | 
					
						
							| 
									
										
										
										
											2014-05-08 15:34:26 +04:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-06 12:20:30 +03:00
										 |  |  |       def remove_env env | 
					
						
							|  |  |  |         self.deploy_envs.delete_if {|e| e.identifier == env} | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2014-05-08 15:34:26 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-06 12:20:30 +03:00
										 |  |  |       def add_env env | 
					
						
							|  |  |  |         raise InvalidRecord.new "Deploy environment '#{env.identifier}' for project '#{self.id}' already exist" unless self.deploy_env(env.identifier).nil? | 
					
						
							|  |  |  |         self.deploy_envs.push env | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2014-05-08 15:34:26 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-06 12:20:30 +03:00
										 |  |  |       def to_hash | 
					
						
							|  |  |  |         h = self.to_hash_without_id | 
					
						
							|  |  |  |         h["name"] = self.id | 
					
						
							|  |  |  |         h | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2014-05-08 15:34:26 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-30 15:37:43 +03:00
										 |  |  |       def deploy_info deploy_env, build_number | 
					
						
							|  |  |  |         {} | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-06 12:20:30 +03:00
										 |  |  |       def to_hash_without_id | 
					
						
							|  |  |  |         h = {} | 
					
						
							|  |  |  |         h["deploy_envs"] = self.deploy_envs.map {|e| e.to_hash} unless self.deploy_envs.nil? | 
					
						
							| 
									
										
										
										
											2015-07-16 16:01:53 +03:00
										 |  |  |         h["archived"] = self.archived if self.archived | 
					
						
							| 
									
										
										
										
											2015-03-06 12:20:30 +03:00
										 |  |  |         h["description"] = self.description | 
					
						
							|  |  |  |         if self.multi? | 
					
						
							|  |  |  |           h["type"] = MULTI_TYPE | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |         h | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2014-05-08 15:34:26 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-06 12:20:30 +03:00
										 |  |  |       def multi? | 
					
						
							|  |  |  |         self.type == MULTI_TYPE | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2014-05-08 15:34:26 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-01 17:22:38 +03:00
										 |  |  |       def create | 
					
						
							|  |  |  |         res = {} | 
					
						
							|  |  |  |         res[:before] = self.run_hook :before_create | 
					
						
							|  |  |  |         Devops::Db.connector.project_insert self | 
					
						
							|  |  |  |         res[:after] = self.run_hook :after_create | 
					
						
							|  |  |  |         res | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       def delete | 
					
						
							|  |  |  |         res = {} | 
					
						
							|  |  |  |         res[:before] = self.run_hook :before_delete | 
					
						
							|  |  |  |         Devops::Db.connector.project_delete self.id | 
					
						
							|  |  |  |         res[:after] = self.run_hook :after_delete | 
					
						
							|  |  |  |         res | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-06 12:20:30 +03:00
										 |  |  |       def self.build_from_bson p | 
					
						
							|  |  |  |         p["name"] = p["_id"] | 
					
						
							|  |  |  |         Project.new p | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2014-05-08 15:34:26 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-06 12:20:30 +03:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2014-05-08 15:34:26 +04:00
										 |  |  |   end | 
					
						
							|  |  |  | end |