| 
									
										
										
										
											2014-05-08 15:34:26 +04:00
										 |  |  | require "db/mongo/models/mongo_model" | 
					
						
							|  |  |  | require "db/exceptions/invalid_record" | 
					
						
							|  |  |  | require "providers/provider_factory" | 
					
						
							|  |  |  | require "commands/deploy_env" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class DeployEnv < MongoModel | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   include DeployEnvCommands | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   attr_accessor :identifier, :flavor, :image, :run_list, :subnets, :expires, :provider, :groups, :users | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   types :identifier => {:type => String, :empty => false}, | 
					
						
							|  |  |  |         :image => {:type => String, :empty => false}, | 
					
						
							|  |  |  |         :flavor => {:type => String, :empty => false}, | 
					
						
							|  |  |  |         :provider => {:type => String, :empty => false}, | 
					
						
							|  |  |  |         :expires => {:type => String, :empty => false, :nil => true}, | 
					
						
							|  |  |  |         :run_list => {:type => Array, :empty => true}, | 
					
						
							|  |  |  |         :users => {:type => Array, :empty => true}, | 
					
						
							|  |  |  |         :subnets => {:type => Array, :empty => true}, | 
					
						
							|  |  |  |         :groups => {:type => Array, :empty => false} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def initialize d={} | 
					
						
							|  |  |  |     self.identifier = d["identifier"] | 
					
						
							|  |  |  |     self.flavor = d["flavor"] | 
					
						
							|  |  |  |     self.image = d["image"] | 
					
						
							|  |  |  |     b = d["subnets"] || [] | 
					
						
							|  |  |  |     self.subnets = (b.is_a?(Array) ? b.uniq : b) | 
					
						
							|  |  |  |     b = d["run_list"] || [] | 
					
						
							|  |  |  |     self.run_list = (b.is_a?(Array) ? b.uniq : b) | 
					
						
							|  |  |  |     self.expires = d["expires"] | 
					
						
							|  |  |  |     self.provider = d["provider"] | 
					
						
							|  |  |  |     b = d["groups"] || ["default"] | 
					
						
							|  |  |  |     self.groups = (b.is_a?(Array) ? b.uniq : b) | 
					
						
							|  |  |  |     b = d["users"] || [] | 
					
						
							|  |  |  |     self.users = (b.is_a?(Array) ? b.uniq : b) | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def validate! | 
					
						
							|  |  |  |     super | 
					
						
							|  |  |  |     e = DeployEnv.validate_run_list(self.run_list) | 
					
						
							|  |  |  |     raise InvalidRecord.new "Invalid run list elements: '#{e.join("', '")}'" unless e.empty? | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     unless self.expires.nil? | 
					
						
							|  |  |  |       check_expires!(self.expires) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-18 15:11:47 +04:00
										 |  |  |     p = ::Provider::ProviderFactory.get(self.provider) | 
					
						
							| 
									
										
										
										
											2014-05-08 15:34:26 +04:00
										 |  |  |     check_flavor!(p, self.flavor) | 
					
						
							|  |  |  |     check_image!(p, self.image) | 
					
						
							|  |  |  |     check_subnets_and_groups!(p, self.subnets, self.groups) | 
					
						
							|  |  |  |     check_users!(self.users) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     true | 
					
						
							|  |  |  |   rescue InvalidRecord => e | 
					
						
							|  |  |  |     raise InvalidRecord.new "Deploy environment '#{self.identifier}'. " + e.message | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def to_hash | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       "flavor" => self.flavor, | 
					
						
							|  |  |  |       "identifier" => self.identifier, | 
					
						
							|  |  |  |       "image" => self.image, | 
					
						
							|  |  |  |       "run_list" => self.run_list, | 
					
						
							|  |  |  |       "subnets" => self.subnets, | 
					
						
							|  |  |  |       "expires" => self.expires, | 
					
						
							|  |  |  |       "provider" => self.provider, | 
					
						
							|  |  |  |       "groups" => self.groups, | 
					
						
							|  |  |  |       "users" => self.users | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def self.create_from_bson d | 
					
						
							|  |  |  |     DeployEnv.new(d) | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def self.create hash | 
					
						
							|  |  |  |     DeployEnv.new(hash) | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def self.validate_run_list list | 
					
						
							|  |  |  |     rl = /\Arole|recipe\[[\w-]+(::[\w-]+)?\]\Z/ | 
					
						
							|  |  |  |     list.select {|l| (rl =~ l).nil?} | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | end |