sinatra modules

This commit is contained in:
amartynov 2014-12-15 14:26:54 +03:00
parent cbf48145cd
commit 79e2811e0c
17 changed files with 1827 additions and 1782 deletions

View File

@ -20,11 +20,6 @@ else
end
config[:devops_dir] = File.join(ENV["HOME"], ".devops") if config[:devops_dir].nil?
puts "Devops home: #{config[:devops_dir]}"
unless File.exists?(config[:devops_dir])
FileUtils.mkdir_p config[:devops_dir]
puts "Directory '#{config[:devops_dir]}' has been created"
end
config[:report_dir_v2] = File.expand_path(File.join(config[:devops_dir], "report", "v2")) unless config[:report_dir_v2]
[

View File

@ -21,13 +21,32 @@ require "routes/v2.0/user"
class DevopsService < Sinatra::Base
helpers Sinatra::Streaming
helpers Sinatra::Version2_0::Helpers
helpers Devops::Version2_0::Helpers
register Sinatra::Version2_0::Core::ProviderRoutes
register Sinatra::Version2_0::Core::UserRoutes
register Devops::Version2_0::Core::ProviderRoutes
register Devops::Version2_0::Core::BootstrapTemplatesRoutes
register Devops::Version2_0::Core::UserRoutes
register Devops::Version2_0::Core::FilterRoutes
register Devops::Version2_0::Core::FlavorRoutes
register Devops::Version2_0::Core::GroupRoutes
register Devops::Version2_0::Core::ImageRoutes
register Devops::Version2_0::Core::KeyRoutes
register Devops::Version2_0::Core::NetworkRoutes
register Devops::Version2_0::Core::ProjectRoutes
register Devops::Version2_0::Core::ScriptRoutes
register Devops::Version2_0::Core::ServerRoutes
register Devops::Version2_0::Core::StatusRoutes
register Devops::Version2_0::Core::TagRoutes
def initialize config
super()
puts "Devops home: #{config[:devops_dir]}"
unless File.exists?(config[:devops_dir])
FileUtils.mkdir_p config[:devops_dir]
puts "Directory '#{config[:devops_dir]}' has been created"
end
self.class.set :devops_home, config[:devops_dir]
self.class.set :config, config
@@config = config
root = File.dirname(__FILE__)
@ -57,7 +76,7 @@ class DevopsService < Sinatra::Base
use Rack::Auth::Basic do |username, password|
begin
mongo.user_auth(username, password)
settings.mongo.user_auth(username, password)
true
rescue RecordNotFound => e
false
@ -70,6 +89,7 @@ class DevopsService < Sinatra::Base
disable :dump_errors
disable :show_exceptions
set :logging, Logger::INFO
puts "TODO2"
end
configure :development do
@ -77,6 +97,7 @@ class DevopsService < Sinatra::Base
disable :raise_errors
# disable :dump_errors
set :show_exceptions, :after_handler
puts "TODO1"
end
not_found do

View File

@ -2,10 +2,9 @@ require "json"
require 'sinatra/base'
require "sinatra/json"
require "providers/provider_factory"
module Sinatra
module Devops
module Version2_0
module Helpers

View File

@ -1,17 +1,15 @@
require "json"
require "routes/v2.0/base_routes"
require "providers/provider_factory"
require "commands/bootstrap_templates"
module Devops
module Version2_0
class BootstrapTemplatesRoutes < BaseRoutes
module Core
module BootstrapTemplatesRoutes
include BootstrapTemplatesCommands
extend BootstrapTemplatesCommands
def initialize wrapper
super wrapper
puts "Bootstrap templates routes initialized"
end
def self.registered(app)
# Get list of available bootstrap templates
#
@ -24,12 +22,16 @@ module Version2_0
# [
# "omnibus"
# ]
get "/templates" do
app.get "/templates" do
check_headers :accept
check_privileges("templates", "r")
json get_templates
json BootstrapTemplatesRoutes.get_templates
end
puts "Bootstrap templates routes initialized"
end
end
end
end
end

View File

@ -1,14 +1,12 @@
require "routes/v2.0/base_routes"
module Devops
module Version2_0
class FilterRoutes < BaseRoutes
module Core
module FilterRoutes
def initialize wrapper
super wrapper
puts "Filter routes initialized"
end
def self.registered(app)
before "/filter/:provider/image" do
app.before "/filter/:provider/image" do
check_headers :accept, :content_type
check_privileges("filter", "w")
check_provider(params[:provider])
@ -17,7 +15,7 @@ module Version2_0
check_array(@images, "Request body should contains an array with strings")
end
after "/filter/:provider/image" do
app.after "/filter/:provider/image" do
statistic
end
@ -39,11 +37,11 @@ module Version2_0
# [
# "36dc7618-4178-4e29-be43-286fbfe90f50"
# ]
get "/filter/:provider/images" do
app.get "/filter/:provider/images" do
check_headers :accept
check_privileges("filter", "r")
check_provider(params[:provider])
json BaseRoutes.mongo.available_images(params[:provider])
json settings.mongo.available_images(params[:provider])
end
# Add image ids to filter for :provider
@ -59,8 +57,8 @@ module Version2_0
# ] -> array of image ids to add to filter
#
# * *Returns* : list of images filters for :provider
put "/filter/:provider/image" do
create_response("Updated", {:images => BaseRoutes.mongo.add_available_images(@images, params[:provider])})
app.put "/filter/:provider/image" do
create_response("Updated", {:images => settings.mongo.add_available_images(@images, params[:provider])})
end
# Delete image ids from filter for :provider
@ -76,9 +74,14 @@ module Version2_0
# ] -> array of image ids to delete from filter
#
# * *Returns* : list of images filters for :provider
delete "/filter/:provider/image" do
create_response("Deleted", {:images => BaseRoutes.mongo.delete_available_images(@images, params[:provider])})
app.delete "/filter/:provider/image" do
create_response("Deleted", {:images => settings.mongo.delete_available_images(@images, params[:provider])})
end
puts "Filter routes initialized"
end
end
end
end
end

View File

@ -1,14 +1,12 @@
require "json"
require "routes/v2.0/base_routes"
require "providers/provider_factory"
module Devops
module Version2_0
class FlavorRoutes < BaseRoutes
module Core
module FlavorRoutes
def initialize wrapper
super wrapper
puts "Flavor routes initialized"
end
def self.registered(app)
# Get list of flavors for :provider
#
@ -37,7 +35,7 @@ module Version2_0
# "disk": 20
# }
# ]
get "/flavors/:provider" do
app.get "/flavors/:provider" do
check_headers :accept
check_privileges("flavor", "r")
check_provider(params[:provider])
@ -45,5 +43,10 @@ module Version2_0
json p.flavors
end
puts "Flavor routes initialized"
end
end
end
end
end

View File

@ -1,16 +1,13 @@
# encoding: UTF-8
require "json"
require "routes/v2.0/base_routes"
require "providers/provider_factory"
module Devops
module Version2_0
class GroupRoutes < BaseRoutes
def initialize wrapper
super wrapper
puts "Group routes initialized"
end
module Core
module GroupRoutes
def self.registered(app)
# Get security groups for :provider
#
# * *Request*
@ -49,7 +46,7 @@ module Version2_0
# }
# }
# TODO: vpc support for ec2
get "/groups/:provider" do
app.get "/groups/:provider" do
check_headers :accept
check_privileges("group", "r")
check_provider(params[:provider])
@ -57,5 +54,10 @@ module Version2_0
json p.groups(params)
end
puts "Group routes initialized"
end
end
end
end
end

View File

@ -1,18 +1,15 @@
require "providers/provider_factory"
require "routes/v2.0/base_routes"
require "commands/image"
module Devops
module Version2_0
class ImageRoutes < BaseRoutes
module Core
module ImageRoutes
include ImageCommands
extend ImageCommands
def initialize wrapper
super wrapper
puts "Image routes initialized"
end
after %r{\A/image(/[\w]+)?\z} do
def self.registered(app)
app.after %r{\A/image(/[\w]+)?\z} do
statistic
end
@ -35,11 +32,11 @@ module Version2_0
# "id": "36dc7618-4178-4e29-be43-286fbfe90f50"
# }
# ]
get "/images" do
app.get "/images" do
check_headers :accept
check_privileges("image", "r")
check_provider(params[:provider]) if params[:provider]
images = BaseRoutes.mongo.images(params[:provider])
images = settings.mongo.images(params[:provider])
json(images.map {|i| i.to_hash})
end
@ -67,11 +64,11 @@ module Version2_0
# "status": "ACTIVE"
# }
# ]
get "/images/provider/:provider" do
app.get "/images/provider/:provider" do
check_headers :accept
check_privileges("image", "r")
check_provider(params[:provider])
json get_images(BaseRoutes.mongo, params[:provider])
json get_images(settings.mongo, params[:provider])
end
# Get devops image by id
@ -89,10 +86,10 @@ module Version2_0
# "bootstrap_template": null,
# "id": "36dc7618-4178-4e29-be43-286fbfe90f50"
# }
get "/image/:image_id" do
app.get "/image/:image_id" do
check_headers :accept
check_privileges("image", "r")
json BaseRoutes.mongo.image(params[:image_id])
json settings.mongo.image(params[:image_id])
end
# Create devops image
@ -113,11 +110,11 @@ module Version2_0
#
# * *Returns* :
# 201 - Created
post "/image" do
app.post "/image" do
check_headers
check_privileges("image", "w")
image = create_object_from_json_body
BaseRoutes.mongo.image_insert Image.new(image)
settings.mongo.image_insert Image.new(image)
create_response "Created", nil, 201
end
@ -139,13 +136,13 @@ module Version2_0
#
# * *Returns* :
# 200 - Updated
put "/image/:image_id" do
app.put "/image/:image_id" do
check_headers
check_privileges("image", "w")
BaseRoutes.mongo.image params[:image_id]
settings.mongo.image params[:image_id]
image = Image.new(create_object_from_json_body)
image.id = params[:image_id]
BaseRoutes.mongo.image_update image
settings.mongo.image_update image
create_response("Image '#{params[:image_id]}' has been updated")
end
@ -158,10 +155,10 @@ module Version2_0
#
# * *Returns* :
# 200 - Deleted
delete "/image/:image_id" do
app.delete "/image/:image_id" do
check_headers
check_privileges("image", "w")
projects = BaseRoutes.mongo.projects_by_image params[:image_id]
projects = settings.mongo.projects_by_image params[:image_id]
unless projects.empty?
ar = []
projects.each do |p|
@ -170,9 +167,14 @@ module Version2_0
raise DependencyError.new "Deleting is forbidden: Image is used in #{ar.join(", ")}"
end
r = BaseRoutes.mongo.image_delete params[:image_id]
r = settings.mongo.image_delete params[:image_id]
create_response("Image '#{params[:image_id]}' has been removed")
end
puts "Image routes initialized"
end
end
end
end
end

View File

@ -3,15 +3,13 @@ require "db/exceptions/invalid_record"
require "db/mongo/models/key"
require "fileutils"
module Devops
module Version2_0
class KeyRoutes < BaseRoutes
module Core
module KeyRoutes
def initialize wrapper
super wrapper
puts "Key routes initialized"
end
before %r{\A/key(/[\w]+)?\z} do
def self.registered(app)
app.before %r{\A/key(/[\w]+)?\z} do
if request.delete?
check_headers :accept
else
@ -20,7 +18,7 @@ module Version2_0
check_privileges("key", "w")
end
after %r{\A/key(/[\w]+)?\z} do
app.after %r{\A/key(/[\w]+)?\z} do
statistic
end
@ -38,10 +36,10 @@ module Version2_0
# "id": "devops"
# }
# ]
get "/keys" do
app.get "/keys" do
check_headers :accept
check_privileges("key", "r")
keys = BaseRoutes.mongo.keys.map {|i| i.to_hash}
keys = settings.mongo.keys.map {|i| i.to_hash}
keys.each {|k| k.delete("path")} # We should not return path to the key
json keys
end
@ -62,7 +60,7 @@ module Version2_0
#
# * *Returns* :
# 201 - Created
post "/key" do
app.post "/key" do
key = create_object_from_json_body
fname = check_filename(key["file_name"], "Parameter 'file_name' must be a not empty string")
kname = check_string(key["key_name"], "Parameter 'key_name' should be a not empty string")
@ -75,7 +73,7 @@ module Version2_0
end
key = Key.new({"path" => file_name, "id" => kname})
BaseRoutes.mongo.key_insert key
settings.mongo.key_insert key
create_response("Created", nil, 201)
end
@ -88,23 +86,28 @@ module Version2_0
#
# * *Returns* :
# 200 - Deleted
delete "/key/:key" do
servers = BaseRoutes.mongo.servers_by_key params[:key]
app.delete "/key/:key" do
servers = settings.mongo.servers_by_key params[:key]
unless servers.empty?
s_str = servers.map{|s| s.id}.join(", ")
raise DependencyError.new "Deleting is forbidden: Key is used in servers: #{s_str}"
end
k = BaseRoutes.mongo.key params[:key]
k = settings.mongo.key params[:key]
begin
FileUtils.rm(k.path)
rescue
logger.error "Missing key file for #{params[:key]} - #{k.filename}"
end
r = BaseRoutes.mongo.key_delete params[:key]
r = settings.mongo.key_delete params[:key]
return [500, r["err"].inspect] unless r["err"].nil?
create_response("Key '#{params[:key]}' removed")
end
puts "Key routes initialized"
end
end
end
end
end

View File

@ -1,16 +1,13 @@
# encoding: UTF-8
require "json"
require "routes/v2.0/base_routes"
require "providers/provider_factory"
module Devops
module Version2_0
class NetworkRoutes < BaseRoutes
def initialize wrapper
super wrapper
puts "Network routes initialized"
end
module Core
module NetworkRoutes
def self.registered(app)
# Get list of networks for :provider
#
# * *Request*
@ -37,7 +34,7 @@ module Version2_0
# "id": "b14f8df9-ac27-48e2-8d65-f7ef78dc2654"
# }
# ]
get "/networks/:provider" do
app.get "/networks/:provider" do
check_headers :accept
check_privileges("network", "r")
check_provider(params[:provider])
@ -45,5 +42,10 @@ module Version2_0
json p.networks_detail
end
puts "Network routes initialized"
end
end
end
end
end

View File

@ -7,32 +7,30 @@ require "commands/status"
require "commands/server"
require "workers/project_test_worker"
module Devops
module Version2_0
class ProjectRoutes < BaseRoutes
module Core
module ProjectRoutes
include DeployCommands
include StatusCommands
include ServerCommands
extend DeployCommands
extend StatusCommands
extend ServerCommands
def initialize wrapper
super wrapper
puts "Project routes initialized"
end
before "/project/:id/user" do
def self.registered(app)
app.before "/project/:id/user" do
check_headers :accept, :content_type
check_privileges("project", "w")
body = create_object_from_json_body
@users = check_array(body["users"], "Parameter 'users' must be a not empty array of strings")
@deploy_env = check_string(body["deploy_env"], "Parameter 'deploy_env' must be a not empty string", true)
@project = BaseRoutes.mongo.project(params[:id])
@project = settings.mongo.project(params[:id])
end
after %r{\A/project(/[\w]+(/(user|deploy))?)?\z} do
app.after %r{\A/project(/[\w]+(/(user|deploy))?)?\z} do
statistic
end
after "/project/:id/:env/run_list" do
app.after "/project/:id/:env/run_list" do
statistic
end
@ -49,7 +47,7 @@ module Version2_0
# [
# {"name" : "project_1"}
# ]
get "/projects" do
app.get "/projects" do
check_headers :accept
check_privileges("project", "r")
fields = []
@ -58,7 +56,7 @@ module Version2_0
fields.push k if params["fields"].include?(k)
end
end
json BaseRoutes.mongo.projects(nil, nil, fields).map {|p| p.to_hash}
json settings.mongo.projects(nil, nil, fields).map {|p| p.to_hash}
end
# Get project by id
@ -93,10 +91,10 @@ module Version2_0
# ],
# "name": "project_1"
# }
get "/project/:project" do
app.get "/project/:project" do
check_headers :accept
check_privileges("project", "r")
json BaseRoutes.mongo.project(params[:project])
json settings.mongo.project(params[:project])
end
# Get project servers
@ -125,11 +123,11 @@ module Version2_0
# "id": "nstance id"
# }
# ]
get "/project/:project/servers" do
app.get "/project/:project/servers" do
check_headers :accept
check_privileges("project", "r")
BaseRoutes.mongo.project(params[:project])
json BaseRoutes.mongo.servers(params[:project], params[:deploy_env]).map{|s| s.to_hash}
settings.mongo.project(params[:project])
json settings.mongo.servers(params[:project], params[:deploy_env]).map{|s| s.to_hash}
end
# Create project and chef roles
@ -168,16 +166,16 @@ module Version2_0
# * *Returns* :
# 201 - Created
# TODO: multi project
post "/project" do
app.post "/project" do
check_headers :accept, :content_type
check_privileges("project", "w")
body = create_object_from_json_body
check_string(body["name"], "Parameter 'name' must be a not empty string")
check_array(body["deploy_envs"], "Parameter 'deploy_envs' must be a not empty array of objects", Hash)
p = Project.new(body)
halt_response("Project '#{p.id}' already exist") if BaseRoutes.mongo.is_project_exists?(p)
halt_response("Project '#{p.id}' already exist") if settings.mongo.is_project_exists?(p)
p.add_authorized_user [request.env['REMOTE_USER']]
BaseRoutes.mongo.project_insert p
settings.mongo.project_insert p
roles_res = ""
if p.multi?
logger.info "Project '#{p.id}' with type 'multi' created"
@ -226,13 +224,13 @@ module Version2_0
# * *Returns* :
# 200 - Updated
# TODO: multi project
put "/project/:id" do
app.put "/project/:id" do
check_headers
check_privileges("project", "w")
project = Project.new(create_object_from_json_body)
project.id = params[:id]
old_project = BaseRoutes.mongo.project params[:id]
BaseRoutes.mongo.project_update project
old_project = settings.mongo.project params[:id]
settings.mongo.project_update project
roles = create_new_roles(old_project, project, logger)
info = "Project '#{project.id}' has been updated." + create_roles_response(roles)
create_response(info)
@ -256,11 +254,11 @@ module Version2_0
# * *Returns* :
# 200 - Updated
# TODO: multi project
put "/project/:id/user" do
users = BaseRoutes.mongo.users(@users).map{|u| u.id}
app.put "/project/:id/user" do
users = settings.mongo.users(@users).map{|u| u.id}
buf = @users - users
@project.add_authorized_user users, @deploy_env
BaseRoutes.mongo.project_update(@project)
settings.mongo.project_update(@project)
info = "Users '#{users.join("', '")}' have been added to '#{params[:id]}' project's authorized users"
info << ", invalid users: '#{buf.join("', '")}'" unless buf.empty?
create_response(info)
@ -284,9 +282,9 @@ module Version2_0
# * *Returns* :
# 200 - Updated
# TODO: multi project
delete "/project/:id/user" do
app.delete "/project/:id/user" do
@project.remove_authorized_user @users, @deploy_env
BaseRoutes.mongo.project_update @project
settings.mongo.project_update @project
info = "Users '#{@users.join("', '")}' have been removed from '#{params[:id]}' project's authorized users"
create_response(info)
end
@ -307,15 +305,15 @@ module Version2_0
# * *Returns* :
# 200 - Updated
# TODO: multi project
put "/project/:id/:env/run_list" do
app.put "/project/:id/:env/run_list" do
check_headers :accept, :content_type
check_privileges("project", "w")
list = create_object_from_json_body(Array)
check_array(list, "Body must contains not empty array of strings")
project = BaseRoutes.mongo.project(params[:id])
project = settings.mongo.project(params[:id])
env = project.deploy_env params[:env]
env.run_list = list
BaseRoutes.mongo.project_update project
settings.mongo.project_update project
create_response("Updated environment '#{env.identifier}' with run_list '#{env.run_list.inspect}' in project '#{project.id}'")
end
@ -333,22 +331,22 @@ module Version2_0
#
# * *Returns* :
# 200 - Deleted
delete "/project/:id" do
app.delete "/project/:id" do
check_headers :accept, :content_type
check_privileges("project", "w")
servers = BaseRoutes.mongo.servers params[:id]
servers = settings.mongo.servers params[:id]
raise DependencyError.new "Deleting #{params[:id]} is forbidden: Project has servers" if !servers.empty?
body = create_object_from_json_body(Hash, true)
deploy_env = unless body.nil?
check_string(body["deploy_env"], "Parameter 'deploy_env' should be a not empty string", true)
end
info = if deploy_env.nil?
BaseRoutes.mongo.project_delete(params[:id])
settings.mongo.project_delete(params[:id])
"Project '#{params[:id]}' is deleted"
else
project = BaseRoutes.mongo.project(params[:id])
project = settings.mongo.project(params[:id])
project.remove_env params[:deploy_env]
BaseRoutes.mongo.project_update project
settings.mongo.project_update project
"Project '#{params[:id]}'. Deploy environment '#{params[:deploy_env]}' has been deleted"
end
create_response(info)
@ -369,14 +367,14 @@ module Version2_0
# }
#
# * *Returns* : text stream
post "/project/:id/deploy" do
app.post "/project/:id/deploy" do
check_headers :content_type
check_privileges("project", "x")
obj = create_object_from_json_body
check_string(obj["deploy_env"], "Parameter 'deploy_env' should be a not empty string", true)
check_array(obj["servers"], "Parameter 'servers' should be a not empty array of strings", String, true)
project = BaseRoutes.mongo.project(params[:id])
servers = BaseRoutes.mongo.servers(params[:id], obj["deploy_env"], obj["servers"], true)
project = settings.mongo.project(params[:id])
servers = settings.mongo.servers(params[:id], obj["deploy_env"], obj["servers"], true)
keys = {}
if obj.key?("trace")
stream() do |out|
@ -387,14 +385,14 @@ module Version2_0
logger.debug "Deploy server: #{s.inspect}"
begin
BaseRoutes.mongo.check_project_auth s.project, s.deploy_env, request.env['REMOTE_USER']
settings.mongo.check_project_auth s.project, s.deploy_env, request.env['REMOTE_USER']
rescue InvalidPrivileges, RecordNotFound => e
out << e.message + "\n"
status.push 2
next
end
unless keys.key? s.key
k = BaseRoutes.mongo.key s.key
k = settings.mongo.key s.key
keys[s.key] = k.path
end
status.push(deploy_server(out, s, keys[s.key]))
@ -410,7 +408,7 @@ module Version2_0
uri = URI.parse(request.url)
servers.each do |s|
project = begin
BaseRoutes.mongo.check_project_auth s.project, s.deploy_env, request.env['REMOTE_USER']
settings.mongo.check_project_auth s.project, s.deploy_env, request.env['REMOTE_USER']
rescue InvalidPrivileges, RecordNotFound => e
next
end
@ -490,10 +488,10 @@ module Version2_0
# },
# "message": "Test project 'project_1' and environment 'prod'"
# }
post "/project/test/:id/:env" do
app.post "/project/test/:id/:env" do
check_headers :accept, :content_type
check_privileges("project", "r")
project = BaseRoutes.mongo.project(params[:id])
project = settings.mongo.project(params[:id])
env = project.deploy_env params[:env]
logger.info "Test project '#{project.id}' and environment '#{env.identifier}'"
@ -512,7 +510,10 @@ module Version2_0
json files
end
private
puts "Project routes initialized"
end
def create_roles project_id, envs, logger
all_roles = KnifeCommands.roles
return " Can't get roles list" if all_roles.nil?
@ -553,6 +554,9 @@ module Version2_0
info
end
end
end
end
end
end

View File

@ -1,18 +1,14 @@
# encoding: UTF-8
require 'sinatra/base'
require "json"
require "routes/v2.0/base_routes"
require "providers/provider_factory"
module Sinatra
module Devops
module Version2_0
module Core
module ProviderRoutes
def self.registered(app)
puts "Provider routes initialized"
# Get devops providers
#
@ -31,6 +27,8 @@ module Sinatra
check_privileges("provider", "r")
json ::Provider::ProviderFactory.providers
end
puts "Provider routes initialized"
end
end
end

View File

@ -1,19 +1,16 @@
require "providers/provider_factory"
require "routes/v2.0/base_routes"
require "fileutils"
require "commands/status"
module Devops
module Version2_0
class ScriptRoutes < BaseRoutes
module Core
module ScriptRoutes
include StatusCommands
extend StatusCommands
def initialize wrapper
super wrapper
puts "Script routes initialized"
end
before "/script/:script_name" do
def self.registered(app)
app.before "/script/:script_name" do
check_headers :accept
check_privileges("script", "w")
file_name = params[:script_name]
@ -25,7 +22,7 @@ module Version2_0
end
end
after %r{\A/script/((command|run)/)?[\w]+\z} do
app.after %r{\A/script/((command|run)/)?[\w]+\z} do
statistic
end
@ -40,7 +37,7 @@ module Version2_0
# [
# "script_1"
# ]
get "/scripts" do
app.get "/scripts" do
check_headers :accept
check_privileges("script", "r")
res = []
@ -56,7 +53,7 @@ module Version2_0
# command to run
#
# * *Returns* : text stream
post "/script/command/:node_name" do
app.post "/script/command/:node_name" do
check_privileges("script", "x")
user = request.env['REMOTE_USER']
s = BaseRoutes.mongo.server_by_chef_node_name params[:node_name]
@ -94,7 +91,7 @@ module Version2_0
# }
#
# * *Returns* : text stream
post "/script/run/:script_name" do
app.post "/script/run/:script_name" do
check_headers :content_type
check_privileges("script", "x")
file_name = params[:script_name]
@ -159,7 +156,7 @@ module Version2_0
#
# * *Returns* :
# 201 - Created
put "/script/:script_name" do
app.put "/script/:script_name" do
File.open(@file, "w") {|f| f.write(request.body.read)}
create_response("File '#{params[:script_name]}' created", nil, 201)
end
@ -173,9 +170,15 @@ module Version2_0
#
# * *Returns* :
# 200 - Deleted
delete "/script/:script_name" do
app.delete "/script/:script_name" do
FileUtils.rm(@file)
create_response("File '#{params[:script_name]}' deleted")
end
puts "Script routes initialized"
end
end
end
end
end

View File

@ -3,7 +3,6 @@ require "json"
require "chef"
require "commands/knife_commands"
require 'rufus-scheduler'
require "routes/v2.0/base_routes"
require "providers/provider_factory"
require "db/mongo/models/deploy_env"
require "commands/status"
@ -12,7 +11,10 @@ require "commands/bootstrap_templates"
require "workers/create_server_worker"
require "workers/bootstrap_worker"
module Devops
module Version2_0
module Core
module ServerRoutes
class ExpireHandler
include ServerCommands
@ -25,37 +27,31 @@ module Version2_0
def call(job)
@logger.info("Removing node '#{@server.chef_node_name}' form project '#{@server.project}' and env '#{@server.deploy_env}'")
begin
delete_server(@server, BaseRoutes.mongo, @logger)
delete_server(@server, settings.mongo, @logger)
rescue => e
logger.error "ExpiredHandler error: " + e.message
end
end
end
class ServerRoutes < BaseRoutes
extend StatusCommands
extend ServerCommands
extend BootstrapTemplatesCommands
include StatusCommands
include ServerCommands
include BootstrapTemplatesCommands
scheduler = Rufus::Scheduler.new
def initialize wrapper
super wrapper
puts "Server routes initialized"
end
before %r{\A/server/[\w]+/(pause|unpouse|reserve|unreserve)\z} do
def self.registered(app)
app.before %r{\A/server/[\w]+/(pause|unpouse|reserve|unreserve)\z} do
check_headers :accept, :content_type
check_privileges("server", "w")
body = create_object_from_json_body(Hash, true)
@key = (body.nil? ? nil : body["key"])
end
after %r{\A/server(/[\w]+)?\z | \A/server/(add|bootstrap)\z | \A/server/[\w]+/(un)?pause\z} do
app.after %r{\A/server(/[\w]+)?\z | \A/server/(add|bootstrap)\z | \A/server/[\w]+/(un)?pause\z} do
statistic
end
scheduler = Rufus::Scheduler.new
# Get devops servers list
#
# * *Request*
@ -72,7 +68,7 @@ module Version2_0
# "chef_node_name": "chef name"
# }
# ]
get "/servers" do
app.get "/servers" do
check_headers :accept
check_privileges("server", "r")
fields = []
@ -82,7 +78,7 @@ module Version2_0
end
end
reserved = (params.key?("reserved") ? true : nil)
json BaseRoutes.mongo.servers(nil, nil, nil, reserved, fields).map {|s| s.to_hash}
json settings.mongo.servers(nil, nil, nil, reserved, fields).map {|s| s.to_hash}
end
# Get chef nodes list
@ -98,7 +94,7 @@ module Version2_0
# "chef_node_name": "chef name"
# }
# ]
get "/servers/chef" do
app.get "/servers/chef" do
check_headers :accept
check_privileges("server", "r")
json KnifeCommands.chef_node_list
@ -140,7 +136,7 @@ module Version2_0
# "private_ip": "172.17.0.1"
# }
# ]
get "/servers/:provider" do
app.get "/servers/:provider" do
check_headers :accept
check_privileges("server", "r")
json ::Provider::ProviderFactory.get(params[:provider]).servers
@ -161,7 +157,7 @@ module Version2_0
# "chef_node_name": "chef name"
# }
# ]
get "/server/:name" do
app.get "/server/:name" do
check_headers :accept
check_privileges("server", "r")
json get_server(params[:name], params[:key]).to_hash
@ -181,15 +177,15 @@ module Version2_0
#
# * *Returns* :
# 200 - Deleted
delete "/server/:id" do
app.delete "/server/:id" do
check_headers
check_privileges("server", "w")
body = create_object_from_json_body(Hash, true)
key = (body.nil? ? nil : body["key"])
s = get_server(params[:id], key)
### Authorization
BaseRoutes.mongo.check_project_auth s.project, s.deploy_env, request.env['REMOTE_USER']
info, r = delete_server(s, BaseRoutes.mongo, logger)
settings.mongo.check_project_auth s.project, s.deploy_env, request.env['REMOTE_USER']
info, r = delete_server(s, settings.mongo, logger)
create_response(info, r)
end
@ -213,7 +209,7 @@ module Version2_0
# }
#
# * *Returns* : text stream
post "/server" do
app.post "/server" do
check_headers :content_type
check_privileges("server", "w")
body = create_object_from_json_body
@ -227,9 +223,9 @@ module Version2_0
halt_response("Parameter 'force' should be a null or true") unless force.nil? or force == true
groups = check_array(body["groups"], "Parameter 'groups' should be null or not empty array of string", String, true)
key_name = check_string(body["key"], "Parameter 'key' should be null or not empty string", true)
new_key = BaseRoutes.mongo.key(key_name) unless key_name.nil?
new_key = settings.mongo.key(key_name) unless key_name.nil?
p = BaseRoutes.mongo.check_project_auth(project_name, env_name, user)
p = settings.mongo.check_project_auth(project_name, env_name, user)
env = p.deploy_env(env_name)
provider = ::Provider::ProviderFactory.get(env.provider)
@ -239,13 +235,13 @@ module Version2_0
halt_response("Invalid security groups '#{buf.join("', '")}' for provider '#{provider.name}'") if buf.empty?
end
servers = extract_servers(provider, p, env, body, user, BaseRoutes.mongo)
servers = extract_servers(provider, p, env, body, user, settings.mongo)
if body.key?("trace")
stream() do |out|
begin
status = []
servers.each do |s|
res = create_server_proc.call(out, s, provider, BaseRoutes.mongo)
res = create_server_proc.call(out, s, provider, settings.mongo)
status.push res
end
out << create_status(status)
@ -284,10 +280,10 @@ module Version2_0
#
# * *Returns* :
# 200 - Paused
post "/server/:node_name/pause" do
app.post "/server/:node_name/pause" do
s = get_server(params[:node_name], @key)
## Authorization
BaseRoutes.mongo.check_project_auth s.project, s.deploy_env, request.env['REMOTE_USER']
settings.mongo.check_project_auth s.project, s.deploy_env, request.env['REMOTE_USER']
provider = ::Provider::ProviderFactory.get(s.provider)
r = provider.pause_server s
if r.nil?
@ -311,10 +307,10 @@ module Version2_0
#
# * *Returns* :
# 200 - Unpaused
post "/server/:node_name/unpause" do
app.post "/server/:node_name/unpause" do
s = get_server(params[:node_name], @key)
## Authorization
BaseRoutes.mongo.check_project_auth s.project, s.deploy_env, request.env['REMOTE_USER']
settings.mongo.check_project_auth s.project, s.deploy_env, request.env['REMOTE_USER']
provider = ::Provider::ProviderFactory.get(s.provider)
r = provider.unpause_server s
if r.nil?
@ -338,13 +334,13 @@ module Version2_0
#
# * *Returns* :
# 200 - Reserved
post "/server/:node_name/reserve" do
app.post "/server/:node_name/reserve" do
s = get_server(params[:node_name], params[:key])
user = request.env['REMOTE_USER']
BaseRoutes.mongo.check_project_auth s.project, s.deploy_env, user
settings.mongo.check_project_auth s.project, s.deploy_env, user
halt_response(400, "Server '#{params[:node_name]}' already reserved") unless s.reserved_by.nil?
s.reserved_by = user
BaseRoutes.mongo.server_update(s)
settings.mongo.server_update(s)
create_response("Server '#{params[:node_name]}' has been reserved")
end
@ -362,12 +358,12 @@ module Version2_0
#
# * *Returns* :
# 200 - Unreserved
post "/server/:node_name/unreserve" do
app.post "/server/:node_name/unreserve" do
s = get_server(params[:node_name], params[:key])
BaseRoutes.mongo.check_project_auth s.project, s.deploy_env, request.env['REMOTE_USER']
settings.mongo.check_project_auth s.project, s.deploy_env, request.env['REMOTE_USER']
halt_response(400, "Server '#{params[:node_name]}' is not reserved") if s.reserved_by.nil?
s.reserved_by = nil
BaseRoutes.mongo.server_update(s)
settings.mongo.server_update(s)
create_response("Server '#{params[:node_name]}' has been unreserved")
end
@ -388,7 +384,7 @@ module Version2_0
#
# * *Returns* : text stream
# TODO: check bootstrap template name
post "/server/bootstrap" do
app.post "/server/bootstrap" do
check_headers
check_privileges("server", "w")
body = create_object_from_json_body(Hash, true)
@ -400,9 +396,9 @@ module Version2_0
halt_response(validator.message) unless validator.valid?
end
t = check_string(body["bootstrap_template"], "Parameter 'bootstrap_template' should be a not empty string", true)
s = BaseRoutes.mongo.server_by_instance_id(id)
s = settings.mongo.server_by_instance_id(id)
p = BaseRoutes.mongo.check_project_auth s.project, s.deploy_env, request.env['REMOTE_USER']
p = settings.mongo.check_project_auth s.project, s.deploy_env, request.env['REMOTE_USER']
d = p.deploy_env s.deploy_env
provider = ::Provider::ProviderFactory.get(s.provider)
@ -422,12 +418,12 @@ module Version2_0
if body.key?("trace")
stream() do |out|
begin
cert = BaseRoutes.mongo.key s.key
cert = settings.mongo.key s.key
logger.debug "Bootstrap certificate path: #{cert.path}"
bootstrap s, out, cert.path, logger
str = nil
r = if check_server(s)
BaseRoutes.mongo.server_set_chef_node_name s
settings.mongo.server_set_chef_node_name s
str = "Server with id '#{s.id}' is bootstraped"
logger.info str
0
@ -482,7 +478,7 @@ module Version2_0
# * *Returns* :
# 200 - Added
# TODO: should be refactored
post "/server/add" do
app.post "/server/add" do
check_headers
check_privileges("server", "w")
body = create_object_from_json_body
@ -492,11 +488,11 @@ module Version2_0
remote_user = check_string(body["remote_user"], "Parameter 'remote_user' must be a not empty string")
private_ip = check_string(body["private_ip"], "Parameter 'private_ip' must be a not empty string")
public_ip = check_string(body["public_ip"], "Parameter 'public_ip' should be a not empty string", true)
p = BaseRoutes.mongo.check_project_auth project, deploy_env, request.env['REMOTE_USER']
p = settings.mongo.check_project_auth project, deploy_env, request.env['REMOTE_USER']
d = p.deploy_env(deploy_env)
cert = BaseRoutes.mongo.key(key)
cert = settings.mongo.key(key)
provider = ::Provider::ProviderFactory.get("static")
s = Server.new
s.provider = provider.name
@ -508,17 +504,20 @@ module Version2_0
s.static = true
s.id = "static_#{cert.id}-#{Time.now.to_i}"
s.key = cert.id
BaseRoutes.mongo.server_insert s
settings.mongo.server_insert s
create_response("Server '#{s.id}' has been added")
end
private
puts "Server routes initialized"
end
def get_server id, key
key == "instance" ? BaseRoutes.mongo.server_by_instance_id(id) : BaseRoutes.mongo.server_by_chef_node_name(id)
key == "instance" ? settings.mongo.server_by_instance_id(id) : settings.mongo.server_by_chef_node_name(id)
end
def check_chef_node_name name, provider
BaseRoutes.mongo.server_by_chef_node_name name
settings.mongo.server_by_chef_node_name name
halt(400, "Server with name '#{name}' already exist")
rescue RecordNotFound => e
# server not found - OK
@ -532,3 +531,5 @@ module Version2_0
end
end
end
end

View File

@ -1,21 +1,24 @@
require "json"
require "routes/v2.0/base_routes"
require "sidekiq"
module Devops
module Version2_0
class StatusRoutes < BaseRoutes
module Core
module StatusRoutes
def initialize wrapper
super wrapper
puts "Status routes initialized"
end
get "/status/:id" do
def self.registered(app)
app.get "/status/:id" do
r = Sidekiq.redis do |connection|
connection.hget("devops", params[:id])
end
return [404, "Job with id '#{params[:id]}' not found"] if r.nil?
r
end
puts "Status routes initialized"
end
end
end
end
end

View File

@ -1,14 +1,12 @@
require "commands/knife_commands"
module Devops
module Version2_0
class TagRoutes < BaseRoutes
module Core
module TagRoutes
def initialize wrapper
super wrapper
puts "Tag routes initialized"
end
before "/tags/:node_name" do
def self.registered(app)
app.before "/tags/:node_name" do
if request.get?
check_headers :accept
check_privileges("server", "r")
@ -23,7 +21,7 @@ module Version2_0
@chef_node_name = server.chef_node_name
end
after "/tags/:node_name" do
app.after "/tags/:node_name" do
statistic
end
@ -38,7 +36,7 @@ module Version2_0
# [
# "tag_1"
# ]
get "/tags/:node_name" do
app.get "/tags/:node_name" do
json(KnifeCommands.tags_list(@chef_node_name))
end
@ -56,7 +54,7 @@ module Version2_0
#
# * *Returns* :
# 200
post "/tags/:node_name" do
app.post "/tags/:node_name" do
tagsStr = @tags.join(" ")
cmd = KnifeCommands.tags_create(@chef_node_name, tagsStr)
halt_response("Error: Cannot add tags #{tagsStr} to server #{@chef_node_name}", 500) unless cmd[1]
@ -77,11 +75,17 @@ module Version2_0
#
# * *Returns* :
# 200
delete "/tags/:node_name" do
app.delete "/tags/:node_name" do
tagsStr = @tags.join(" ")
cmd = KnifeCommands.tags_delete(@chef_node_name, tagsStr)
halt_response("Cannot delete tags #{tagsStr} from server #{@chef_node_name}: #{cmd[0]}", 500) unless cmd[1]
create_response("Deleted tags for #{@chef_node_name}: #{tagsStr}")
end
puts "Tag routes initialized"
end
end
end
end
end

View File

@ -1,7 +1,7 @@
require "db/exceptions/invalid_record"
require "db/mongo/models/user"
module Sinatra
module Devops
module Version2_0
module Core
module UserRoutes