#868: vpc support

This commit is contained in:
amartynov 2015-11-17 12:14:02 +03:00
parent 27437914a1
commit c671e7ed54
17 changed files with 131 additions and 45 deletions

View File

@ -1,3 +1,4 @@
require "app/api2/parsers/security_groups"
require "providers/provider_factory" require "providers/provider_factory"
require_relative "request_handler" require_relative "request_handler"
@ -6,13 +7,15 @@ module Devops
module Handler module Handler
class Group < RequestHandler class Group < RequestHandler
# TODO: vpc support for ec2 set_parser Devops::API2_0::Parser::SecurityGroupsParser
def groups provider def groups provider
groups_with_account(provider, nil) groups_with_account(provider, nil)
end end
def groups_with_account provider, account def groups_with_account provider, account
::Provider::ProviderFactory.get(provider, account).groups()#params available_keys = ["vpc-id"]
::Provider::ProviderFactory.get(provider, account).groups(parser.security_groups.select{|k,v| available_keys.include?(k)})
end end
end end
end end

View File

@ -1,3 +1,4 @@
require "app/api2/parsers/network"
require "providers/provider_factory" require "providers/provider_factory"
require_relative "request_handler" require_relative "request_handler"
@ -6,13 +7,16 @@ module Devops
module Handler module Handler
class Network < RequestHandler class Network < RequestHandler
set_parser Devops::API2_0::Parser::NetworkParser
def networks provider def networks provider
networks_with_account provider, nil networks_with_account provider, nil
end end
def networks_with_account provider, account def networks_with_account provider, account
p = ::Provider::ProviderFactory.get(provider, account) p = ::Provider::ProviderFactory.get(provider, account)
p.networks_detail available_keys = ["vpc-id"]
p.networks_detail(parser.networks.select{|k,v| available_keys.include?(k)})
end end
end end
end end

View File

@ -33,12 +33,17 @@ module Devops
end end
def delete_account name, provider def delete_account name, provider
account = Devops::Db.connector.provider_accounts_show(name) account = Devops::Db.connector.provider_account(provider, name)
Devops::Db.connector.provider_accounts_delete(name) Devops::Db.connector.provider_accounts_delete(name)
::Provider::ProviderFactory.delete_account(provider, account) ::Provider::ProviderFactory.delete_account(provider, account)
account.to_hash account.to_hash
end end
def account_vpcs provider, name
Devops::Db.connector.provider_account(provider, name)
::Provider::ProviderFactory.get(provider, name).describe_vpcs
end
end end
end end
end end

View File

@ -0,0 +1,15 @@
require_relative "request_parser"
module Devops
module API2_0
module Parser
class NetworkParser < RequestParser
def networks
@params
end
end
end
end
end

View File

@ -0,0 +1,15 @@
require_relative "request_parser"
module Devops
module API2_0
module Parser
class SecurityGroupsParser < RequestParser
def security_groups
@params
end
end
end
end
end

View File

@ -13,6 +13,9 @@ module Devops
# - headers : # - headers :
# - Accept: application/json # - Accept: application/json
# #
# * Params:
# vpc-id - string
#
# * *Returns* : # * *Returns* :
# - ec2: # - ec2:
# { # {
@ -43,7 +46,6 @@ module Devops
# ] # ]
# } # }
# } # }
# TODO: vpc support for ec2
app.get_with_headers "/groups/:provider", :headers => [:accept] do |provider| app.get_with_headers "/groups/:provider", :headers => [:accept] do |provider|
check_privileges("group", "r") check_privileges("group", "r")
check_provider(provider) check_provider(provider)

View File

@ -13,6 +13,9 @@ module Devops
# - headers : # - headers :
# - Accept: application/json # - Accept: application/json
# #
# * Params:
# vpc-id - string
#
# * *Returns* : array of strings # * *Returns* : array of strings
# - ec2: # - ec2:
# [ # [

View File

