diff --git a/devops-service/app/api2/handlers/provider.rb b/devops-service/app/api2/handlers/provider.rb index c059a90..274e840 100644 --- a/devops-service/app/api2/handlers/provider.rb +++ b/devops-service/app/api2/handlers/provider.rb @@ -20,6 +20,10 @@ module Devops ::Provider::ProviderFactory.get(provider).accounts end + def account_fields provider + ::Provider::ProviderFactory.get_account_class(provider).account_fields + end + def add_account provider account = ::Provider::ProviderFactory.get(provider).create_account(parser.account) key = Devops::Db.connector.key account.ssh_key diff --git a/devops-service/app/api2/routes/provider.rb b/devops-service/app/api2/routes/provider.rb index d0e117a..49a797e 100644 --- a/devops-service/app/api2/routes/provider.rb +++ b/devops-service/app/api2/routes/provider.rb @@ -26,6 +26,22 @@ module Devops json Devops::API2_0::Handler::Provider.new(request).providers end + # Get list of provider account fields + # + # * *Request* + # - method : GET + # - headers : + # - Accept: application/json + # + # * *Returns* : hash + # key - field + # value - description + app.get_with_headers "/provider/:provider/account/fields", :headers => [:accept] do |provider| + check_privileges("provider", "r") + check_provider(provider) + json Devops::API2_0::Handler::Provider.new(request).account_fields(provider) + end + # Get list of provider accounts # # * *Request* 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 f2633fb..85ee83a 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 @@ -34,6 +34,14 @@ module Devops Ec2ProviderAccount.new a end + def self.account_fields + { + access_key_id: "AWS account access key", + secret_access_key: "AWS account secret key", + availability_zone: "Availability zone, todo: remove field?" + }.merge(ProviderAccount::ACCOUNT_FIELDS) + end + # TODO: remove def validate_fields_types 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 index 77c27a7..9aa6ca2 100644 --- a/devops-service/db/mongo/models/provider_accounts/openstack_provider_account.rb +++ b/devops-service/db/mongo/models/provider_accounts/openstack_provider_account.rb @@ -6,6 +6,15 @@ module Devops attr_accessor :username, :auth_url, :tenant, :api_key + def self.account_fields + { + username: "Openstack user name", + auth_url: "Identity API endpoint", + tenant: "Tenant to access", + api_key: "Openstack user password" + }.merge(ProviderAccount::ACCOUNT_FIELDS) + end + def initialize a={} super(a) self.username = a["username"] 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 56cd315..2bfed36 100644 --- a/devops-service/db/mongo/models/provider_accounts/provider_account.rb +++ b/devops-service/db/mongo/models/provider_accounts/provider_account.rb @@ -7,14 +7,19 @@ module Devops include ModelWithProvider - attr_accessor :account_name, :description, :ssh_key, :certificate + attr_accessor :account_name, :description, :ssh_key + + ACCOUNT_FIELDS = { + account_name: "Account name (id)", + description: "Account description", + ssh_key: "Ssh key id" + } 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"] self.created_at = a["created_at"] end @@ -28,7 +33,6 @@ module Devops "description" => self.description, "ssh_key" => self.ssh_key, "provider" => self.provider, - "certificate" => self.certificate, "created_at" => self.created_at } end @@ -38,8 +42,7 @@ module Devops "_id" => self.account_name, "description" => self.description, "ssh_key" => self.ssh_key, - "provider" => self.provider, - "certificate" => self.certificate + "provider" => self.provider } 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 index 37dc129..1359165 100644 --- a/devops-service/db/mongo/models/provider_accounts/static_provider_account.rb +++ b/devops-service/db/mongo/models/provider_accounts/static_provider_account.rb @@ -9,6 +9,9 @@ module Devops StaticProviderAccount.new a end + def self.account_fields + ProviderAccount::ACCOUNT_FIELDS + end end end end diff --git a/devops-service/providers/ec2_accounts_factory.rb b/devops-service/providers/ec2_accounts_factory.rb index ca94ece..88198e2 100644 --- a/devops-service/providers/ec2_accounts_factory.rb +++ b/devops-service/providers/ec2_accounts_factory.rb @@ -8,11 +8,11 @@ module Provider create_connection_from_account(config, account) puts "\tFound ec2 account '#{account.account_name}'" end + ProviderFactory.add_provider Ec2::PROVIDER unless @connections.empty? end def create_connection_from_account config, account options = { - aws_certificate: account.certificate, aws_ssh_key: account.ssh_key, aws_access_key_id: account.access_key_id, aws_secret_access_key: account.secret_access_key, diff --git a/devops-service/providers/provider_factory.rb b/devops-service/providers/provider_factory.rb index e0c9b2c..3bb8610 100644 --- a/devops-service/providers/provider_factory.rb +++ b/devops-service/providers/provider_factory.rb @@ -3,11 +3,12 @@ require "sinatra" module Provider module ProviderFactory + @@available_providers = [] @@providers = {} @@providers_with_accounts_factories = {} def self.providers - @@providers.keys + @@available_providers end def self.get provider, account=nil @@ -25,6 +26,10 @@ module Provider @@providers.values end + def self.add_provider provider + @@available_providers << provider unless @@available_providers.include?(provider) + end + def self.init conf # require providers here to get access to debug properties require_all @@ -34,6 +39,7 @@ module Provider o = Provider.const_get(p.capitalize).new(conf) if o.configured? @@providers[p] = o + @@available_providers << p puts "Provider '#{p}' has been loaded" end factory = Provider.const_get(p.capitalize + "AccountsFactory").new