diff --git a/devops-service/commands/deploy_env.rb b/devops-service/commands/deploy_env.rb index 0a6efea..43860e8 100644 --- a/devops-service/commands/deploy_env.rb +++ b/devops-service/commands/deploy_env.rb @@ -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? diff --git a/devops-service/db/mongo/models/deploy_env.rb b/devops-service/db/mongo/models/deploy_env.rb index 717cd05..bffd553 100644 --- a/devops-service/db/mongo/models/deploy_env.rb +++ b/devops-service/db/mongo/models/deploy_env.rb @@ -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) - end - - def self.validate_run_list list - rl = /\Arole|recipe\[[\w-]+(::[\w-]+)?\]\Z/ - list.select {|l| (rl =~ l).nil?} + 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 + c.new(hash) end end diff --git a/devops-service/db/mongo/models/deploy_env_base.rb b/devops-service/db/mongo/models/deploy_env_base.rb new file mode 100644 index 0000000..9882171 --- /dev/null +++ b/devops-service/db/mongo/models/deploy_env_base.rb @@ -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 diff --git a/devops-service/db/mongo/models/deploy_env_ec2.rb b/devops-service/db/mongo/models/deploy_env_ec2.rb new file mode 100644 index 0000000..a1e5f29 --- /dev/null +++ b/devops-service/db/mongo/models/deploy_env_ec2.rb @@ -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 diff --git a/devops-service/db/mongo/models/deploy_env_openstack.rb b/devops-service/db/mongo/models/deploy_env_openstack.rb new file mode 100644 index 0000000..bab4c0b --- /dev/null +++ b/devops-service/db/mongo/models/deploy_env_openstack.rb @@ -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 diff --git a/devops-service/db/mongo/models/deploy_env_static.rb b/devops-service/db/mongo/models/deploy_env_static.rb new file mode 100644 index 0000000..b3cddb8 --- /dev/null +++ b/devops-service/db/mongo/models/deploy_env_static.rb @@ -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