144 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			144 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| require "db/exceptions/invalid_record"
 | |
| require "db/exceptions/record_not_found"
 | |
| require "db/mongo/models/deploy_env/deploy_env_factory"
 | |
| require "db/mongo/models/user"
 | |
| require "db/mongo/models/deploy_env/deploy_env_multi"
 | |
| require "db/mongo/models/mongo_model"
 | |
| require "json"
 | |
| 
 | |
| module Devops
 | |
|   module Model
 | |
|     class Project < MongoModel
 | |
| 
 | |
|       attr_accessor :id, :deploy_envs, :type, :archived, :description
 | |
| 
 | |
|       types :id => {:type => String, :empty => false},
 | |
|             :deploy_envs => {:type => Array, :value_type => false, :empty => false},
 | |
|             :description => {:type => String, :empty => true, :nil => true}
 | |
| 
 | |
|       MULTI_TYPE = "multi"
 | |
| 
 | |
|       def self.fields
 | |
|         ["deploy_envs", "type", "description"]
 | |
|       end
 | |
| 
 | |
|       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?
 | |
|         self.type = p["type"]
 | |
|         self.description = p["description"]
 | |
|         self.archived = p["archived"] || false
 | |
|         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
 | |
|       end
 | |
| 
 | |
|       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
 | |
| 
 | |
|       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
 | |
|       end
 | |
| 
 | |
|       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
 | |
|       end
 | |
| 
 | |
|       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
 | |
| 
 | |
|       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!
 | |
|           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
 | |
|         end
 | |
| 
 | |
|         true
 | |
|       rescue InvalidRecord, ArgumentError => e
 | |
|         raise InvalidRecord.new "Project '#{self.id}'. #{e.message}"
 | |
|       end
 | |
| 
 | |
|       def remove_env env
 | |
|         self.deploy_envs.delete_if {|e| e.identifier == env}
 | |
|       end
 | |
| 
 | |
|       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
 | |
| 
 | |
|       def to_hash
 | |
|         h = self.to_hash_without_id
 | |
|         h["name"] = self.id
 | |
|         h
 | |
|       end
 | |
| 
 | |
|       def to_hash_without_id
 | |
|         h = {}
 | |
|         h["deploy_envs"] = self.deploy_envs.map {|e| e.to_hash} unless self.deploy_envs.nil?
 | |
|         h["archived"] = self.archived
 | |
|         h["description"] = self.description
 | |
|         if self.multi?
 | |
|           h["type"] = MULTI_TYPE
 | |
|         end
 | |
|         h
 | |
|       end
 | |
| 
 | |
|       def multi?
 | |
|         self.type == MULTI_TYPE
 | |
|       end
 | |
| 
 | |
|       def self.build_from_bson p
 | |
|         p["name"] = p["_id"]
 | |
|         Project.new p
 | |
|       end
 | |
| 
 | |
|     end
 | |
|   end
 | |
| end
 | 
