2015-01-26 15:02:58 +03:00
|
|
|
require "sinatra/base"
|
|
|
|
|
require "sinatra/streaming"
|
2015-01-27 13:18:26 +03:00
|
|
|
require "json"
|
|
|
|
|
|
2015-07-16 12:54:16 +03:00
|
|
|
require "fog"
|
|
|
|
|
|
2015-07-16 17:18:55 +03:00
|
|
|
require "exceptions/invalid_record"
|
|
|
|
|
require "exceptions/record_not_found"
|
2015-07-16 12:54:16 +03:00
|
|
|
require "exceptions/dependency_error"
|
2015-07-27 15:40:10 +03:00
|
|
|
require "exceptions/conflict_exception"
|
2015-08-03 15:09:04 +03:00
|
|
|
require "exceptions/parser_error"
|
|
|
|
|
require "exceptions/validation_error"
|
2015-10-09 15:00:21 +03:00
|
|
|
require "exceptions/knife_config_error"
|
2015-07-16 17:18:55 +03:00
|
|
|
require 'core/devops-logger'
|
|
|
|
|
|
|
|
|
|
require_relative "../helpers/version_2"
|
2015-01-26 15:02:58 +03:00
|
|
|
|
2014-12-22 14:22:04 +03:00
|
|
|
module Devops
|
2015-06-25 11:13:46 +03:00
|
|
|
class Api2 < Sinatra::Base
|
2015-01-26 15:02:58 +03:00
|
|
|
|
|
|
|
|
include Sinatra::JSON
|
|
|
|
|
helpers Sinatra::Streaming
|
2015-07-16 17:18:55 +03:00
|
|
|
helpers Devops::API2_0::Helpers
|
2015-01-26 15:02:58 +03:00
|
|
|
|
2015-03-06 12:20:30 +03:00
|
|
|
register Sinatra::DevopsAuth
|
|
|
|
|
|
2015-08-13 15:49:37 +03:00
|
|
|
@@logger = nil
|
2015-10-05 15:30:46 +03:00
|
|
|
@@access_logger = DevopsLogger.access_logger(File.join(DevopsConfig.config[:log_dir], "devops-api2.access.log"))
|
2015-08-13 15:49:37 +03:00
|
|
|
|
2015-01-26 15:02:58 +03:00
|
|
|
configure :production do
|
2015-07-16 17:18:55 +03:00
|
|
|
config = DevopsConfig.config
|
|
|
|
|
log_file = File.join(config[:log_dir], "devops-api2.log")
|
2015-08-13 15:49:37 +03:00
|
|
|
@@logger = DevopsLogger.create(log_file, Logger::INFO)
|
|
|
|
|
# use Rack::CommonLogger, logger
|
2015-01-26 15:02:58 +03:00
|
|
|
disable :dump_errors
|
|
|
|
|
disable :show_exceptions
|
2015-08-13 15:49:37 +03:00
|
|
|
#set :logging, Logger::INFO
|
|
|
|
|
@@logger.info "Production mode"
|
2015-01-26 15:02:58 +03:00
|
|
|
end
|
|
|
|
|
|
|
|
|
|
configure :development do
|
2015-07-16 17:18:55 +03:00
|
|
|
config = DevopsConfig.config
|
2015-08-13 15:49:37 +03:00
|
|
|
log_file = File.join(config[:log_dir], "devops-api2.dev.log")
|
|
|
|
|
@@logger = DevopsLogger.create(log_file, Logger::DEBUG)
|
|
|
|
|
# logger = DevopsLogger.create(log_file, Logger::DEBUG)
|
|
|
|
|
# logger = Logger.new STDOUT
|
|
|
|
|
# use Rack::CommonLogger, logger
|
2015-01-26 15:02:58 +03:00
|
|
|
disable :raise_errors
|
2015-08-03 15:09:04 +03:00
|
|
|
#set :show_exceptions, :after_handler
|
|
|
|
|
set :show_exceptions, false
|
|
|
|
|
#set :dump_errors, false
|
2015-08-13 15:49:37 +03:00
|
|
|
@@logger.info "Development mode"
|
2015-01-26 15:02:58 +03:00
|
|
|
end
|
|
|
|
|
|
|
|
|
|
not_found do
|
|
|
|
|
"Not found"
|
|
|
|
|
end
|
|
|
|
|
|
2015-09-17 11:15:10 +03:00
|
|
|
# set current logger and call handlers
|
2015-08-13 15:49:37 +03:00
|
|
|
def call env
|
|
|
|
|
DevopsLogger.logger = @@logger
|
2015-10-09 15:00:21 +03:00
|
|
|
begin
|
|
|
|
|
res = super(env)
|
2015-11-02 17:33:25 +03:00
|
|
|
rescue ::Devops::Exception::DevopsError => e
|
|
|
|
|
return [e.code, {}, e.message]
|
|
|
|
|
rescue InvalidRecord => e
|
2015-10-09 15:00:21 +03:00
|
|
|
return [e.code, {}, e.message]
|
|
|
|
|
end
|
2015-10-31 17:57:55 +03:00
|
|
|
@@access_logger.info(env["REQUEST_METHOD"] + " " + env["REQUEST_URI"] + " - from #{env["HTTP_USER_AGENT"]} (#{env["REMOTE_USER"]}) / #{res[0]}")
|
2015-10-06 12:45:08 +03:00
|
|
|
res
|
2015-08-13 15:49:37 +03:00
|
|
|
end
|
|
|
|
|
|
2015-11-02 17:33:25 +03:00
|
|
|
def handle_exception!(boom)
|
|
|
|
|
if boom.is_a?(::Devops::Exception::DevopsError)
|
|
|
|
|
boom.http_response
|
|
|
|
|
else
|
|
|
|
|
super(boom)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
2015-08-03 15:09:04 +03:00
|
|
|
error Devops::ValidationError do
|
|
|
|
|
e = env["sinatra.error"]
|
|
|
|
|
#logger.warn e.message
|
|
|
|
|
halt_response(e.message, 400)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
error Devops::ParserError do
|
|
|
|
|
e = env["sinatra.error"]
|
|
|
|
|
#logger.warn e.message
|
|
|
|
|
halt_response(e.message, 400)
|
|
|
|
|
end
|
|
|
|
|
|
2015-10-20 14:09:57 +03:00
|
|
|
error Devops::Exception::KnifeConfigError do
|
|
|
|
|
e = env["sinatra.error"]
|
|
|
|
|
logger.error e.message
|
|
|
|
|
halt_response(e.message, 500)
|
|
|
|
|
end
|
|
|
|
|
|
2015-01-26 15:02:58 +03:00
|
|
|
error RecordNotFound do
|
|
|
|
|
e = env["sinatra.error"]
|
|
|
|
|
logger.warn e.message
|
|
|
|
|
halt_response(e.message, 404)
|
|
|
|
|
end
|
|
|
|
|
|
2015-11-02 17:33:25 +03:00
|
|
|
=begin
|
2015-01-26 15:02:58 +03:00
|
|
|
error InvalidRecord do
|
|
|
|
|
e = env["sinatra.error"]
|
|
|
|
|
logger.warn e.message
|
|
|
|
|
logger.warn "Request body: #{request.body.read}"
|
|
|
|
|
halt_response(e.message, 400)
|
|
|
|
|
end
|
2015-11-02 17:33:25 +03:00
|
|
|
=end
|
2015-01-26 15:02:58 +03:00
|
|
|
|
|
|
|
|
error InvalidCommand do
|
|
|
|
|
e = env["sinatra.error"]
|
|
|
|
|
logger.warn e.message
|
|
|
|
|
halt_response(e.message, 400)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
error DependencyError do
|
|
|
|
|
e = env["sinatra.error"]
|
|
|
|
|
logger.warn e.message
|
|
|
|
|
halt_response(e.message, 400)
|
|
|
|
|
end
|
|
|
|
|
|
2015-07-27 15:40:10 +03:00
|
|
|
error ConflictException do
|
|
|
|
|
e = env["sinatra.error"]
|
|
|
|
|
logger.warn e.message
|
2015-10-20 16:12:50 +03:00
|
|
|
create_response(e.message, e.object, 409)
|
2015-07-27 15:40:10 +03:00
|
|
|
end
|
|
|
|
|
|
2015-01-26 15:02:58 +03:00
|
|
|
error InvalidPrivileges do
|
|
|
|
|
e = env["sinatra.error"]
|
|
|
|
|
logger.warn e.message
|
|
|
|
|
halt_response(e.message, 401)
|
|
|
|
|
end
|
|
|
|
|
|
2015-03-11 15:10:05 +03:00
|
|
|
error Excon::Errors::Error do
|
|
|
|
|
e = env["sinatra.error"]
|
|
|
|
|
logger.warn e.message
|
|
|
|
|
halt_response(e.message, 400)
|
|
|
|
|
end
|
|
|
|
|
|
2015-02-12 13:30:49 +03:00
|
|
|
error ::Excon::Errors::Unauthorized do
|
2015-01-26 15:02:58 +03:00
|
|
|
e = env["sinatra.error"]
|
|
|
|
|
resp = e.response
|
|
|
|
|
ct = resp.headers["Content-Type"]
|
|
|
|
|
msg = unless ct.nil?
|
|
|
|
|
if ct.include?("application/json")
|
|
|
|
|
json = ::Chef::JSONCompat.from_json(resp.body)
|
|
|
|
|
m = "ERROR: Unauthorized (#{json['error']['code']}): #{json['error']['message']}"
|
|
|
|
|
logger.error(m)
|
|
|
|
|
else
|
|
|
|
|
end
|
|
|
|
|
m
|
|
|
|
|
else
|
|
|
|
|
"Unauthorized: #{e.inspect}"
|
|
|
|
|
end
|
|
|
|
|
halt_response(msg, 500)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
error Fog::Compute::AWS::Error do
|
|
|
|
|
e = env["sinatra.error"]
|
|
|
|
|
logger.error e.message
|
|
|
|
|
halt_response(e.message, 500)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
error do
|
|
|
|
|
e = env["sinatra.error"]
|
|
|
|
|
logger.error e.message
|
|
|
|
|
halt_response(e.message, 500)
|
2014-05-08 15:34:26 +04:00
|
|
|
end
|
|
|
|
|
|
|
|
|
|
end
|
|
|
|
|
end
|