119 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			119 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| require "db/mongo/models/mongo_model"
 | |
| require "db/exceptions/invalid_record"
 | |
| require "commands/deploy_env"
 | |
| 
 | |
| class DeployEnvMulti < MongoModel
 | |
| 
 | |
|   include DeployEnvCommands
 | |
| 
 | |
|   attr_accessor :identifier, :servers, :expires, :users
 | |
| 
 | |
|   types :identifier => {:type => String, :empty => false},
 | |
|         :expires => {:type => String, :empty => false, :nil => true},
 | |
|         :users => {:type => Array, :empty => true},
 | |
|         :servers => {:type => Array, :empty => false, :value_type => Hash}
 | |
| 
 | |
|   def initialize d={}
 | |
|     self.identifier = d["identifier"]
 | |
|     self.expires = d["expires"]
 | |
|     self.servers = d["servers"]
 | |
|     b = d["users"] || []
 | |
|     self.users = (b.is_a?(Array) ? b.uniq : b)
 | |
|   end
 | |
| 
 | |
|   def validate!
 | |
|     super
 | |
|     e = []
 | |
|     check_users!(self.users)
 | |
|     unless self.expires.nil?
 | |
|       check_expires!(self.expires)
 | |
|     end
 | |
|     self.servers.each_with_index do |server, i|
 | |
|       begin
 | |
|         if server["priority"].nil?
 | |
|           server["priority"] = 100
 | |
|         else
 | |
|           begin
 | |
|             Integer(server["priority"])
 | |
|           rescue ArgumentError, TypeError
 | |
|             raise InvalidRecord.new("Parameter 'priority' should be an integer")
 | |
|           end
 | |
|         end
 | |
| 
 | |
|         if !server["subprojects"].is_a?(Array) or server["subprojects"].empty?
 | |
|           raise InvalidRecord.new("Parameter 'subprojects' must be a not empty array")
 | |
|         end
 | |
|         if server["subprojects"].size > 1
 | |
|           check_provider(server["provider"])
 | |
|           # strings
 | |
|           %w{image flavor provider}.each do |p|
 | |
|             begin
 | |
|               check_string!(server[p])
 | |
|             rescue ArgumentError
 | |
|               raise InvalidRecord.new("Parameter '#{p}' must be a not empty string")
 | |
|             end
 | |
|           end
 | |
|           # arrays
 | |
|           %w{subnets groups}.each do |p|
 | |
|             begin
 | |
|               raise ArgumentError if !server[p].is_a?(Array) or server[p].empty?
 | |
|               server[p].each do |v|
 | |
|                 raise ArgumentError unless v.is_a?(String)
 | |
|               end
 | |
|             rescue ArgumentError
 | |
|               raise InvalidRecord.new("Parameter '#{p}' must be a not empty array of strings")
 | |
|             end
 | |
|           end
 | |
| 
 | |
|           p = ::Provider::ProviderFactory.get(server["provider"])
 | |
|           check_flavor!(p, server["flavor"])
 | |
|           check_image!(p, server["image"])
 | |
|           check_subnets_and_groups!(p, server["subnets"], server["groups"])
 | |
|         end
 | |
|         names = {}
 | |
|         server["subprojects"].each_with_index do |sp, spi|
 | |
|           begin
 | |
|             raise InvalidRecord.new("Parameter 'subprojects' must contains objects only") unless sp.is_a?(Hash)
 | |
|             %w{name env}.each do |p|
 | |
|               begin
 | |
|                 check_string!(sp[p])
 | |
|               rescue ArgumentError
 | |
|                 raise InvalidRecord.new("Parameter '#{p}' must be a not empty string")
 | |
|               end
 | |
|             end
 | |
|           rescue  InvalidRecord => e
 | |
|             raise InvalidRecord.new("Subproject '#{spi}'. #{e.message}")
 | |
|           end
 | |
|         end
 | |
|         pdb = DevopsService.mongo.project_names_with_envs(server["subprojects"].map{|sp| sp["name"]})
 | |
|         server["subprojects"].each_with_index do |sp, spi|
 | |
|           raise InvalidRecord.new("Subproject '#{spi}'. Project '#{sp["name"]}' with env '#{sp["env"]}' does not exist") if pdb[sp["name"]].nil? or !pdb[sp["name"]].include?(sp["env"])
 | |
|         end
 | |
|       rescue InvalidRecord => e
 | |
|         raise InvalidRecord.new("Server '#{i}'. #{e.message}")
 | |
|       end
 | |
|     end
 | |
|     true
 | |
|   rescue InvalidRecord => e
 | |
|     raise InvalidRecord.new "Deploy environment '#{self.identifier}'. " + e.message
 | |
|   end
 | |
| 
 | |
|   def to_hash
 | |
|     {
 | |
|       "identifier" => self.identifier,
 | |
|       "expires" => self.expires,
 | |
|       "users" => self.users,
 | |
|       "servers" => self.servers
 | |
|     }
 | |
|   end
 | |
| 
 | |
|   def self.create_from_bson d
 | |
|     DeployEnvMulti.new(d)
 | |
|   end
 | |
| 
 | |
|   def self.create hash
 | |
|     DeployEnvMulti.new(hash)
 | |
|   end
 | |
| 
 | |
| end
 | 
