122 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			122 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| require "db/mongo/models/mongo_model"
 | |
| require "commands/deploy_env"
 | |
| 
 | |
| module Devops
 | |
|   module Model
 | |
|     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 = ::Devops::Db.connector.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.build_from_bson d
 | |
|         DeployEnvMulti.new(d)
 | |
|       end
 | |
| 
 | |
|       def self.create hash
 | |
|         DeployEnvMulti.new(hash)
 | |
|       end
 | |
| 
 | |
|     end
 | |
|   end
 | |
| end
 | 
