From 68a76667619c783654fa59611e706b3b6b0277da Mon Sep 17 00:00:00 2001 From: amartynov Date: Thu, 22 Oct 2015 12:39:22 +0300 Subject: [PATCH 01/11] #789: provider accounts list --- devops-service/app/api2/handlers/provider.rb | 16 +++++ devops-service/app/api2/parsers/provider.rb | 12 ++++ devops-service/app/api2/routes/provider.rb | 69 +++++++++++++++++++ .../db/mongo/connectors/provider_accounts.rb | 30 ++++++++ devops-service/db/mongo/models/mongo_model.rb | 2 +- .../provider_accounts/ec2_provider_account.rb | 33 +++++++++ .../openstack_provider_account.rb | 40 +++++++++++ .../provider_accounts/provider_account.rb | 46 +++++++++++++ .../static_provider_account.rb | 15 ++++ devops-service/db/mongo/mongo_connector.rb | 7 +- devops-service/providers/base_provider.rb | 4 ++ devops-service/providers/provider_factory.rb | 13 ++++ 12 files changed, 285 insertions(+), 2 deletions(-) create mode 100644 devops-service/app/api2/parsers/provider.rb create mode 100644 devops-service/db/mongo/connectors/provider_accounts.rb create mode 100644 devops-service/db/mongo/models/provider_accounts/ec2_provider_account.rb create mode 100644 devops-service/db/mongo/models/provider_accounts/openstack_provider_account.rb create mode 100644 devops-service/db/mongo/models/provider_accounts/provider_account.rb create mode 100644 devops-service/db/mongo/models/provider_accounts/static_provider_account.rb 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 From 71f0eb779b3b9f7732dd7f5f9e635911d230fc60 Mon Sep 17 00:00:00 2001 From: amartynov Date: Mon, 26 Oct 2015 12:04:01 +0300 Subject: [PATCH 02/11] #\789: add provider account without validation --- devops-service/app/api2/handlers/provider.rb | 4 +- devops-service/app/api2/parsers/provider.rb | 6 ++- devops-service/app/api2/routes/provider.rb | 37 +++++++++++-------- .../connectors/helpers/insert_command.rb | 4 +- devops-service/db/mongo/models/mongo_model.rb | 3 ++ .../provider_accounts/ec2_provider_account.rb | 8 ++++ .../provider_accounts/provider_account.rb | 4 +- devops-service/db/mongo/mongo_connector.rb | 2 +- devops-service/providers/base_provider.rb | 4 ++ .../providers/connection_factory.rb | 13 +++++++ devops-service/providers/ec2.rb | 5 +++ .../providers/ec2_connection_factory.rb | 13 +++++++ 12 files changed, 83 insertions(+), 20 deletions(-) create mode 100644 devops-service/providers/connection_factory.rb create mode 100644 devops-service/providers/ec2_connection_factory.rb 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 From e2d49e066f218b5a93b379b650b06f124599dba0 Mon Sep 17 00:00:00 2001 From: amartynov Date: Mon, 26 Oct 2015 16:20:05 +0300 Subject: [PATCH 03/11] #789: todo --- devops-service/providers/connection_factory.rb | 4 ++-- devops-service/providers/ec2.rb | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/devops-service/providers/connection_factory.rb b/devops-service/providers/connection_factory.rb index 16cb946..cef4b0f 100644 --- a/devops-service/providers/connection_factory.rb +++ b/devops-service/providers/connection_factory.rb @@ -1,12 +1,12 @@ module Provider class ConnectionFactory - def init + def init config end def connection account_name - @connections[account_name] + @connections[account_name] || @from_config end end end diff --git a/devops-service/providers/ec2.rb b/devops-service/providers/ec2.rb index 161c3af..1d5ea9c 100644 --- a/devops-service/providers/ec2.rb +++ b/devops-service/providers/ec2.rb @@ -1,6 +1,7 @@ require "exceptions/conflict_exception" require "providers/base_provider" require "db/mongo/models/provider_accounts/ec2_provider_account" +require_relative "ec2_connection_factory" module Provider # Provider for Amazon EC2 From 80b22f8a4d0db2e3476f09f30a2a18ee2fd64e34 Mon Sep 17 00:00:00 2001 From: amartynov Date: Mon, 26 Oct 2015 17:14:48 +0300 Subject: [PATCH 04/11] #789: providers accounts factories --- .../provider_accounts/ec2_provider_account.rb | 5 +++- ...nection_factory.rb => accounts_factory.rb} | 5 ++-- devops-service/providers/ec2.rb | 2 +- .../providers/ec2_accounts_factory.rb | 26 +++++++++++++++++++ .../providers/ec2_connection_factory.rb | 13 ---------- .../providers/openstack_accounts_factory.rb | 6 +++++ devops-service/providers/provider_factory.rb | 13 ++++++++-- .../providers/static_accounts_factory.rb | 6 +++++ 8 files changed, 57 insertions(+), 19 deletions(-) rename devops-service/providers/{connection_factory.rb => accounts_factory.rb} (54%) create mode 100644 devops-service/providers/ec2_accounts_factory.rb delete mode 100644 devops-service/providers/ec2_connection_factory.rb create mode 100644 devops-service/providers/openstack_accounts_factory.rb create mode 100644 devops-service/providers/static_accounts_factory.rb 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 219336c..f2633fb 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 @@ -4,18 +4,20 @@ module Devops module Model class Ec2ProviderAccount < ProviderAccount - attr_accessor :access_key_id, :availability_zone + attr_accessor :access_key_id, :availability_zone, :secret_access_key def initialize a={} super(a) self.provider = Provider::Ec2::PROVIDER self.availability_zone = a["availability_zone"] self.access_key_id = a["access_key_id"] + self.secret_access_key = a["secret_access_key"] end def to_list_hash s = super s["availability_zone"] = self.availability_zone + s["access_key_id"] = self.access_key_id s end @@ -23,6 +25,7 @@ module Devops s = super s["availability_zone"] = self.availability_zone s["access_key_id"] = self.access_key_id + s["secret_access_key"] = self.secret_access_key s end diff --git a/devops-service/providers/connection_factory.rb b/devops-service/providers/accounts_factory.rb similarity index 54% rename from devops-service/providers/connection_factory.rb rename to devops-service/providers/accounts_factory.rb index cef4b0f..c96568f 100644 --- a/devops-service/providers/connection_factory.rb +++ b/devops-service/providers/accounts_factory.rb @@ -1,12 +1,13 @@ module Provider - class ConnectionFactory + class AccountsFactory def init config end + # providers instances def connection account_name - @connections[account_name] || @from_config + @connections[account_name] end end end diff --git a/devops-service/providers/ec2.rb b/devops-service/providers/ec2.rb index 1d5ea9c..0a9d222 100644 --- a/devops-service/providers/ec2.rb +++ b/devops-service/providers/ec2.rb @@ -1,7 +1,7 @@ require "exceptions/conflict_exception" require "providers/base_provider" require "db/mongo/models/provider_accounts/ec2_provider_account" -require_relative "ec2_connection_factory" +require_relative "ec2_accounts_factory" module Provider # Provider for Amazon EC2 diff --git a/devops-service/providers/ec2_accounts_factory.rb b/devops-service/providers/ec2_accounts_factory.rb new file mode 100644 index 0000000..06b95e3 --- /dev/null +++ b/devops-service/providers/ec2_accounts_factory.rb @@ -0,0 +1,26 @@ +require_relative "accounts_factory" +module Provider + class Ec2AccountsFactory < AccountsFactory + + def init config + @connections = {} + Devops::Db.connector.provider_accounts(Ec2::PROVIDER).each do |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, + aws_availability_zone: account.availability_zone, + + aws_proxy: config[:aws_proxy], + aws_no_proxy: config[:aws_no_proxy], + aws_integration_run_list: config[:aws_integration_run_list] + } + @connections[account.account_name] = Ec2.new(options) + #DevopsLogger.logger.info("Found ec2 account '#{account.account_name}'") + puts "\tFound ec2 account '#{account.account_name}'" + end + end + + end +end diff --git a/devops-service/providers/ec2_connection_factory.rb b/devops-service/providers/ec2_connection_factory.rb deleted file mode 100644 index 120c190..0000000 --- a/devops-service/providers/ec2_connection_factory.rb +++ /dev/null @@ -1,13 +0,0 @@ -require_relative "connection_factory" -module Provider - class Ec2ConnectionFactory < ConnectionFactory - - def init - - end - - def connection account_name - @connections - end - end -end diff --git a/devops-service/providers/openstack_accounts_factory.rb b/devops-service/providers/openstack_accounts_factory.rb new file mode 100644 index 0000000..72bfa0f --- /dev/null +++ b/devops-service/providers/openstack_accounts_factory.rb @@ -0,0 +1,6 @@ +require_relative "accounts_factory" +module Provider + class OpenstackAccountsFactory < AccountsFactory + + end +end diff --git a/devops-service/providers/provider_factory.rb b/devops-service/providers/provider_factory.rb index 1e3453d..d087a13 100644 --- a/devops-service/providers/provider_factory.rb +++ b/devops-service/providers/provider_factory.rb @@ -4,13 +4,18 @@ module Provider module ProviderFactory @@providers = {} + @@providers_with_accounts_factories = {} def self.providers @@providers.keys end - def self.get provider - p = @@providers[provider] + def self.get provider, account=nil + p = if account.nil? + @@providers[provider] + else + @@providers_with_accounts_factories[provider].connection(account) + end raise ::Sinatra::NotFound.new("Provider #{provider} not found") if p.nil? p end @@ -30,6 +35,9 @@ module Provider @@providers[p] = o puts "Provider '#{p}' has been loaded" end + factory = Provider.const_get(p.capitalize + "AccountsFactory").new + factory.init(conf) + @@providers_with_accounts_factories[p] = factory rescue => e puts "Error while loading provider '#{p}': " + e.message next @@ -41,6 +49,7 @@ module Provider ["ec2", "openstack", "static"].each do |provider| begin require_relative provider + require_relative provider + "_accounts_factory" rescue LoadError => e puts "Can not load provider '#{provider}': " + e.message end diff --git a/devops-service/providers/static_accounts_factory.rb b/devops-service/providers/static_accounts_factory.rb new file mode 100644 index 0000000..630921b --- /dev/null +++ b/devops-service/providers/static_accounts_factory.rb @@ -0,0 +1,6 @@ +require_relative "accounts_factory" +module Provider + class StaticAccountsFactory < AccountsFactory + + end +end From 2dbc20a47ffc78427018695012470c6e266a1667 Mon Sep 17 00:00:00 2001 From: Anton Martynov Date: Tue, 27 Oct 2015 12:01:21 +0300 Subject: [PATCH 05/11] #789: create server and stack with provider account --- devops-service/app/api2/handlers/stack.rb | 3 +++ .../mongo/models/deploy_env/cloud_deploy_env.rb | 1 + .../mongo/models/deploy_env/deploy_env_base.rb | 5 ++--- .../db/mongo/models/model_with_provider.rb | 17 +++++++++++++++-- devops-service/db/mongo/models/server.rb | 7 +++---- .../db/mongo/models/stack/stack_base.rb | 7 ++++--- devops-service/lib/executors/server_executor.rb | 6 +++--- devops-service/providers/provider_factory.rb | 1 + 8 files changed, 32 insertions(+), 15 deletions(-) diff --git a/devops-service/app/api2/handlers/stack.rb b/devops-service/app/api2/handlers/stack.rb index abf5637..e06efaa 100644 --- a/devops-service/app/api2/handlers/stack.rb +++ b/devops-service/app/api2/handlers/stack.rb @@ -25,7 +25,10 @@ module Devops raise InvalidRecord.new("Environment '#{env.identifier}' of project '#{project.id}' has no stack template") if env.stack_template.nil? object["stack_template"] = env.stack_template object["owner"] = parser.current_user + object["provider"] = env.provider + object["provider_account"] = env.provider_account + # TODO: without provider_name uri = Worker.start_async(StackBootstrapWorker, @request, provider_name: env.provider, stack_attributes: object 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 49eff30..27f05f0 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 @@ -24,6 +24,7 @@ module Devops :groups => {:type => Array, :empty => false}, :stack_template => {:type => String, :empty => false, :nil => true} + #TODO: account validator set_validators ::Validators::DeployEnv::Flavor, ::Validators::DeployEnv::Image, ::Validators::DeployEnv::SubnetNotEmpty, diff --git a/devops-service/db/mongo/models/deploy_env/deploy_env_base.rb b/devops-service/db/mongo/models/deploy_env/deploy_env_base.rb index 5fecd43..eaa1a21 100644 --- a/devops-service/db/mongo/models/deploy_env/deploy_env_base.rb +++ b/devops-service/db/mongo/models/deploy_env/deploy_env_base.rb @@ -19,10 +19,10 @@ module Devops def initialize d={} self.identifier = d["identifier"] + set_provider(d) b = d["run_list"] || [] self.run_list = b.uniq self.expires = d["expires"] - self.provider = d["provider"] b = d["users"] || [] self.users = b.uniq end @@ -32,9 +32,8 @@ module Devops "identifier" => self.identifier, "run_list" => self.run_list, "expires" => self.expires, - "provider" => self.provider, "users" => self.users - } + }.merge(provider_hash) end def add_users users diff --git a/devops-service/db/mongo/models/model_with_provider.rb b/devops-service/db/mongo/models/model_with_provider.rb index 41fe401..9672a5d 100644 --- a/devops-service/db/mongo/models/model_with_provider.rb +++ b/devops-service/db/mongo/models/model_with_provider.rb @@ -4,11 +4,24 @@ module Devops module Model module ModelWithProvider - attr_accessor :provider + attr_accessor :provider, :provider_account def provider_instance - @provider_instance ||= Provider::ProviderFactory.get(self.provider) + @provider_instance ||= Provider::ProviderFactory.get(self.provider, self.provider_account) end + + def set_provider hash + self.provider = hash["provider"] + self.provider_account = hash["provider_account"] + end + + def provider_hash + { + "provider" => self.provider, + "provider_account" => self.provider_account + } + end + end end end diff --git a/devops-service/db/mongo/models/server.rb b/devops-service/db/mongo/models/server.rb index f6296fe..c9fc4f9 100644 --- a/devops-service/db/mongo/models/server.rb +++ b/devops-service/db/mongo/models/server.rb @@ -33,7 +33,7 @@ module Devops end def initialize s={} - self.provider = s["provider"] + self.set_provider(s) self.chef_node_name = s["chef_node_name"] self.id = s["_id"] self.remote_user = s["remote_user"] @@ -66,7 +66,6 @@ module Devops def to_hash_without_id { - "provider" => self.provider, "chef_node_name" => self.chef_node_name, "remote_user" => self.remote_user, "project" => self.project, @@ -79,7 +78,7 @@ module Devops "reserved_by" => self.reserved_by, "stack" => stack, "run_list" => self.run_list - }.delete_if { |k,v| v.nil? } + }.merge(provider_hash).delete_if { |k,v| v.nil? } end def self.build_from_bson s @@ -98,7 +97,7 @@ module Devops end def static? - (self.provider == Provider::Static::PROVIDER) || false + self.provider == Provider::Static::PROVIDER end end diff --git a/devops-service/db/mongo/models/stack/stack_base.rb b/devops-service/db/mongo/models/stack/stack_base.rb index 0d71b8b..b8cb4c6 100644 --- a/devops-service/db/mongo/models/stack/stack_base.rb +++ b/devops-service/db/mongo/models/stack/stack_base.rb @@ -21,7 +21,7 @@ module Devops def initialize attrs={} # self.provider = self.class.provider - + self.set_provider(attrs) self.id = attrs['id'] self.project = attrs['project'] self.deploy_env = attrs['deploy_env'] @@ -36,7 +36,6 @@ module Devops def to_hash_without_id { - provider: provider, project: project, deploy_env: deploy_env, stack_template: stack_template, @@ -46,7 +45,7 @@ module Devops details: bson_safe_details, stack_status: stack_status, owner: owner - } + }.merge(provider_hash) end # overrided in ec2 @@ -106,6 +105,8 @@ module Devops # - id (String) # - deploy_env (String) # - stack_template (String) + # - provider (String) + # - provider_account (String) def create(attrs, out) model = new(attrs) model.create_stack_in_cloud!(out) diff --git a/devops-service/lib/executors/server_executor.rb b/devops-service/lib/executors/server_executor.rb index 2edf407..ea58f17 100644 --- a/devops-service/lib/executors/server_executor.rb +++ b/devops-service/lib/executors/server_executor.rb @@ -74,11 +74,11 @@ module Devops end def create_server options - @server = Devops::Model::Server.new({"project" => @project.id, "deploy_env" => @deploy_env.identifier, "created_by" => options["created_by"], "provider" => @deploy_env.provider}) - provider = @server.provider_instance + @server = Devops::Model::Server.new({"project" => @project.id, "deploy_env" => @deploy_env.identifier, "created_by" => options["created_by"], "provider" => @deploy_env.provider, "provider_account" => @deploy_env.provider_account}) + provider = @deploy_env.provider_instance mongo = ::Devops::Db.connector begin - @out << "Create server...\n" + @out.puts "Create server..." @out.flush @server.run_list = options["run_list"] || [] diff --git a/devops-service/providers/provider_factory.rb b/devops-service/providers/provider_factory.rb index d087a13..8fcaa89 100644 --- a/devops-service/providers/provider_factory.rb +++ b/devops-service/providers/provider_factory.rb @@ -16,6 +16,7 @@ module Provider else @@providers_with_accounts_factories[provider].connection(account) end + # TODO: new exception raise ::Sinatra::NotFound.new("Provider #{provider} not found") if p.nil? p end From 31214f36ac0a71831bccdf6af0ff56b80f669228 Mon Sep 17 00:00:00 2001 From: Anton Martynov Date: Tue, 27 Oct 2015 12:55:51 +0300 Subject: [PATCH 06/11] #789: group, flavor, network --- devops-service/app/api2/handlers/flavor.rb | 5 ++++- devops-service/app/api2/handlers/group.rb | 6 +++++- devops-service/app/api2/handlers/network.rb | 6 +++++- devops-service/app/api2/routes/flavor.rb | 7 +++++++ devops-service/app/api2/routes/group.rb | 6 ++++++ devops-service/app/api2/routes/network.rb | 6 ++++++ 6 files changed, 33 insertions(+), 3 deletions(-) diff --git a/devops-service/app/api2/handlers/flavor.rb b/devops-service/app/api2/handlers/flavor.rb index 421bb1a..34ddb12 100644 --- a/devops-service/app/api2/handlers/flavor.rb +++ b/devops-service/app/api2/handlers/flavor.rb @@ -7,9 +7,12 @@ module Devops class Flavor < RequestHandler def flavors provider - ::Provider::ProviderFactory.get(provider).flavors + flavors_with_account(provider, nil) end + def flavors_with_account provider, account + ::Provider::ProviderFactory.get(provider, account).flavors + end end end end diff --git a/devops-service/app/api2/handlers/group.rb b/devops-service/app/api2/handlers/group.rb index 26f2e36..82ed2d7 100644 --- a/devops-service/app/api2/handlers/group.rb +++ b/devops-service/app/api2/handlers/group.rb @@ -8,7 +8,11 @@ module Devops # TODO: vpc support for ec2 def groups provider - ::Provider::ProviderFactory.get(provider).groups()#params + groups_with_account(provider, nil) + end + + def groups_with_account provider, account + ::Provider::ProviderFactory.get(provider, account).groups()#params end end end diff --git a/devops-service/app/api2/handlers/network.rb b/devops-service/app/api2/handlers/network.rb index 81964c3..25c89ec 100644 --- a/devops-service/app/api2/handlers/network.rb +++ b/devops-service/app/api2/handlers/network.rb @@ -7,7 +7,11 @@ module Devops class Network < RequestHandler def networks provider - p = ::Provider::ProviderFactory.get provider + networks_with_account provider, nil + end + + def networks_with_account provider, account + p = ::Provider::ProviderFactory.get(provider, account) p.networks_detail end end diff --git a/devops-service/app/api2/routes/flavor.rb b/devops-service/app/api2/routes/flavor.rb index d0e5ea4..67db888 100644 --- a/devops-service/app/api2/routes/flavor.rb +++ b/devops-service/app/api2/routes/flavor.rb @@ -37,6 +37,13 @@ module Devops json Devops::API2_0::Handler::Flavor.new(request).flavors(provider) end + # TODO: check account + app.get_with_headers "/flavors/:provider/:account", :headers => [:accept] do |provider, account| + check_privileges("flavor", "r") + check_provider(provider) + json Devops::API2_0::Handler::Flavor.new(request).flavors_with_account(provider, account) + end + puts "Flavor routes initialized" end diff --git a/devops-service/app/api2/routes/group.rb b/devops-service/app/api2/routes/group.rb index 6ba87a7..989c4fb 100644 --- a/devops-service/app/api2/routes/group.rb +++ b/devops-service/app/api2/routes/group.rb @@ -50,6 +50,12 @@ module Devops json Devops::API2_0::Handler::Group.new(request).groups(provider) end + app.get_with_headers "/groups/:provider/:account", :headers => [:accept] do |provider, account| + check_privileges("group", "r") + check_provider(provider) + json Devops::API2_0::Handler::Group.new(request).groups_with_account(provider, account) + end + puts "Group routes initialized" end diff --git a/devops-service/app/api2/routes/network.rb b/devops-service/app/api2/routes/network.rb index 3d31d64..5da6724 100644 --- a/devops-service/app/api2/routes/network.rb +++ b/devops-service/app/api2/routes/network.rb @@ -38,6 +38,12 @@ module Devops json Devops::API2_0::Handler::Network.new(request).networks(provider) end + app.get_with_headers "/networks/:provider/:account", :headers => [:accept] do |provider, account| + check_privileges("network", "r") + check_provider(provider) + json Devops::API2_0::Handler::Network.new(request).networks_with_account(provider, account) + end + puts "Network routes initialized" end From c8ceedbaf7b39d309780e0f6ce15e45e849dbf9c Mon Sep 17 00:00:00 2001 From: Anton Martynov Date: Tue, 27 Oct 2015 13:45:25 +0300 Subject: [PATCH 07/11] #789: delete account --- devops-service/app/api2/handlers/provider.rb | 4 ++++ devops-service/db/mongo/mongo_connector.rb | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/devops-service/app/api2/handlers/provider.rb b/devops-service/app/api2/handlers/provider.rb index f7833b9..c4c4ff4 100644 --- a/devops-service/app/api2/handlers/provider.rb +++ b/devops-service/app/api2/handlers/provider.rb @@ -23,9 +23,13 @@ module Devops def add_account provider account = ::Provider::ProviderFactory.get(provider).create_account(parser.account) Devops::Db.connector.provider_accounts_insert(account) + account.to_hash end def delete_account name, provider + account = Devops::Db.connector.provider_accounts_show(name) + Devops::Db.connector.provider_accounts_delete(name) + account.to_hash end end diff --git a/devops-service/db/mongo/mongo_connector.rb b/devops-service/db/mongo/mongo_connector.rb index 20f12e1..224e952 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_insert] => :provider_accounts_connector + [:provider_accounts, :provider_accounts_insert, :provider_accounts_delete, :provider_accounts_show] => :provider_accounts_connector ) def initialize(db, host, port=27017, user=nil, password=nil) From adb20343f605e544e11e16655afe0e7010ef10bf Mon Sep 17 00:00:00 2001 From: amartynov Date: Wed, 28 Oct 2015 14:16:56 +0300 Subject: [PATCH 08/11] #789: done --- devops-service/app/api2/handlers/provider.rb | 15 +++++++++++++++ devops-service/app/api2/handlers/server.rb | 6 +++++- devops-service/app/api2/routes/server.rb | 5 +++++ devops-service/commands/knife_commands.rb | 4 +++- devops-service/db/mongo/models/project.rb | 2 +- devops-service/lib/executors/server_executor.rb | 5 ++++- devops-service/providers/ec2.rb | 2 +- 7 files changed, 34 insertions(+), 5 deletions(-) diff --git a/devops-service/app/api2/handlers/provider.rb b/devops-service/app/api2/handlers/provider.rb index f7833b9..84f5c66 100644 --- a/devops-service/app/api2/handlers/provider.rb +++ b/devops-service/app/api2/handlers/provider.rb @@ -22,7 +22,22 @@ module Devops def add_account provider account = ::Provider::ProviderFactory.get(provider).create_account(parser.account) + certificate_content = account.certificate + cert_name = "#{account.account_name}.pem" + certificate_path = File.join(Devops::Api2.settings.keys_dir, cert_name) + if File.exists?(certificate_path) + raise ConflictException.new("File '#{cert_name}' already exists") + end + File.open(certificate_path, "w") do |f| + f << certificate_content + end + File.chmod(0600, certificate_path) + DevopsLogger.logger.info("File '#{certificate_path}' for provider account '#{account.account_name}' has been created") + key = Devops::Model::Key.new({"id" => account.ssh_key, "path" => certificate_path, "scope" => Devops::Model::Key::SYSTEM}) + Devops::Db.connector.key_insert key + account.certificate = certificate_path Devops::Db.connector.provider_accounts_insert(account) + account end def delete_account name, provider diff --git a/devops-service/app/api2/handlers/server.rb b/devops-service/app/api2/handlers/server.rb index a43ec4b..453f15a 100644 --- a/devops-service/app/api2/handlers/server.rb +++ b/devops-service/app/api2/handlers/server.rb @@ -35,7 +35,11 @@ module Devops end def provider_servers provider - ::Provider::ProviderFactory.get(provider).servers + provider_servers_with_account provider, nil + end + + def provider_servers_with_account provider, account + ::Provider::ProviderFactory.get(provider, account).servers end def server id diff --git a/devops-service/app/api2/routes/server.rb b/devops-service/app/api2/routes/server.rb index b06b610..25727d4 100644 --- a/devops-service/app/api2/routes/server.rb +++ b/devops-service/app/api2/routes/server.rb @@ -85,6 +85,11 @@ module Devops json Devops::API2_0::Handler::Server.new(request).provider_servers(provider) end + app.get_with_headers "/servers/provider/:provider/:account", :headers => [:accept] do |provider, account| + check_privileges("server", "r") + json Devops::API2_0::Handler::Server.new(request).provider_servers_with_account(provider, account) + end + # Get server info by :name # # * *Request* diff --git a/devops-service/commands/knife_commands.rb b/devops-service/commands/knife_commands.rb index ccaa811..45c4835 100644 --- a/devops-service/commands/knife_commands.rb +++ b/devops-service/commands/knife_commands.rb @@ -73,7 +73,9 @@ EOH end def knife cmd - o = `bundle exec knife #{cmd} -c #{self.config} 2>&1` + cmd = "bundle exec knife #{cmd} -c #{self.config} 2>&1" + DevopsLogger.logger.info("Going to invoke command: #{cmd}") + o = `#{cmd}` return o, $?.success? end diff --git a/devops-service/db/mongo/models/project.rb b/devops-service/db/mongo/models/project.rb index fb67c8f..24a2632 100644 --- a/devops-service/db/mongo/models/project.rb +++ b/devops-service/db/mongo/models/project.rb @@ -145,7 +145,7 @@ module Devops } end - def deploy_info deploy_env, build_number + def deploy_info deploy_env, build_number=nil { "use_json_file" => true, # "run_list" => Set.new.merge(self.run_list).merge(deploy_env.run_list).to_a, diff --git a/devops-service/lib/executors/server_executor.rb b/devops-service/lib/executors/server_executor.rb index ea58f17..7578d00 100644 --- a/devops-service/lib/executors/server_executor.rb +++ b/devops-service/lib/executors/server_executor.rb @@ -78,6 +78,7 @@ module Devops provider = @deploy_env.provider_instance mongo = ::Devops::Db.connector begin + @out.puts "Using '#{@deploy_env.provider}' account '#{@deploy_env.provider_account}'\n" if @deploy_env.provider_account @out.puts "Create server..." @out.flush @@ -137,6 +138,7 @@ module Devops end ja = { :provider => @server.provider, + :provider_account => @server.provider_account, :devops_host => `hostname`.strip } ip = @server.private_ip @@ -210,7 +212,7 @@ module Devops bootstrap_options.push "--sudo" unless @server.remote_user == "root" bootstrap_options.push "-t #{options[:bootstrap_template]}" if options[:bootstrap_template] rl = options[:run_list] - bootstrap_options.push "-r #{rl.join(",")}" unless rl.nil?# rl.empty? + bootstrap_options.push "-r #{rl.join(",")}" unless rl.nil? or rl.empty? bootstrap_options.push "-c #{options[:config]}" if options[:config] bootstrap_options end @@ -269,6 +271,7 @@ module Devops end rescue => e @out << "\nError: #{e.message}\n" + DevopsLogger.logger.error(e.message + "\n" + e.backtrace.join("\n")) result_code(:deploy_unknown_error) end end diff --git a/devops-service/providers/ec2.rb b/devops-service/providers/ec2.rb index 0a9d222..40fb10b 100644 --- a/devops-service/providers/ec2.rb +++ b/devops-service/providers/ec2.rb @@ -94,7 +94,7 @@ module Provider def servers list = self.compute.describe_instances.body["reservationSet"] - list.select{|l| l["instancesSet"][0]["instanceState"]["name"].to_s != "terminated"}.map do |server| + list.select{|l| l["instancesSet"][0]["instanceState"]["name"].to_s == "running"}.map do |server| convert_server server["instancesSet"][0] end end From 8d145c10b4d1be4f19ac79ef243ac6b04f398c36 Mon Sep 17 00:00:00 2001 From: amartynov Date: Wed, 28 Oct 2015 16:28:48 +0300 Subject: [PATCH 09/11] #789: account must use existing key --- devops-service/app/api2/handlers/provider.rb | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/devops-service/app/api2/handlers/provider.rb b/devops-service/app/api2/handlers/provider.rb index 84f5c66..7209b58 100644 --- a/devops-service/app/api2/handlers/provider.rb +++ b/devops-service/app/api2/handlers/provider.rb @@ -22,20 +22,7 @@ module Devops def add_account provider account = ::Provider::ProviderFactory.get(provider).create_account(parser.account) - certificate_content = account.certificate - cert_name = "#{account.account_name}.pem" - certificate_path = File.join(Devops::Api2.settings.keys_dir, cert_name) - if File.exists?(certificate_path) - raise ConflictException.new("File '#{cert_name}' already exists") - end - File.open(certificate_path, "w") do |f| - f << certificate_content - end - File.chmod(0600, certificate_path) - DevopsLogger.logger.info("File '#{certificate_path}' for provider account '#{account.account_name}' has been created") - key = Devops::Model::Key.new({"id" => account.ssh_key, "path" => certificate_path, "scope" => Devops::Model::Key::SYSTEM}) - Devops::Db.connector.key_insert key - account.certificate = certificate_path + key = Devops::Db.connector.key account.ssh_key Devops::Db.connector.provider_accounts_insert(account) account end From 04646a7430b8cb8bc9935aa43b91c0a256573c25 Mon Sep 17 00:00:00 2001 From: amartynov Date: Wed, 28 Oct 2015 17:27:02 +0300 Subject: [PATCH 10/11] #789: add account in runtime --- devops-service/app/api2/handlers/provider.rb | 1 + devops-service/app/api2/routes/provider.rb | 2 +- devops-service/providers/accounts_factory.rb | 7 +++++ .../providers/ec2_accounts_factory.rb | 29 ++++++++++--------- devops-service/providers/provider_factory.rb | 10 +++++-- 5 files changed, 33 insertions(+), 16 deletions(-) diff --git a/devops-service/app/api2/handlers/provider.rb b/devops-service/app/api2/handlers/provider.rb index 7209b58..6b46284 100644 --- a/devops-service/app/api2/handlers/provider.rb +++ b/devops-service/app/api2/handlers/provider.rb @@ -24,6 +24,7 @@ module Devops account = ::Provider::ProviderFactory.get(provider).create_account(parser.account) key = Devops::Db.connector.key account.ssh_key Devops::Db.connector.provider_accounts_insert(account) + ::Provider::ProviderFactory.add_account(provider, account) account end diff --git a/devops-service/app/api2/routes/provider.rb b/devops-service/app/api2/routes/provider.rb index 85dee99..d0e117a 100644 --- a/devops-service/app/api2/routes/provider.rb +++ b/devops-service/app/api2/routes/provider.rb @@ -84,7 +84,7 @@ module Devops app.post_with_headers "/provider/:provider/account", :headers => [:accept, :content_type] do |provider| check_privileges("provider", "w") check_provider(provider) - create_response("Updated", {:account => Devops::API2_0::Handler::Provider.new(request).add_account(provider)}, 201) + create_response("Created", {:account => Devops::API2_0::Handler::Provider.new(request).add_account(provider)}, 201) end # Delete account with name :account_name for :provider diff --git a/devops-service/providers/accounts_factory.rb b/devops-service/providers/accounts_factory.rb index c96568f..c956b14 100644 --- a/devops-service/providers/accounts_factory.rb +++ b/devops-service/providers/accounts_factory.rb @@ -9,6 +9,13 @@ module Provider def connection account_name @connections[account_name] end + + def add_connection name, conn + @connections[name] = conn + end + + def create_connection_from_account config, account + end end end diff --git a/devops-service/providers/ec2_accounts_factory.rb b/devops-service/providers/ec2_accounts_factory.rb index 06b95e3..ca94ece 100644 --- a/devops-service/providers/ec2_accounts_factory.rb +++ b/devops-service/providers/ec2_accounts_factory.rb @@ -5,22 +5,25 @@ module Provider def init config @connections = {} Devops::Db.connector.provider_accounts(Ec2::PROVIDER).each do |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, - aws_availability_zone: account.availability_zone, - - aws_proxy: config[:aws_proxy], - aws_no_proxy: config[:aws_no_proxy], - aws_integration_run_list: config[:aws_integration_run_list] - } - @connections[account.account_name] = Ec2.new(options) - #DevopsLogger.logger.info("Found ec2 account '#{account.account_name}'") + create_connection_from_account(config, account) puts "\tFound ec2 account '#{account.account_name}'" end 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, + aws_availability_zone: account.availability_zone, + + aws_proxy: config[:aws_proxy], + aws_no_proxy: config[:aws_no_proxy], + aws_integration_run_list: config[:aws_integration_run_list] + } + add_connection(account.account_name, Ec2.new(options)) + end + end end diff --git a/devops-service/providers/provider_factory.rb b/devops-service/providers/provider_factory.rb index 8fcaa89..cf5e0b8 100644 --- a/devops-service/providers/provider_factory.rb +++ b/devops-service/providers/provider_factory.rb @@ -32,10 +32,10 @@ module Provider ["ec2", "openstack", "static"].each do |p| begin o = Provider.const_get(p.capitalize).new(conf) - if o.configured? + #if o.configured? @@providers[p] = o puts "Provider '#{p}' has been loaded" - end + #end factory = Provider.const_get(p.capitalize + "AccountsFactory").new factory.init(conf) @@providers_with_accounts_factories[p] = factory @@ -46,6 +46,12 @@ module Provider end end + def self.add_account provider, account + factory = @@providers_with_accounts_factories[provider] + factory.create_connection_from_account(DevopsConfig.config, account) + DevopsLogger.logger.info("Added #{provider} account '#{account.account_name}'") + end + def self.require_all ["ec2", "openstack", "static"].each do |provider| begin From 4fdde73a5dfcd6dd542bc29c67adcb840152e233 Mon Sep 17 00:00:00 2001 From: amartynov Date: Thu, 29 Oct 2015 12:01:35 +0300 Subject: [PATCH 11/11] #789: bootstrap: waiting for 5 min --- devops-service/lib/executors/server_executor.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/devops-service/lib/executors/server_executor.rb b/devops-service/lib/executors/server_executor.rb index 7578d00..732ac40 100644 --- a/devops-service/lib/executors/server_executor.rb +++ b/devops-service/lib/executors/server_executor.rb @@ -16,7 +16,8 @@ module Devops deploy_failed: 8 } - MAX_SSH_RETRIES_AMOUNT = 20 + # waiting for 5*60 seconds (5 min) + MAX_SSH_RETRIES_AMOUNT = 60 #params: # out - container for output data