2014-05-08 15:34:26 +04:00
require " db/mongo/models/mongo_model "
2015-03-06 12:20:30 +03:00
module Devops
module Model
class DeployEnvMulti < MongoModel
2014-05-08 15:34:26 +04:00
2015-03-06 12:20:30 +03:00
attr_accessor :identifier , :servers , :expires , :users
2014-05-08 15:34:26 +04:00
2015-03-06 12:20:30 +03:00
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 }
2014-05-08 15:34:26 +04:00
2015-03-06 12:20:30 +03:00
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
2014-05-08 15:34:26 +04:00
2015-03-06 12:20:30 +03:00
def validate!
super
e = [ ]
check_users! ( self . users )
unless self . expires . nil?
check_expires! ( self . expires )
2014-05-08 15:34:26 +04:00
end
2015-03-06 12:20:30 +03:00
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
2014-05-08 15:34:26 +04:00
2015-03-06 12:20:30 +03:00
if ! server [ " subprojects " ] . is_a? ( Array ) or server [ " subprojects " ] . empty?
raise InvalidRecord . new ( " Parameter 'subprojects' must be a not empty array " )
2014-05-08 15:34:26 +04:00
end
2015-03-06 12:20:30 +03:00
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
2014-05-08 15:34:26 +04:00
end
2015-03-06 12:20:30 +03:00
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 |
2014-05-08 15:34:26 +04:00
begin
2015-03-06 12:20:30 +03:00
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 } " )
2014-05-08 15:34:26 +04:00
end
end
2015-03-06 12:20:30 +03:00
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 } " )
2014-05-08 15:34:26 +04:00
end
end
2015-03-06 12:20:30 +03:00
true
2014-05-08 15:34:26 +04:00
rescue InvalidRecord = > e
2015-03-06 12:20:30 +03:00
raise InvalidRecord . new " Deploy environment ' #{ self . identifier } '. " + e . message
2014-05-08 15:34:26 +04:00
end
2015-03-06 12:20:30 +03:00
def to_hash
{
" identifier " = > self . identifier ,
" expires " = > self . expires ,
" users " = > self . users ,
" servers " = > self . servers
}
end
2014-05-08 15:34:26 +04:00
2015-03-06 12:20:30 +03:00
def self . build_from_bson d
DeployEnvMulti . new ( d )
end
2014-05-08 15:34:26 +04:00
2015-03-06 12:20:30 +03:00
def self . create hash
DeployEnvMulti . new ( hash )
end
2014-05-08 15:34:26 +04:00
2015-03-06 12:20:30 +03:00
end
end
2014-05-08 15:34:26 +04:00
end