#868: vpc support
This commit is contained in:
parent
27437914a1
commit
c671e7ed54
@ -1,3 +1,4 @@
|
||||
require "app/api2/parsers/security_groups"
|
||||
require "providers/provider_factory"
|
||||
require_relative "request_handler"
|
||||
|
||||
@ -6,13 +7,15 @@ module Devops
|
||||
module Handler
|
||||
class Group < RequestHandler
|
||||
|
||||
# TODO: vpc support for ec2
|
||||
set_parser Devops::API2_0::Parser::SecurityGroupsParser
|
||||
|
||||
def groups provider
|
||||
groups_with_account(provider, nil)
|
||||
end
|
||||
|
||||
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
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
require "app/api2/parsers/network"
|
||||
require "providers/provider_factory"
|
||||
require_relative "request_handler"
|
||||
|
||||
@ -6,13 +7,16 @@ module Devops
|
||||
module Handler
|
||||
class Network < RequestHandler
|
||||
|
||||
set_parser Devops::API2_0::Parser::NetworkParser
|
||||
|
||||
def networks provider
|
||||
networks_with_account provider, nil
|
||||
end
|
||||
|
||||
def networks_with_account 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
|
||||
|
||||
@ -33,12 +33,17 @@ module Devops
|
||||
end
|
||||
|
||||
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)
|
||||
::Provider::ProviderFactory.delete_account(provider, account)
|
||||
account.to_hash
|
||||
end
|
||||
|
||||
def account_vpcs provider, name
|
||||
Devops::Db.connector.provider_account(provider, name)
|
||||
::Provider::ProviderFactory.get(provider, name).describe_vpcs
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
15
devops-service/app/api2/parsers/network.rb
Normal file
15
devops-service/app/api2/parsers/network.rb
Normal 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
|
||||
|
||||
15
devops-service/app/api2/parsers/security_groups.rb
Normal file
15
devops-service/app/api2/parsers/security_groups.rb
Normal 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
|
||||
|
||||
@ -13,6 +13,9 @@ module Devops
|
||||
# - headers :
|
||||
# - Accept: application/json
|
||||
#
|
||||
# * Params:
|
||||
# vpc-id - string
|
||||
#
|
||||
# * *Returns* :
|
||||
# - ec2:
|
||||
# {
|
||||
@ -43,7 +46,6 @@ module Devops
|
||||
# ]
|
||||
# }
|
||||
# }
|
||||
# TODO: vpc support for ec2
|
||||
app.get_with_headers "/groups/:provider", :headers => [:accept] do |provider|
|
||||
check_privileges("group", "r")
|
||||
check_provider(provider)
|
||||
|
||||
@ -13,6 +13,9 @@ module Devops
|
||||
# - headers :
|
||||
# - Accept: application/json
|
||||
#
|
||||
# * Params:
|
||||
# vpc-id - string
|
||||
#
|
||||
# * *Returns* : array of strings
|
||||
# - ec2:
|
||||
# [
|
||||
|
||||
@ -115,7 +115,23 @@ module Devops
|
||||
app.delete_with_headers "/provider/:provider/account/:account_name", :headers => [:accept, :content_type] do |provider, account_name|
|
||||
check_privileges("provider", "w")
|
||||
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
|
||||
|
||||
puts "Provider routes initialized"
|
||||
|
||||
@ -13,6 +13,13 @@ module Connectors
|
||||
collection.find({provider: provider}).to_a.map{|bson| c.build_from_bson(bson)}
|
||||
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
|
||||
'provider_accounts'
|
||||
end
|
||||
|
||||
@ -12,21 +12,7 @@ module Devops
|
||||
class CloudDeployEnv < DeployEnvBase
|
||||
|
||||
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,
|
||||
::Validators::DeployEnv::Image,
|
||||
::Validators::DeployEnv::Groups,
|
||||
|
||||
@ -4,6 +4,11 @@ module Devops
|
||||
module Model
|
||||
class DeployEnvEc2 < CloudDeployEnv
|
||||
|
||||
attr_accessor :vpc_id
|
||||
|
||||
set_field_validators :vpc_id, ::Validators::FieldValidator::Nil,
|
||||
::Validators::FieldValidator::FieldType::String,
|
||||
::Validators::FieldValidator::Vpc
|
||||
=begin
|
||||
@Deprecated
|
||||
types :identifier => {:type => String, :empty => false},
|
||||
@ -34,6 +39,11 @@ module Devops
|
||||
if self.subnets.size > 1
|
||||
self.subnets = [ self.subnets[0] ]
|
||||
end
|
||||
self.vpc_id = d["vpc_id"]
|
||||
end
|
||||
|
||||
def to_hash
|
||||
super().merge({"vpc_id" => self.vpc_id})
|
||||
end
|
||||
|
||||
def self.create hash
|
||||
|
||||
@ -33,7 +33,7 @@ class MongoConnector
|
||||
[:keys, :key, :key_insert, :key_delete] => :keys_connector,
|
||||
[:save_report, :report, :reports, :set_report_status, :set_report_server_data, :add_report_subreports] => :reports_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)
|
||||
|
||||
21
devops-service/db/validators/field_validators/vpc.rb
Normal file
21
devops-service/db/validators/field_validators/vpc.rb
Normal 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
|
||||
|
||||
@ -14,6 +14,15 @@ module Provider
|
||||
"stack_#{self.ssh_key}-#{s.project}-#{s.deploy_env}-#{Time.now.to_i}"
|
||||
end
|
||||
|
||||
|
||||
def networks filters={}
|
||||
[]
|
||||
end
|
||||
|
||||
def groups filters={}
|
||||
{}
|
||||
end
|
||||
|
||||
protected
|
||||
def connection_compute options
|
||||
Fog::Compute.new( options )
|
||||
|
||||
@ -51,14 +51,8 @@ module Provider
|
||||
end
|
||||
end
|
||||
|
||||
def groups filters=nil
|
||||
buf = {}
|
||||
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
|
||||
def groups filters={}
|
||||
g = self.compute.describe_security_groups(filters)
|
||||
convert_groups(g.body["securityGroupInfo"])
|
||||
end
|
||||
|
||||
@ -72,12 +66,12 @@ module Provider
|
||||
end
|
||||
end
|
||||
|
||||
def networks_detail
|
||||
self.networks
|
||||
def networks_detail filters={}
|
||||
self.networks(filters)
|
||||
end
|
||||
|
||||
def networks
|
||||
self.compute.describe_subnets.body["subnetSet"].select{|n| n["state"] == "available"}.map do |n|
|
||||
def networks filters={}
|
||||
self.compute.describe_subnets(filters).body["subnetSet"].select{|n| n["state"] == "available"}.map do |n|
|
||||
{
|
||||
"cidr" => n["cidrBlock"],
|
||||
"vpcId" => n["vpcId"],
|
||||
@ -327,6 +321,10 @@ module Provider
|
||||
def create_default_stack_name s
|
||||
"stack-#{self.ssh_key}-#{s.project}-#{s.deploy_env}-#{Time.now.to_i}".gsub('_', '-')
|
||||
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
|
||||
|
||||
def convert_groups list
|
||||
|
||||
@ -30,7 +30,7 @@ module Provider
|
||||
PROVIDER
|
||||
end
|
||||
|
||||
def groups filter=nil
|
||||
def groups filters={}
|
||||
convert_groups(compute.list_security_groups.body["security_groups"])
|
||||
end
|
||||
|
||||
@ -55,8 +55,8 @@ module Provider
|
||||
end
|
||||
end
|
||||
|
||||
def networks_detail
|
||||
net = self.network
|
||||
def networks_detail filters={}
|
||||
net = self.network(filters)
|
||||
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|
|
||||
sn = subnets.detect{|s| n["subnets"][0] == s["id"]}
|
||||
@ -68,7 +68,7 @@ module Provider
|
||||
}
|
||||
end
|
||||
|
||||
def networks
|
||||
def networks filters={}
|
||||
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|
|
||||
{
|
||||
|
||||
@ -23,18 +23,10 @@ module Provider
|
||||
[]
|
||||
end
|
||||
|
||||
def groups filter=nil
|
||||
{}
|
||||
end
|
||||
|
||||
def images filters
|
||||
[]
|
||||
end
|
||||
|
||||
def networks
|
||||
[]
|
||||
end
|
||||
|
||||
def networks_detail
|
||||
self.networks
|
||||
end
|
||||
|
||||
Loading…
Reference in New Issue
Block a user