2014-05-08 15:34:26 +04:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								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 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-06-18 15:11:47 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								          p  =  :: Provider :: ProviderFactory . get ( server [ " provider " ] ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-08 15:34:26 +04:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								          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 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-18 11:00:24 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        pdb  =  :: Devops :: Db . connector . project_names_with_envs ( server [ " subprojects " ] . map { | sp |  sp [ " name " ] } ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-08 15:34:26 +04:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        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 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-02-18 11:00:24 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								  def  self . build_from_bson  d 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-08 15:34:26 +04:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    DeployEnvMulti . new ( d ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  def  self . create  hash 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    DeployEnvMulti . new ( hash ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								end