diff --git a/devops-service/app/api2/handlers/group.rb b/devops-service/app/api2/handlers/group.rb index 82ed2d7..8b44aed 100644 --- a/devops-service/app/api2/handlers/group.rb +++ b/devops-service/app/api2/handlers/group.rb @@ -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 diff --git a/devops-service/app/api2/handlers/network.rb b/devops-service/app/api2/handlers/network.rb index 25c89ec..24403eb 100644 --- a/devops-service/app/api2/handlers/network.rb +++ b/devops-service/app/api2/handlers/network.rb @@ -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 diff --git a/devops-service/app/api2/handlers/provider.rb b/devops-service/app/api2/handlers/provider.rb index a054f2c..8e5445d 100644 --- a/devops-service/app/api2/handlers/provider.rb +++ b/devops-service/app/api2/handlers/provider.rb @@ -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 diff --git a/devops-service/app/api2/parsers/network.rb b/devops-service/app/api2/parsers/network.rb new file mode 100644 index 0000000..e808cc3 --- /dev/null +++ b/devops-service/app/api2/parsers/network.rb @@ -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 + diff --git a/devops-service/app/api2/parsers/security_groups.rb b/devops-service/app/api2/parsers/security_groups.rb new file mode 100644 index 0000000..80cb019 --- /dev/null +++ b/devops-service/app/api2/parsers/security_groups.rb @@ -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 + diff --git a/devops-service/app/api2/routes/group.rb b/devops-service/app/api2/routes/group.rb index 989c4fb..182d82f 100644 --- a/devops-service/app/api2/routes/group.rb +++ b/devops-service/app/api2/routes/group.rb @@ -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) diff --git a/devops-service/app/api2/routes/network.rb b/devops-service/app/api2/routes/network.rb index 5da6724..f984438 100644 --- a/devops-service/app/api2/routes/network.rb +++ b/devops-service/app/api2/routes/network.rb @@ -13,6 +13,9 @@ module Devops # - headers : # - Accept: application/json # + # * Params: + # vpc-id - string + # # * *Returns* : array of strings # - ec2: # [ diff --git a/devops-service/app/api2/routes/provider.rb b/devops-service/app/api2/routes/provider.rb index 49a797e..dd51af9 100644 --- a/devops-service/app/api2/routes/provider.rb +++ b/devops-service/app/api2/routes/provider.rb @@ -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" diff --git a/devops-service/db/mongo/connectors/provider_accounts.rb b/devops-service/db/mongo/connectors/provider_accounts.rb index 3627562..4bd235a 100644 --- a/devops-service/db/mongo/connectors/provider_accounts.rb +++ b/devops-service/db/mongo/connectors/provider_accounts.rb @@ -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 diff --git a/devops-service/db/mongo/models/deploy_env/cloud_deploy_env.rb b/devops-service/db/mongo/models/deploy_env/cloud_deploy_env.rb index 30adbf2..dc62b4d 100644 --- a/devops-service/db/mongo/models/deploy_env/cloud_deploy_env.rb +++ b/devops-service/db/mongo/models/deploy_env/cloud_deploy_env.rb @@ -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, diff --git a/devops-service/db/mongo/models/deploy_env/deploy_env_ec2.rb b/devops-service/db/mongo/models/deploy_env/deploy_env_ec2.rb index 39a455a..5377a57 100644 --- a/devops-service/db/mongo/models/deploy_env/deploy_env_ec2.rb +++ b/devops-service/db/mongo/models/deploy_env/deploy_env_ec2.rb @@ -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 diff --git a/devops-service/db/mongo/mongo_connector.rb b/devops-service/db/mongo/mongo_connector.rb index bda584e..baa47ff 100644 --- a/devops-service/db/mongo/mongo_connector.rb +++ b/devops-service/db/mongo/mongo_connector.rb @@ -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) diff --git a/devops-service/db/validators/field_validators/vpc.rb b/devops-service/db/validators/field_validators/vpc.rb new file mode 100644 index 0000000..f932dc6 --- /dev/null +++ b/devops-service/db/validators/field_validators/vpc.rb @@ -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 + diff --git a/devops-service/providers/base_provider.rb b/devops-service/providers/base_provider.rb index bf9ef34..090b5ed 100644 --- a/devops-service/providers/base_provider.rb +++ b/devops-service/providers/base_provider.rb @@ -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 ) diff --git a/devops-service/providers/ec2.rb b/devops-service/providers/ec2.rb index 52644f8..a392139 100644 --- a/devops-service/providers/ec2.rb +++ b/devops-service/providers/ec2.rb @@ -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 diff --git a/devops-service/providers/openstack.rb b/devops-service/providers/openstack.rb index 6e8249e..d4807e9 100644 --- a/devops-service/providers/openstack.rb +++ b/devops-service/providers/openstack.rb @@ -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| { diff --git a/devops-service/providers/static.rb b/devops-service/providers/static.rb index 4f1d788..4436670 100644 --- a/devops-service/providers/static.rb +++ b/devops-service/providers/static.rb @@ -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