diff --git a/devops-service/app/api2/handlers/provider.rb b/devops-service/app/api2/handlers/provider.rb index 51f1167..26006d9 100644 --- a/devops-service/app/api2/handlers/provider.rb +++ b/devops-service/app/api2/handlers/provider.rb @@ -1,15 +1,31 @@ +require "app/api2/parsers/provider" require "providers/provider_factory" require_relative "request_handler" +require "db/mongo/models/provider_accounts/static_provider_account" +require "db/mongo/models/provider_accounts/openstack_provider_account" +require "db/mongo/models/provider_accounts/ec2_provider_account" module Devops module API2_0 module Handler class Provider < RequestHandler + set_parser Devops::API2_0::Parser::CloudAccountsParser + def providers ::Provider::ProviderFactory.providers end + def accounts provider + ::Provider::ProviderFactory.get(provider).accounts + end + + def add_account provider + end + + def delete_account name, provider + end + end end end diff --git a/devops-service/app/api2/parsers/provider.rb b/devops-service/app/api2/parsers/provider.rb new file mode 100644 index 0000000..bbca935 --- /dev/null +++ b/devops-service/app/api2/parsers/provider.rb @@ -0,0 +1,12 @@ +require_relative "request_parser" + +module Devops + module API2_0 + module Parser + class CloudAccountsParser < RequestParser + + end + end + end +end + diff --git a/devops-service/app/api2/routes/provider.rb b/devops-service/app/api2/routes/provider.rb index 0c1f627..717b4e1 100644 --- a/devops-service/app/api2/routes/provider.rb +++ b/devops-service/app/api2/routes/provider.rb @@ -26,6 +26,75 @@ module Devops json Devops::API2_0::Handler::Provider.new(request).providers end + # Get list of provider accounts + # + # * *Request* + # - method : GET + # - headers : + # - Accept: application/json + # + # * *Returns* : array of strings + # - ec2: + # { + # "account_name": "", + # "description": "", + # "access_key_id" : "", + # "ssh_key": "", + # "certificate" : "path to file", + # "availability_zone": "" + # + # } + # - openstack: + # { + # "account_name": "", + # "description": "", + # "username": "", + # "auth_url": "", + # "tenant": "", + # "ssh_key": "", + # "certificate" : "path to file" + # } + # - static: + # { + # "account_name": "", + # "description": "", + # "ssh_key": "", + # "certificate" : "path to file" + # } + app.get_with_headers "/provider/:provider/accounts", :headers => [:accept] do |provider| + check_privileges("provider", "r") + check_provider(provider) + json Devops::API2_0::Handler::Provider.new(request).accounts(provider) + end + + hash = {} + hash["PUT"] = lambda { |provider| + check_privileges("provider", "w") + check_provider(provider) + create_response("Updated", {:images => Devops::API2_0::Handler::Provider.new(request).add_account(provider)}) + } + + # Delete image ids from filter 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| + 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 + puts "Provider routes initialized" end end diff --git a/devops-service/db/mongo/connectors/provider_accounts.rb b/devops-service/db/mongo/connectors/provider_accounts.rb new file mode 100644 index 0000000..3627562 --- /dev/null +++ b/devops-service/db/mongo/connectors/provider_accounts.rb @@ -0,0 +1,30 @@ +module Connectors + class ProviderAccounts < Base + + include Helpers::InsertCommand, + Helpers::DeleteCommand + + def initialize(db) + super(db) + end + + def provider_accounts provider + c = Provider::ProviderFactory.get_account_class(provider) + collection.find({provider: provider}).to_a.map{|bson| c.build_from_bson(bson)} + end + + def collection_name + 'provider_accounts' + end + + private + + def model_from_bson(bson) + c = Provider::ProviderFactory.get_account_class(bson["provider"]) + raise InvalidRecord.new "Invalid provider '#{bson["provider"]}' for account '#{bson["_id"]}'" if c.nil? + c.build_from_bson(bson) + end + end + +end + diff --git a/devops-service/db/mongo/models/mongo_model.rb b/devops-service/db/mongo/models/mongo_model.rb index 7f64b05..5c625d2 100644 --- a/devops-service/db/mongo/models/mongo_model.rb +++ b/devops-service/db/mongo/models/mongo_model.rb @@ -1,4 +1,4 @@ -require "providers/provider_factory" +#require "providers/provider_factory" require "exceptions/invalid_record" require "json" require 'db/validators/all' 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 new file mode 100644 index 0000000..20eb174 --- /dev/null +++ b/devops-service/db/mongo/models/provider_accounts/ec2_provider_account.rb @@ -0,0 +1,33 @@ +require "db/mongo/models/provider_accounts/provider_account" + +module Devops + module Model + class Ec2ProviderAccount < ProviderAccount + + attr_accessor :access_key_id, :availability_zone + + def initialize a={} + super(a) + self.availability_zone = a["availability_zone"] + self.access_key_id = a["access_key_id"] + end + + def to_list_hash + s = super + s["availability_zone"] = self.availability_zone + end + + def to_mongo_hash + s = super + s["availability_zone"] = self.availability_zone + s["access_key_id"] = self.access_key_id + end + + def self.build_from_bson a + a["account_name"] = a["_id"] + Ec2ProviderAccount.new a + end + end + end +end + diff --git a/devops-service/db/mongo/models/provider_accounts/openstack_provider_account.rb b/devops-service/db/mongo/models/provider_accounts/openstack_provider_account.rb new file mode 100644 index 0000000..77c27a7 --- /dev/null +++ b/devops-service/db/mongo/models/provider_accounts/openstack_provider_account.rb @@ -0,0 +1,40 @@ +require "db/mongo/models/provider_accounts/provider_account" + +module Devops + module Model + class OpenstackProviderAccount < ProviderAccount + + attr_accessor :username, :auth_url, :tenant, :api_key + + def initialize a={} + super(a) + self.username = a["username"] + self.auth_url = a["auth_url"] + self.tenant = a["tenant"] + self.api_key = a["api_key"] + end + + def to_list_hash + s = super + s["username"] = self.username + s["auth_url"] = self.auth_url + s["tenant"] = self.tenant + end + + def to_mongo_hash + s = super + s["username"] = self.username + s["auth_url"] = self.auth_url + s["tenant"] = self.tenant + s["api_key"] = self.api_key + end + + def self.build_from_bson a + a["account_name"] = a["_id"] + OpenstackProviderAccount.new a + 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 new file mode 100644 index 0000000..5d30243 --- /dev/null +++ b/devops-service/db/mongo/models/provider_accounts/provider_account.rb @@ -0,0 +1,46 @@ +require "db/mongo/models/mongo_model" +require "db/mongo/models/model_with_provider" + +module Devops + module Model + class ProviderAccount < MongoModel + + include ModelWithProvider + + attr_accessor :account_name, :description, :ssh_key, :certificate + + def initialize a={} + self.account_name = a["account_name"] + self.description = a["description"] + self.ssh_key = a["ssh_key"] + self.provider = a["provider"] + self.certificate = a["certificate"] + end + + def to_list_hash + to_hash + end + + def to_hash + { + "account_name" => self.account_name, + "description" => self.description, + "ssh_key" => self.ssh_key, + "provider" => self.provider, + "certificate" => self.certificate + } + end + + def to_mongo_hash + { + "_id" => self.account_name, + "description" => self.description, + "ssh_key" => self.ssh_key, + "provider" => self.provider, + "certificate" => self.certificate + } + end + + end + end +end diff --git a/devops-service/db/mongo/models/provider_accounts/static_provider_account.rb b/devops-service/db/mongo/models/provider_accounts/static_provider_account.rb new file mode 100644 index 0000000..37dc129 --- /dev/null +++ b/devops-service/db/mongo/models/provider_accounts/static_provider_account.rb @@ -0,0 +1,15 @@ +require "db/mongo/models/provider_accounts/provider_account" + +module Devops + module Model + class StaticProviderAccount < ProviderAccount + + def self.build_from_bson a + a["account_name"] = a["_id"] + StaticProviderAccount.new a + end + + end + end +end + diff --git a/devops-service/db/mongo/mongo_connector.rb b/devops-service/db/mongo/mongo_connector.rb index e188e66..12cafd5 100644 --- a/devops-service/db/mongo/mongo_connector.rb +++ b/devops-service/db/mongo/mongo_connector.rb @@ -32,7 +32,8 @@ class MongoConnector :user_update, :create_root_user, :check_user_privileges] => :users_connector, [: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 + [:insert_statistic, :search_statistic] => :statistics_connector, + [:provider_accounts] => :provider_accounts_connector ) def initialize(db, host, port=27017, user=nil, password=nil) @@ -46,6 +47,10 @@ class MongoConnector private + def provider_accounts_connector + @provider_accounts_connector ||= Connectors::ProviderAccounts.new(@db) + end + def images_connector @image_connector ||= Connectors::Image.new(@db) end diff --git a/devops-service/providers/base_provider.rb b/devops-service/providers/base_provider.rb index bf9ef34..a588eec 100644 --- a/devops-service/providers/base_provider.rb +++ b/devops-service/providers/base_provider.rb @@ -6,6 +6,10 @@ module Provider attr_accessor :ssh_key, :certificate_path, :connection_options, :run_list + def accounts + Devops::Db.connector.provider_accounts(self.name) + 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/provider_factory.rb b/devops-service/providers/provider_factory.rb index ff89d75..1e3453d 100644 --- a/devops-service/providers/provider_factory.rb +++ b/devops-service/providers/provider_factory.rb @@ -47,5 +47,18 @@ module Provider end end + def self.get_account_class provider + case(provider) + when ::Provider::Static::PROVIDER + ::Devops::Model::StaticProviderAccount + when ::Provider::Ec2::PROVIDER + ::Devops::Model::Ec2ProviderAccount + when ::Provider::Openstack::PROVIDER + ::Devops::Model::OpenstackProviderAccount + else + nil + end + end + end end