86 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			86 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| 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
 | |
| 
 | |
|     p = ::Provider::ProviderFactory.get(self.provider)
 | |
|     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
 | 
