deploy envs for providers

This commit is contained in:
amartynov 2014-06-24 13:40:52 +04:00
parent cc86dd79eb
commit b0d5e8e1bd
6 changed files with 235 additions and 79 deletions

View File

@ -24,7 +24,8 @@ module DeployEnvCommands
n = subnets - networks.map{|n| n["name"]}
raise InvalidRecord.new "Invalid networks '#{n.join("', '")}'" unless n.empty?
filter = nil
filter = yield(networks)
=begin
if p.name == ::Provider::Ec2::PROVIDER
unless subnets.empty?
subnets = [ subnets[0] ] if subnets.size > 1
@ -35,6 +36,7 @@ module DeployEnvCommands
raise InvalidRecord.new "Subnets array can not be empty"
end
end
=end
g = groups - p.groups(filter).keys
raise InvalidRecord.new "Invalid groups '#{g.join("', '")}'" unless g.empty?

View File

@ -1,85 +1,25 @@
require "db/mongo/models/mongo_model"
require "db/exceptions/invalid_record"
require "providers/provider_factory"
require "commands/deploy_env"
require "db/mongo/models/deploy_env_static"
require "db/mongo/models/deploy_env_openstack"
require "db/mongo/models/deploy_env_ec2"
require "providers/static"
require "providers/openstack"
require "providers/ec2"
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
class DeployEnv
def self.create hash
DeployEnv.new(hash)
c = case(hash["provider"])
when ::Provider::Static::PROVIDER
DeployEnvStatic
when ::Provider::Ec2::PROVIDER
DeployEnvEc2
when ::Provider::Openstack::PROVIDER
DeployEnvOpenstack
else
raise InvalidRecord.new "Invalid provider '#{hash["provider"]}' for deploy envirenment '#{hash["identifier"]}'"
end
def self.validate_run_list list
rl = /\Arole|recipe\[[\w-]+(::[\w-]+)?\]\Z/
list.select {|l| (rl =~ l).nil?}
c.new(hash)
end
end

View File

@ -0,0 +1,47 @@
require "db/mongo/models/mongo_model"
require "db/exceptions/invalid_record"
require "commands/deploy_env"
class DeployEnvBase < MongoModel
include DeployEnvCommands
attr_accessor :identifier, :run_list, :expires, :provider, :users
def initialize d={}
self.identifier = d["identifier"]
b = d["run_list"] || []
self.run_list = (b.is_a?(Array) ? b.uniq : b)
self.expires = d["expires"]
self.provider = d["provider"]
b = d["users"] || []
self.users = (b.is_a?(Array) ? b.uniq : b)
end
def validate!
super
e = DeployEnvBase.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
check_users!(self.users)
end
def to_hash
{
"identifier" => self.identifier,
"run_list" => self.run_list,
"expires" => self.expires,
"provider" => self.provider,
"users" => self.users
}
end
def self.validate_run_list list
rl = /\Arole|recipe\[[\w-]+(::[\w-]+)?\]\Z/
list.select {|l| (rl =~ l).nil?}
end
end

View File

@ -0,0 +1,63 @@
require "db/mongo/models/deploy_env_base"
require "providers/provider_factory"
class DeployEnvEc2 < DeployEnvBase
attr_accessor :flavor, :image, :subnets, :groups
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={}
super(d)
self.flavor = d["flavor"]
self.image = d["image"]
b = d["subnets"] || []
self.subnets = if b.is_a?(Array)
(b.size > 1 ? [ b[0] ] : b)
else
b
end
b = d["groups"] || ["default"]
self.groups = (b.is_a?(Array) ? b.uniq : b)
end
def validate!
super
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) do |networks|
unless self.subnets.empty?
{"vpc-id" => networks.detect{|n| n["name"] == self.subnets[0]}["vpcId"] }
end
end
true
rescue InvalidRecord => e
raise InvalidRecord.new "Deploy environment '#{self.identifier}'. " + e.message
end
def to_hash
h = super
h.merge!({
"flavor" => self.flavor,
"image" => self.image,
"subnets" => self.subnets,
"groups" => self.groups
})
end
def self.create hash
DeployEnvEc2.new(hash)
end
end

View File

@ -0,0 +1,59 @@
require "db/mongo/models/deploy_env_base"
require "providers/provider_factory"
class DeployEnvOpenstack < DeployEnvBase
attr_accessor :flavor, :image, :subnets, :groups
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={}
super(d)
self.flavor = d["flavor"]
self.image = d["image"]
b = d["subnets"] || []
self.subnets = (b.is_a?(Array) ? b.uniq : b)
b = d["groups"] || ["default"]
self.groups = (b.is_a?(Array) ? b.uniq : b)
end
def validate!
super
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) do |networks|
if self.subnets.empty?
raise InvalidRecord.new "Subnets array can not be empty"
end
end
true
rescue InvalidRecord => e
raise InvalidRecord.new "Deploy environment '#{self.identifier}'. " + e.message
end
def to_hash
h = super
h.merge!({
"flavor" => self.flavor,
"image" => self.image,
"subnets" => self.subnets,
"groups" => self.groups
})
end
def self.create hash
DeployEnvOpenstack.new(hash)
end
end

View File

@ -0,0 +1,45 @@
require "db/mongo/models/deploy_env_base"
class DeployEnvStatic < DeployEnvBase
types :identifier => {: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}
def initialize d={}
super(d)
=begin
self.identifier = d["identifier"]
b = d["run_list"] || []
self.run_list = (b.is_a?(Array) ? b.uniq : b)
self.expires = d["expires"]
self.provider = d["provider"]
b = d["users"] || []
self.users = (b.is_a?(Array) ? b.uniq : b)
=end
end
def validate!
super
end
def to_hash
super
=begin
{
"identifier" => self.identifier,
"run_list" => self.run_list,
"expires" => self.expires,
"provider" => self.provider,
"users" => self.users
}
=end
end
def self.create hash
DeployEnvStatic.new(hash)
end
end