diff --git a/devops-client/lib/devops-client/options/server_options.rb b/devops-client/lib/devops-client/options/server_options.rb index 6b844f6..0bb0f87 100644 --- a/devops-client/lib/devops-client/options/server_options.rb +++ b/devops-client/lib/devops-client/options/server_options.rb @@ -127,7 +127,7 @@ class ServerOptions < CommonOptions options[:groups] = groups.split(",") end - parser.recognize_option_value(:private_ip, short: '-N', i18n_scope: 'create') + parser.recognize_option_value(:private_ip, i18n_scope: 'create') # it was disabled somewhy # parser.on('--public-ip', "Associate public IP with server") do diff --git a/devops-service/app/api2/handlers/project.rb b/devops-service/app/api2/handlers/project.rb index 0ccd928..097737f 100644 --- a/devops-service/app/api2/handlers/project.rb +++ b/devops-service/app/api2/handlers/project.rb @@ -144,8 +144,10 @@ module Devops servers = Devops::Db.connector.servers_by_project_and_deploy_env(id, deploy_env) raise InvalidRecord.new("Can not delete environment '#{deploy_env}', there are #{servers.size} servers on it") unless servers.empty? project.delete_deploy_env(deploy_env) + "Deploy environment '#{deploy_env}' has been deleted from project '#{project.id}'." end + # updates only run_list and description def update_project id body = parser.update old_project = Devops::Db.connector.project id diff --git a/devops-service/app/api2/routes/project.rb b/devops-service/app/api2/routes/project.rb index ee1aae8..6d195fb 100644 --- a/devops-service/app/api2/routes/project.rb +++ b/devops-service/app/api2/routes/project.rb @@ -368,13 +368,9 @@ module Devops # 201 - Created app.post_with_headers "/project", :headers => [:accept, :content_type] do check_privileges("project", "w") - begin - res = Devops::API2_0::Handler::Project.new(request).create_project - res = "Created. " + res - create_response(res, nil, 201) - rescue InvalidRecord => e - halt_response(e.message) - end + res = Devops::API2_0::Handler::Project.new(request).create_project + res = "Created. " + res + create_response(res, nil, 201) end =begin diff --git a/devops-service/app/api2/routes/stack.rb b/devops-service/app/api2/routes/stack.rb index 6db26fc..ede1968 100644 --- a/devops-service/app/api2/routes/stack.rb +++ b/devops-service/app/api2/routes/stack.rb @@ -24,7 +24,7 @@ module Devops # Create stack # # * *Request* - # - method : PATCH + # - method : POST # - headers : # - Accept: application/json # - Content-Type: application/json diff --git a/devops-service/db/mongo/models/mongo_model.rb b/devops-service/db/mongo/models/mongo_model.rb index 7525187..5351036 100644 --- a/devops-service/db/mongo/models/mongo_model.rb +++ b/devops-service/db/mongo/models/mongo_model.rb @@ -63,7 +63,8 @@ module Devops true rescue InvalidRecord => e error_message = self.build_error_message(e.message) - raise InvalidRecord.new(error_message) + # e.class may be InvalidRecord or its descendants + raise e.class.new(error_message) end end diff --git a/devops-service/db/validators/base.rb b/devops-service/db/validators/base.rb index 677e9f2..91b51cd 100644 --- a/devops-service/db/validators/base.rb +++ b/devops-service/db/validators/base.rb @@ -7,10 +7,10 @@ module Validators end def validate! - raise InvalidRecord.new(message) unless valid? + raise error_class.new(message) unless valid? rescue StandardError => e DevopsLogger.logger.error [e.message, e.backtrace].join("\n") - raise InvalidRecord.new("An error raised during validation with #{self.class}: #{e.class}: #{e.message}") + raise error_class.new("An error raised during validation with #{self.class}: #{e.class}: #{e.message}") end def valid? @@ -21,9 +21,21 @@ module Validators raise 'override me' end + def error_class + self.class.get_error_class + end + class << self + def get_error_class + @error_class || InvalidRecord + end + private + def error_class(klass) + @error_class = klass + end + # this method delegates @valid? and @message methods to helper validator, passed as block def delegate_to_helper_validator(&block) diff --git a/devops-service/db/validators/deploy_env/deploy_envs.rb b/devops-service/db/validators/deploy_env/deploy_envs.rb index 6ccceab..9388e46 100644 --- a/devops-service/db/validators/deploy_env/deploy_envs.rb +++ b/devops-service/db/validators/deploy_env/deploy_envs.rb @@ -14,6 +14,18 @@ module Validators true end + # do not rescue children validators' errors. With this: + # class of child validator's error doesn't disappeared + # logs doesn't contain two similar records + def validate! + raise error_class.new(message) unless valid? + rescue InvalidRecord => e + raise e + rescue StandardError => e + DevopsLogger.logger.error [e.message, e.backtrace].join("\n") + raise error_class.new("An error raised during validation with #{self.class}: #{e.class}: #{e.message}") + end + def message "Invalid project: #{@msg}." end diff --git a/devops-service/db/validators/deploy_env/users.rb b/devops-service/db/validators/deploy_env/users.rb index ceeeebf..aadeb66 100644 --- a/devops-service/db/validators/deploy_env/users.rb +++ b/devops-service/db/validators/deploy_env/users.rb @@ -1,5 +1,7 @@ module Validators class DeployEnv::Users < Base + error_class ::Devops::NonExistingUser + delegate_to_helper_validator { Helpers::Users.new(@model.users) } end end diff --git a/devops-service/db/validators/helpers/users.rb b/devops-service/db/validators/helpers/users.rb index 430a7bc..812c36d 100644 --- a/devops-service/db/validators/helpers/users.rb +++ b/devops-service/db/validators/helpers/users.rb @@ -1,6 +1,9 @@ +require 'exceptions/non_existing_user' module Validators class Helpers::Users < Base + error_class ::Devops::NonExistingUser + def valid? available_users = ::Devops::Db.connector.users_names(@model) @nonexistent_users = (@model || []) - available_users diff --git a/devops-service/exceptions/devops_error.rb b/devops-service/exceptions/devops_error.rb index fdcb6a2..a818dfd 100644 --- a/devops-service/exceptions/devops_error.rb +++ b/devops-service/exceptions/devops_error.rb @@ -13,7 +13,9 @@ module Devops end def http_body - JSON.pretty_generate(message: self.message) + error_body = {message: self.message} + error_body[:error_type] = error_type if respond_to?(:error_type) + JSON.pretty_generate(error_body) end def http_headers diff --git a/devops-service/exceptions/non_existing_user.rb b/devops-service/exceptions/non_existing_user.rb new file mode 100644 index 0000000..c71f285 --- /dev/null +++ b/devops-service/exceptions/non_existing_user.rb @@ -0,0 +1,8 @@ +require_relative 'invalid_record' +module Devops + class NonExistingUser < ::InvalidRecord + def error_type + 'unknown_user' + end + end +end diff --git a/devops-service/spec/models/deploy_env/deploy_env_ec2_spec.rb b/devops-service/spec/models/deploy_env/deploy_env_ec2_spec.rb index dd3c181..2d40861 100644 --- a/devops-service/spec/models/deploy_env/deploy_env_ec2_spec.rb +++ b/devops-service/spec/models/deploy_env/deploy_env_ec2_spec.rb @@ -22,6 +22,13 @@ RSpec.describe Devops::Model::DeployEnvEc2, type: :model do it_behaves_like 'deploy env' it_behaves_like 'cloud deploy env' + + it 'raises Devops::NonExistingUser when passing non existing user' do + env = build(:deploy_env_ec2, users: %w(wrong)) + expect { + env.validate! + }.to raise_error Devops::NonExistingUser + end end describe '#initialize' do