fluke/devops-service/routes/v2.0.rb
2015-01-26 15:02:58 +03:00

167 lines
5.0 KiB
Ruby

require "bundler/setup"
require "sinatra/base"
require "sinatra/streaming"
require "helpers/version_2"
module Devops
module Version2_0
class Application < Sinatra::Base
include Devops::Loader
class << self
def init config
set :devops_home, config[:devops_dir]
set :config, config
set :mongo_db, config[:mongo_db] || "devops"
set :mongo_host, config[:mongo_host] || "localhost"
set :mongo_port, config[:mongo_port] || 27017
set :mongo_user, config[:mongo_user]
set :mongo_password, config[:mongo_password]
set :keys_dir, (config[:keys_dir] || File.join(config[:devops_dir], "files/keys"))
set :scripts_dir, (config[:scripts_dir] || File.join(config[:devops_dir], "files/scripts"))
[:keys_dir, :scripts_dir].each {|key| d = settings.send(key); FileUtils.mkdir_p(d) unless File.exists?(d) }
init_mongo
settings.mongo.create_root_user
::Provider::ProviderFactory.init(config)
#set_up_providers_keys!(::Provider::ProviderFactory.all, mongo)
Wisper::GlobalListeners.subscribe(TestSubscriber2.new)
Wisper.subscribe(TestSubscriber.new)
end
def init_mongo
mongo = MongoConnector.new(settings.mongo_db, settings.mongo_host, settings.mongo_port, settings.mongo_user, settings.mongo_password)
set :mongo, mongo
end
private
def set_up_providers_keys!(providers, mongo)
providers.each do |provider|
next if provider.certificate_path.nil?
begin
mongo.key provider.ssh_key, Key::SYSTEM
rescue RecordNotFound => e
k = Key.new({"id" => provider.ssh_key, "path" => provider.certificate_path, "scope" => Key::SYSTEM})
mongo.key_insert k
end
end
end
end
include Sinatra::JSON
helpers Sinatra::Streaming
helpers Devops::Version2_0::Helpers
register Devops::Version2_0::Routes::ProviderRoutes
register Devops::Version2_0::Routes::BootstrapTemplatesRoutes
register Devops::Version2_0::Routes::UserRoutes
register Devops::Version2_0::Routes::FilterRoutes
register Devops::Version2_0::Routes::FlavorRoutes
register Devops::Version2_0::Routes::GroupRoutes
register Devops::Version2_0::Routes::ImageRoutes
register Devops::Version2_0::Routes::KeyRoutes
register Devops::Version2_0::Routes::NetworkRoutes
register Devops::Version2_0::Routes::ProjectRoutes
register Devops::Version2_0::Routes::ScriptRoutes
register Devops::Version2_0::Routes::ServerRoutes
register Devops::Version2_0::Routes::StatusRoutes
register Devops::Version2_0::Routes::TagRoutes
register Devops::Version2_0::Routes::DeployRoutes
use Rack::Auth::Basic do |username, password|
begin
settings.mongo.user_auth(username, password)
true
rescue RecordNotFound => e
false
end
end
configure :production do
disable :dump_errors
disable :show_exceptions
set :logging, Logger::INFO
puts "TODO2"
end
configure :development do
set :logging, Logger::DEBUG
disable :raise_errors
# disable :dump_errors
set :show_exceptions, :after_handler
puts "TODO1"
end
not_found do
"Not found"
end
error RecordNotFound do
e = env["sinatra.error"]
logger.warn e.message
halt_response(e.message, 404)
end
error InvalidRecord do
e = env["sinatra.error"]
logger.warn e.message
logger.warn "Request body: #{request.body.read}"
halt_response(e.message, 400)
end
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
error InvalidPrivileges do
e = env["sinatra.error"]
logger.warn e.message
halt_response(e.message, 401)
end
error Excon::Errors::Unauthorized do
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)
end
end
end
end