diff --git a/devops-service/app/api2/handlers/project.rb b/devops-service/app/api2/handlers/project.rb index 93ec9c6..80f4b01 100644 --- a/devops-service/app/api2/handlers/project.rb +++ b/devops-service/app/api2/handlers/project.rb @@ -80,6 +80,20 @@ module Devops "Updated project '#{project.id}' with components '#{body["components"].inspect}'" end + def add_deploy_env id + project = Devops::Db.connector.project(id) + env = parser.add_deploy_env + env.add_users [parser.current_user] + env.validate! + begin + db_env = project.deploy_env(env.identifier) + raise InvalidRecord.new("Can not add new environment for project '#{id}'. Environment '#{env.identifier}' already exist") + rescue RecordNotFound => e + res = project.add_deploy_env env + return "Deploy environment '#{env.identifier}' has been added to project '#{project.id}'." + res, env + end + end + def add_or_update_deploy_env id, deploy_env project = Devops::Db.connector.project(id) env = parser.add_or_update_deploy_env diff --git a/devops-service/app/api2/handlers/stack.rb b/devops-service/app/api2/handlers/stack.rb index abf5637..315e8a6 100644 --- a/devops-service/app/api2/handlers/stack.rb +++ b/devops-service/app/api2/handlers/stack.rb @@ -15,7 +15,7 @@ module Devops end def stacks_for_provider provider - Devops::Db.connector.stacks(provider) + Devops::Db.connector.stacks(provider: provider) end def create_stack diff --git a/devops-service/app/api2/parsers/project.rb b/devops-service/app/api2/parsers/project.rb index 5138fc9..e300977 100644 --- a/devops-service/app/api2/parsers/project.rb +++ b/devops-service/app/api2/parsers/project.rb @@ -45,6 +45,11 @@ module Devops c end + def add_deploy_env + body = create_object_from_json_body + Devops::Model::DeployEnvFactory.create(body) + end + def add_or_update_deploy_env body = create_object_from_json_body rl = check_array(body["run_list"], "Parameter 'run_list' should be an array of string", String, false, true) diff --git a/devops-service/app/api2/routes/project.rb b/devops-service/app/api2/routes/project.rb index 7d33349..973bbc4c 100644 --- a/devops-service/app/api2/routes/project.rb +++ b/devops-service/app/api2/routes/project.rb @@ -211,6 +211,18 @@ module Devops json Devops::API2_0::Handler::Project.new(request).project_deploy_envs(project) end + # Add project deploy environment + # + # * *Request* + # - method : POST + # - headers : + # - Accept: application/json + app.post_with_headers "/project/:project/deploy_env", :headers => [:accept, :content_type] do |project| + check_privileges("project", "w") + res, env = Devops::API2_0::Handler::Project.new(request).add_deploy_env(project) + create_response(res, {environment: env.to_hash}, 200) + end + deploy_env_hash = {} # Get project deploy environment # diff --git a/devops-service/app/api2/routes/v2.0.rb b/devops-service/app/api2/routes/v2.0.rb index 27b73b2..53310b3 100644 --- a/devops-service/app/api2/routes/v2.0.rb +++ b/devops-service/app/api2/routes/v2.0.rb @@ -24,6 +24,7 @@ module Devops register Sinatra::DevopsAuth @@logger = nil + @@access_logger = DevopsLogger.access_logger(File.join(DevopsConfig.config[:log_dir], "devops-api2.access.log")) configure :production do config = DevopsConfig.config @@ -57,7 +58,9 @@ module Devops # set current logger and call handlers def call env DevopsLogger.logger = @@logger - super(env) + res = super(env) + @@access_logger.info(env["REQUEST_METHOD"] + " " + env["REQUEST_URI"] + " - from #{env["HTTP_USER_AGENT"]}") + res end error Devops::ValidationError do diff --git a/devops-service/commands/ssh.rb b/devops-service/commands/ssh.rb index 64515c6..7eb9f54 100644 --- a/devops-service/commands/ssh.rb +++ b/devops-service/commands/ssh.rb @@ -6,8 +6,10 @@ module SshCommands end def ssh_execute server, cmd - key_path = File.join(DevopsCid.config[:keys_dir], server[:private_key]) - res = `ssh -i #{key_path} #{server[:remote_user]}@#{server[:host]} '#{cmd}'` + key_path = server[:private_key] + ssh_cmd = "ssh -i #{key_path} #{server[:remote_user]}@#{server[:host]} '#{cmd}'" + DevopsLogger.logger.info "Ssh command: #{ssh_cmd}" + res = `#{ssh_cmd}` return res, $? end diff --git a/devops-service/core/devops-logger.rb b/devops-service/core/devops-logger.rb index 0060aab..e7d853a 100644 --- a/devops-service/core/devops-logger.rb +++ b/devops-service/core/devops-logger.rb @@ -10,6 +10,18 @@ class DevopsLogger logger end + def self.access_logger out, level=Logger::INFO, format='%d-%m-%Y %H:%M:%S' + logger = Logger.new out + logger.level = level + logger.datetime_format = format + logger.formatter = proc do |severity, datetime, progname, msg| + date_format = datetime.strftime(format) + "[#{date_format}] #{msg}\n" + end + logger.debug("Logger has been created") + logger + end + def self.logger @_logger ||= DevopsLogger.create(File.join(DevopsConfig.config[:log_dir], "devops.errors.log")) end 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..4d8eb29 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 @@ -45,6 +45,36 @@ module Devops "Deploy environment '#{self.identifier}'. " + message end + def create_role project_id + knife = KnifeFactory.instance + if knife.nil? + DevopsLogger.logger.error "Can not get knife instance" + return nil + end + all_roles = knife.roles + info = {} + if all_roles.nil? + msg = "Can't get roles list from chef" + DevopsLogger.logger.error msg + return {error: msg} + end + role_name = knife.role_name(project_id, self.identifier) + begin + if all_roles.include? role_name + info[:exist] = role_name + else + knife.create_role role_name, project_id, self.identifier + info[:new] = role_name + DevopsLogger.logger.info "Role '#{role_name}' created" + end + self.run_list << "role[#{role_name}]" + rescue => er + info[:error] = role_name + DevopsLogger.logger.error "Role '#{role_name}' can not be created: #{er.message}" + end + info + end + end end end diff --git a/devops-service/db/mongo/models/project.rb b/devops-service/db/mongo/models/project.rb index fb67c8f..f8a51e7 100644 --- a/devops-service/db/mongo/models/project.rb +++ b/devops-service/db/mongo/models/project.rb @@ -19,6 +19,8 @@ module Devops define_hook :before_delete define_hook :after_delete + #define_hook :after_add_deploy_env + attr_accessor :id, :deploy_envs, :type, :archived, :description, :run_list types :id => {:type => String, :empty => false}, @@ -63,8 +65,9 @@ module Devops end def add_deploy_env deploy_env + res = deploy_env.create_role(self.id) Devops::Db.connector.add_deploy_env_to_project self.id, deploy_env - "" + create_roles_response(res) end def add_authorized_user user, env=nil @@ -207,6 +210,18 @@ module Devops end end + def create_roles_response roles + if roles.is_a?(String) + roles + else + info = "" + info += " Project roles '#{roles[:new].join("', '")}' have been automaticaly created" unless roles[:new].empty? + info += " Project roles '#{roles[:exist].join("', '")}' weren't created because they exist" unless roles[:exist].empty? + info += " Project roles '#{roles[:error].join("', '")}' weren't created because of internal error" unless roles[:error].empty? + info + end + end + end end end diff --git a/devops-service/lib/executors/server_executor.rb b/devops-service/lib/executors/server_executor.rb index 2edf407..7c502c9 100644 --- a/devops-service/lib/executors/server_executor.rb +++ b/devops-service/lib/executors/server_executor.rb @@ -453,7 +453,7 @@ module Devops rlist = Set.new(rlist) if @server.stack stack = Devops::Db.connector.stack(@server.stack) - out << "Stack run list: #{stack.run_list.join(", ")}\n" +# out << "Stack run list: #{stack.run_list.join(", ")}\n" srl = stack.run_list rlist.merge(srl) if srl.is_a?(Array) end