diff --git a/devops-service/app/api2/handlers/provider.rb b/devops-service/app/api2/handlers/provider.rb index 26006d9..f7833b9 100644 --- a/devops-service/app/api2/handlers/provider.rb +++ b/devops-service/app/api2/handlers/provider.rb @@ -10,7 +10,7 @@ module Devops module Handler class Provider < RequestHandler - set_parser Devops::API2_0::Parser::CloudAccountsParser + set_parser Devops::API2_0::Parser::ProviderParser def providers ::Provider::ProviderFactory.providers @@ -21,6 +21,8 @@ module Devops end def add_account provider + account = ::Provider::ProviderFactory.get(provider).create_account(parser.account) + Devops::Db.connector.provider_accounts_insert(account) end def delete_account name, provider diff --git a/devops-service/app/api2/parsers/provider.rb b/devops-service/app/api2/parsers/provider.rb index bbca935..38d3670 100644 --- a/devops-service/app/api2/parsers/provider.rb +++ b/devops-service/app/api2/parsers/provider.rb @@ -3,7 +3,11 @@ require_relative "request_parser" module Devops module API2_0 module Parser - class CloudAccountsParser < RequestParser + class ProviderParser < RequestParser + + def account + create_object_from_json_body + end end end diff --git a/devops-service/app/api2/routes/provider.rb b/devops-service/app/api2/routes/provider.rb index 717b4e1..85dee99 100644 --- a/devops-service/app/api2/routes/provider.rb +++ b/devops-service/app/api2/routes/provider.rb @@ -67,33 +67,40 @@ module Devops json Devops::API2_0::Handler::Provider.new(request).accounts(provider) end - hash = {} - hash["PUT"] = lambda { |provider| + # Create provider account for :provider + # + # * *Request* + # - method : POST + # - headers : + # - Accept: application/json + # - Content-Type: application/json + # - body : + # { + # + # + # } + # + # * *Returns* : 201 + app.post_with_headers "/provider/:provider/account", :headers => [:accept, :content_type] do |provider| check_privileges("provider", "w") check_provider(provider) - create_response("Updated", {:images => Devops::API2_0::Handler::Provider.new(request).add_account(provider)}) - } + create_response("Updated", {:account => Devops::API2_0::Handler::Provider.new(request).add_account(provider)}, 201) + end - # Delete image ids from filter for :provider + # Delete account with name :account_name for :provider # # * *Request* # - method : DELETE # - headers : # - Accept: application/json # - Content-Type: application/json - # - body : - # [ - # "image_id" - # ] -> array of image ids to delete from filter # - # * *Returns* : list of images filters for :provider - hash["DELETE"] = lambda { |provider, account_name| + # * *Returns* : 200 + 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", {:images => Devops::API2_0::Handler::Provider.new(request).delete_account(provider)}) - } - - app.multi_routes "/provider/:provider/account/:account_name", {:headers => [:accept, :content_type]}, hash + create_response("Deleted", {:account => Devops::API2_0::Handler::Provider.new(request).delete_account(provider)}) + end puts "Provider routes initialized" end diff --git a/devops-service/db/mongo/connectors/helpers/insert_command.rb b/devops-service/db/mongo/connectors/helpers/insert_command.rb index c00cc48..ed2e5bd 100644 --- a/devops-service/db/mongo/connectors/helpers/insert_command.rb +++ b/devops-service/db/mongo/connectors/helpers/insert_command.rb @@ -17,7 +17,9 @@ module Connectors def insert(record) begin record.validate! - collection.insert(record.to_mongo_hash) + hash = record.to_mongo_hash + hash["created_at"] = Time.now.to_i + collection.insert(hash) record rescue Mongo::OperationFailure => e if e.message =~ /^11000/ diff --git a/devops-service/db/mongo/models/mongo_model.rb b/devops-service/db/mongo/models/mongo_model.rb index 5c625d2..7bb3e32 100644 --- a/devops-service/db/mongo/models/mongo_model.rb +++ b/devops-service/db/mongo/models/mongo_model.rb @@ -7,6 +7,8 @@ module Devops module Model class MongoModel + attr_accessor :created_at + # multi_json sends argument to 'to_json' method def to_json arg=nil JSON.pretty_generate self.to_hash @@ -76,6 +78,7 @@ module Devops # :empty - can param be empty? (false) # :nil - can param be nil? (false) # :value_type - type of array element (String) + # TODO: @deprecated def self.types types define_method :validate_fields_types do t = types.keys diff --git a/devops-service/db/mongo/models/provider_accounts/ec2_provider_account.rb b/devops-service/db/mongo/models/provider_accounts/ec2_provider_account.rb index 20eb174..219336c 100644 --- a/devops-service/db/mongo/models/provider_accounts/ec2_provider_account.rb +++ b/devops-service/db/mongo/models/provider_accounts/ec2_provider_account.rb @@ -8,6 +8,7 @@ module Devops def initialize a={} super(a) + self.provider = Provider::Ec2::PROVIDER self.availability_zone = a["availability_zone"] self.access_key_id = a["access_key_id"] end @@ -15,18 +16,25 @@ module Devops def to_list_hash s = super s["availability_zone"] = self.availability_zone + s end def to_mongo_hash s = super s["availability_zone"] = self.availability_zone s["access_key_id"] = self.access_key_id + s end def self.build_from_bson a a["account_name"] = a["_id"] Ec2ProviderAccount.new a end + + # TODO: remove + def validate_fields_types + + end end end end diff --git a/devops-service/db/mongo/models/provider_accounts/provider_account.rb b/devops-service/db/mongo/models/provider_accounts/provider_account.rb index 5d30243..56cd315 100644 --- a/devops-service/db/mongo/models/provider_accounts/provider_account.rb +++ b/devops-service/db/mongo/models/provider_accounts/provider_account.rb @@ -15,6 +15,7 @@ module Devops self.ssh_key = a["ssh_key"] self.provider = a["provider"] self.certificate = a["certificate"] + self.created_at = a["created_at"] end def to_list_hash @@ -27,7 +28,8 @@ module Devops "description" => self.description, "ssh_key" => self.ssh_key, "provider" => self.provider, - "certificate" => self.certificate + "certificate" => self.certificate, + "created_at" => self.created_at } end diff --git a/devops-service/db/mongo/mongo_connector.rb b/devops-service/db/mongo/mongo_connector.rb index 12cafd5..20f12e1 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] => :reports_connector, [:insert_statistic, :search_statistic] => :statistics_connector, - [:provider_accounts] => :provider_accounts_connector + [:provider_accounts, :provider_accounts_insert] => :provider_accounts_connector ) def initialize(db, host, port=27017, user=nil, password=nil) diff --git a/devops-service/providers/base_provider.rb b/devops-service/providers/base_provider.rb index a588eec..a7d27dc 100644 --- a/devops-service/providers/base_provider.rb +++ b/devops-service/providers/base_provider.rb @@ -10,6 +10,10 @@ module Provider Devops::Db.connector.provider_accounts(self.name) end + def create_account hash + raise "override me" + end + def create_default_chef_node_name s "#{self.ssh_key}-#{s.project}-#{s.deploy_env}-#{Time.now.to_i}" end diff --git a/devops-service/providers/connection_factory.rb b/devops-service/providers/connection_factory.rb new file mode 100644 index 0000000..16cb946 --- /dev/null +++ b/devops-service/providers/connection_factory.rb @@ -0,0 +1,13 @@ +module Provider + class ConnectionFactory + + def init + + end + + def connection account_name + @connections[account_name] + end + end +end + diff --git a/devops-service/providers/ec2.rb b/devops-service/providers/ec2.rb index ed3f07d..161c3af 100644 --- a/devops-service/providers/ec2.rb +++ b/devops-service/providers/ec2.rb @@ -1,5 +1,6 @@ require "exceptions/conflict_exception" require "providers/base_provider" +require "db/mongo/models/provider_accounts/ec2_provider_account" module Provider # Provider for Amazon EC2 @@ -33,6 +34,10 @@ module Provider super and !(empty_param?(o[:aws_access_key_id]) or empty_param?(o[:aws_secret_access_key])) end + def create_account hash + Devops::Model::Ec2ProviderAccount.new(hash) + end + def name PROVIDER end diff --git a/devops-service/providers/ec2_connection_factory.rb b/devops-service/providers/ec2_connection_factory.rb new file mode 100644 index 0000000..120c190 --- /dev/null +++ b/devops-service/providers/ec2_connection_factory.rb @@ -0,0 +1,13 @@ +require_relative "connection_factory" +module Provider + class Ec2ConnectionFactory < ConnectionFactory + + def init + + end + + def connection account_name + @connections + end + end +end