@ -115,7 +115,23 @@ module Devops
app.delete_with_headers "/provider/:provider/account/:account_name", :headers => [:accept, :content_type] do |provider, account_name| app.delete_with_headers "/provider/:provider/account/:account_name", :headers => [:accept, :content_type] do |provider, account_name|
check_privileges("provider", "w") check_privileges("provider", "w")
check_provider(provider) check_provider(provider)
create_response("Deleted", {:account => Devops::API2_0::Handler::Provider.new(request).delete_account(provider)}) create_response("Deleted", {:account => Devops::API2_0::Handler::Provider.new(request).delete_account(account_name, provider)})
end
# Describe vpc for account with name :account_name for provider ec2
#
# * *Request*
# - method : GET
# - headers :
# - Accept: application/json
# - Content-Type: application/json
#
# * *Returns* : 200
app.get_with_headers "/provider/ec2/account/:account_name/vpcs", :headers => [:accept, :content_type] do |account_name|
provider = "ec2"
check_privileges("provider", "r")
check_provider(provider)
json Devops::API2_0::Handler::Provider.new(request).account_vpcs(provider, account_name)
end end
puts "Provider routes initialized" puts "Provider routes initialized"

View File

@ -13,6 +13,13 @@ module Connectors
collection.find({provider: provider}).to_a.map{|bson| c.build_from_bson(bson)} collection.find({provider: provider}).to_a.map{|bson| c.build_from_bson(bson)}
end end
def provider_account provider, account
c = Provider::ProviderFactory.get_account_class(provider)
bson = collection.find({provider: provider, _id: account}).to_a.first
raise RecordNotFound.new("'Account #{account}' for provider '#{provider}' not found") unless bson
c.build_from_bson(bson)
end
def collection_name def collection_name
'provider_accounts' 'provider_accounts'
end end

View File

@ -12,21 +12,7 @@ module Devops
class CloudDeployEnv < DeployEnvBase class CloudDeployEnv < DeployEnvBase
attr_accessor :flavor, :image, :subnets, :groups, :stack_template attr_accessor :flavor, :image, :subnets, :groups, :stack_template
=begin
@Deprecated
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},
:stack_template => {:type => String, :empty => false, :nil => true}
=end
#TODO: account validator
set_validators ::Validators::DeployEnv::Flavor, set_validators ::Validators::DeployEnv::Flavor,
::Validators::DeployEnv::Image, ::Validators::DeployEnv::Image,
::Validators::DeployEnv::Groups, ::Validators::DeployEnv::Groups,

View File

@ -4,6 +4,11 @@ module Devops
module Model module Model
class DeployEnvEc2 < CloudDeployEnv class DeployEnvEc2 < CloudDeployEnv
attr_accessor :vpc_id
set_field_validators :vpc_id, ::Validators::FieldValidator::Nil,
::Validators::FieldValidator::FieldType::String,
::Validators::FieldValidator::Vpc
=begin =begin
@Deprecated @Deprecated
types :identifier => {:type => String, :empty => false}, types :identifier => {:type => String, :empty => false},
@ -34,6 +39,11 @@ module Devops
if self.subnets.size > 1 if self.subnets.size > 1
self.subnets = [ self.subnets[0] ] self.subnets = [ self.subnets[0] ]
end end
self.vpc_id = d["vpc_id"]
end
def to_hash
super().merge({"vpc_id" => self.vpc_id})
end end
def self.create hash def self.create hash

View File

@ -33,7 +33,7 @@ class MongoConnector
[:keys, :key, :key_insert, :key_delete] => :keys_connector, [:keys, :key, :key_insert, :key_delete] => :keys_connector,
[:save_report, :report, :reports, :set_report_status, :set_report_server_data, :add_report_subreports] => :reports_connector, [:save_report, :report, :reports, :set_report_status, :set_report_server_data, :add_report_subreports] => :reports_connector,
[:insert_statistic, :search_statistic] => :statistics_connector, [:insert_statistic, :search_statistic] => :statistics_connector,
[:provider_accounts, :provider_accounts_insert, :provider_accounts_delete, :provider_accounts_show] => :provider_accounts_connector [:provider_accounts, :provider_accounts_insert, :provider_accounts_delete, :provider_account] => :provider_accounts_connector
) )
def initialize(db, host, port=27017, user=nil, password=nil) def initialize(db, host, port=27017, user=nil, password=nil)

View File

@ -0,0 +1,21 @@
require_relative "base"
module Validators
module FieldValidator
class Vpc < Base
def valid?
provider = ::Provider::ProviderFactory.get(@model.provider, @model.provider_account)
vpcs = provider.describe_vpcs
vpcs.keys.include?(@value)
rescue
raise "Invalid provider account '#{@model.provider_account}'"
end
def message
"Invalid vpc '#{@value}'."
end
end
end
end

