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 = ::Version2_0::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 |