203 lines
5.6 KiB
Ruby
203 lines
5.6 KiB
Ruby
require "sinatra/base"
|
|
require "sinatra/streaming"
|
|
require "helpers/version_2"
|
|
require "json"
|
|
|
|
require "routes/v2.0/flavor"
|
|
require "routes/v2.0/image"
|
|
require "routes/v2.0/filter"
|
|
require "routes/v2.0/network"
|
|
require "routes/v2.0/group"
|
|
require "routes/v2.0/deploy"
|
|
require "routes/v2.0/project"
|
|
require "routes/v2.0/key"
|
|
require "routes/v2.0/user"
|
|
require "routes/v2.0/provider"
|
|
require "routes/v2.0/tag"
|
|
require "routes/v2.0/server"
|
|
require "routes/v2.0/script"
|
|
require "routes/v2.0/status"
|
|
require "routes/v2.0/bootstrap_templates"
|
|
|
|
require "routes/v2.0/handlers/provider"
|
|
require "routes/v2.0/handlers/bootstrap_templates"
|
|
require "routes/v2.0/handlers/deploy"
|
|
require "routes/v2.0/handlers/filter"
|
|
require "routes/v2.0/handlers/flavor"
|
|
require "routes/v2.0/handlers/group"
|
|
require "routes/v2.0/handlers/image"
|
|
require "routes/v2.0/handlers/network"
|
|
require "routes/v2.0/handlers/key"
|
|
require "routes/v2.0/handlers/project"
|
|
require "routes/v2.0/handlers/script"
|
|
require "routes/v2.0/handlers/status"
|
|
require "routes/v2.0/handlers/tag"
|
|
require "routes/v2.0/handlers/user"
|
|
require "routes/v2.0/handlers/server"
|
|
require "routes/routes_container"
|
|
|
|
require "auth/devops_auth"
|
|
|
|
module Devops
|
|
module Version2_0
|
|
class Application < Sinatra::Base
|
|
|
|
extend Devops::RoutesContainer
|
|
|
|
class << self
|
|
|
|
@routes = [
|
|
Devops::Version2_0::Routes::ProviderRoutes,
|
|
Devops::Version2_0::Routes::BootstrapTemplatesRoutes,
|
|
Devops::Version2_0::Routes::UserRoutes,
|
|
Devops::Version2_0::Routes::FilterRoutes,
|
|
Devops::Version2_0::Routes::FlavorRoutes,
|
|
Devops::Version2_0::Routes::GroupRoutes,
|
|
Devops::Version2_0::Routes::ImageRoutes,
|
|
Devops::Version2_0::Routes::KeyRoutes,
|
|
Devops::Version2_0::Routes::NetworkRoutes,
|
|
Devops::Version2_0::Routes::ProjectRoutes,
|
|
Devops::Version2_0::Routes::ScriptRoutes,
|
|
Devops::Version2_0::Routes::ServerRoutes,
|
|
Devops::Version2_0::Routes::StatusRoutes,
|
|
Devops::Version2_0::Routes::TagRoutes,
|
|
Devops::Version2_0::Routes::DeployRoutes
|
|
]
|
|
|
|
def init
|
|
config = DevopsConfig.config
|
|
set :devops_home, config[:devops_dir]
|
|
#set :config, config
|
|
|
|
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)
|
|
|
|
end
|
|
|
|
def init_mongo
|
|
set :mongo, Devops::Db.connector
|
|
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 Sinatra::DevopsAuth
|
|
|
|
=begin
|
|
use Rack::Auth::Basic do |username, password|
|
|
begin
|
|
settings.mongo.user_auth(username, password)
|
|
true
|
|
rescue RecordNotFound => e
|
|
false
|
|
end
|
|
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
|
|
|
|
=begin
|
|
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
|
|
=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
|