View File

@ -14,6 +14,15 @@ module Provider
"stack_#{self.ssh_key}-#{s.project}-#{s.deploy_env}-#{Time.now.to_i}" "stack_#{self.ssh_key}-#{s.project}-#{s.deploy_env}-#{Time.now.to_i}"
end end
def networks filters={}
[]
end
def groups filters={}
{}
end
protected protected
def connection_compute options def connection_compute options
Fog::Compute.new( options ) Fog::Compute.new( options )

View File

@ -51,14 +51,8 @@ module Provider
end end
end end
def groups filters=nil def groups filters={}
buf = {} g = self.compute.describe_security_groups(filters)
buf = filters.select{|k,v| ["vpc-id"].include?(k)} unless filters.nil?
g = if buf.empty?
self.compute.describe_security_groups
else
self.compute.describe_security_groups(buf)
end
convert_groups(g.body["securityGroupInfo"]) convert_groups(g.body["securityGroupInfo"])
end end
@ -72,12 +66,12 @@ module Provider
end end
end end
def networks_detail def networks_detail filters={}
self.networks self.networks(filters)
end end
def networks def networks filters={}
self.compute.describe_subnets.body["subnetSet"].select{|n| n["state"] == "available"}.map do |n| self.compute.describe_subnets(filters).body["subnetSet"].select{|n| n["state"] == "available"}.map do |n|
{ {
"cidr" => n["cidrBlock"], "cidr" => n["cidrBlock"],
"vpcId" => n["vpcId"], "vpcId" => n["vpcId"],
@ -327,6 +321,10 @@ module Provider
def create_default_stack_name s def create_default_stack_name s
"stack-#{self.ssh_key}-#{s.project}-#{s.deploy_env}-#{Time.now.to_i}".gsub('_', '-') "stack-#{self.ssh_key}-#{s.project}-#{s.deploy_env}-#{Time.now.to_i}".gsub('_', '-')
end end
def describe_vpcs
self.compute.describe_vpcs.body["vpcSet"].select{|v| v["state"] == "available"}.map{|v| {"vpc_id" => v["vpcId"], "cidr" => v["cidrBlock"] } }
end
private private
def convert_groups list def convert_groups list

View File

@ -30,7 +30,7 @@ module Provider
PROVIDER PROVIDER
end end
def groups filter=nil def groups filters={}
convert_groups(compute.list_security_groups.body["security_groups"]) convert_groups(compute.list_security_groups.body["security_groups"])
end end
@ -55,8 +55,8 @@ module Provider
end end
end end
def networks_detail def networks_detail filters={}
net = self.network net = self.network(filters)
subnets = net.list_subnets.body["subnets"].select{|s| net.current_tenant["id"] == s["tenant_id"]} subnets = net.list_subnets.body["subnets"].select{|s| net.current_tenant["id"] == s["tenant_id"]}
net.list_networks.body["networks"].select{|n| n["router:external"] == false and n["status"] == "ACTIVE" and net.current_tenant["id"] == n["tenant_id"]}.map{|n| net.list_networks.body["networks"].select{|n| n["router:external"] == false and n["status"] == "ACTIVE" and net.current_tenant["id"] == n["tenant_id"]}.map{|n|
sn = subnets.detect{|s| n["subnets"][0] == s["id"]} sn = subnets.detect{|s| n["subnets"][0] == s["id"]}
@ -68,7 +68,7 @@ module Provider
} }
end end
def networks def networks filters={}
net = self.network net = self.network
net.list_networks.body["networks"].select{|n| n["router:external"] == false and n["status"] == "ACTIVE" and net.current_tenant["id"] == n["tenant_id"]}.map{|n| net.list_networks.body["networks"].select{|n| n["router:external"] == false and n["status"] == "ACTIVE" and net.current_tenant["id"] == n["tenant_id"]}.map{|n|
{ {

View File

@ -23,18 +23,10 @@ module Provider
[] []
end end
def groups filter=nil
{}
end
def images filters def images filters
[] []
end end
def networks
[]
end
def networks_detail def networks_detail
self.networks self.networks
end end