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
|