project, server
This commit is contained in:
parent
f25e95df45
commit
cdbbef0ae7
@ -1,72 +1,48 @@
|
|||||||
require "providers/provider_factory"
|
require "providers/provider_factory"
|
||||||
require "commands/image"
|
require "commands/image"
|
||||||
|
require_relative "request_handler"
|
||||||
|
|
||||||
module Devops
|
module Devops
|
||||||
module Version2_0
|
module API2_0
|
||||||
module Handler
|
module Handler
|
||||||
class Image
|
class Image < RequestHandler
|
||||||
|
|
||||||
extend ImageCommands
|
extend ImageCommands
|
||||||
|
|
||||||
def self.get_images
|
def images provider
|
||||||
lambda {
|
Devops::Db.connector.images(provider)
|
||||||
check_privileges("image", "r")
|
|
||||||
check_provider(params[:provider]) if params[:provider]
|
|
||||||
images = settings.mongo.images(params[:provider])
|
|
||||||
json(images.map {|i| i.to_hash})
|
|
||||||
}
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.get_provider_images
|
def provider_images provider
|
||||||
lambda {
|
Image.get_available_provider_images(Devops::Db.connector, provider)
|
||||||
check_privileges("image", "r")
|
|
||||||
check_provider(params[:provider])
|
|
||||||
json Image.get_available_provider_images(settings.mongo, params[:provider])
|
|
||||||
}
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.get_image
|
def get_image id
|
||||||
lambda {
|
Devops::Db.connector.image(id)
|
||||||
check_privileges("image", "r")
|
|
||||||
json settings.mongo.image(params[:image_id])
|
|
||||||
}
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.create_image
|
def create_image image
|
||||||
lambda {
|
Devops::Db.connector.image_insert Devops::Model::Image.new(image)
|
||||||
check_privileges("image", "w")
|
|
||||||
image = create_object_from_json_body
|
|
||||||
settings.mongo.image_insert Devops::Model::Image.new(image)
|
|
||||||
create_response "Created", nil, 201
|
|
||||||
}
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.update_image
|
def update_image id, image
|
||||||
lambda {
|
Devops::Db.connector.image id
|
||||||
check_privileges("image", "w")
|
obj = Devops::Model::Image.new(image)
|
||||||
settings.mongo.image params[:image_id]
|
obj.id = id
|
||||||
image = Devops::Model::Image.new(create_object_from_json_body)
|
Devops::Db.connector.image_update image
|
||||||
image.id = params[:image_id]
|
|
||||||
settings.mongo.image_update image
|
|
||||||
create_response("Image '#{params[:image_id]}' has been updated")
|
|
||||||
}
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.delete_image
|
def delete_image id
|
||||||
lambda {
|
projects = Devops::Db.connector.projects_by_image id
|
||||||
check_privileges("image", "w")
|
|
||||||
projects = settings.mongo.projects_by_image params[:image_id]
|
|
||||||
unless projects.empty?
|
unless projects.empty?
|
||||||
ar = []
|
ar = []
|
||||||
projects.each do |p|
|
projects.each do |p|
|
||||||
ar += p.deploy_envs.select{|e| e.respond_to?(:image)}.select{|e| e.image == params[:image_id]}.map{|e| "#{p.id}.#{e.identifier}"}
|
ar += p.deploy_envs.select{|e| e.respond_to?(:image)}.select{|e| e.image == id}.map{|e| "#{p.id}.#{e.identifier}"}
|
||||||
end
|
end
|
||||||
raise DependencyError.new "Deleting is forbidden: Image is used in #{ar.join(", ")}"
|
raise DependencyError.new "Deleting is forbidden: Image is used in #{ar.join(", ")}"
|
||||||
end
|
end
|
||||||
|
|
||||||
r = settings.mongo.image_delete params[:image_id]
|
Devops::Db.connector.image_delete id
|
||||||
create_response("Image '#{params[:image_id]}' has been removed")
|
|
||||||
}
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@ -1,17 +1,14 @@
|
|||||||
require "providers/provider_factory"
|
require "providers/provider_factory"
|
||||||
|
require_relative "request_handler"
|
||||||
|
|
||||||
module Devops
|
module Devops
|
||||||
module Version2_0
|
module API2_0
|
||||||
module Handler
|
module Handler
|
||||||
class Network
|
class Network < RequestHandler
|
||||||
|
|
||||||
def self.get_networks
|
def networks provider
|
||||||
lambda {
|
p = ::Provider::ProviderFactory.get provider
|
||||||
check_privileges("network", "r")
|
p.networks_detail
|
||||||
check_provider(params[:provider])
|
|
||||||
p = ::Provider::ProviderFactory.get params[:provider]
|
|
||||||
json p.networks_detail
|
|
||||||
}
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@ -3,241 +3,169 @@ require "commands/status"
|
|||||||
require "commands/server"
|
require "commands/server"
|
||||||
require "db/mongo/models/project"
|
require "db/mongo/models/project"
|
||||||
require "workers/project_test_worker"
|
require "workers/project_test_worker"
|
||||||
|
require_relative "request_handler"
|
||||||
|
|
||||||
module Devops
|
module Devops
|
||||||
module Version2_0
|
module API2_0
|
||||||
module Handler
|
module Handler
|
||||||
class Project
|
class Project < RequestHandler
|
||||||
|
|
||||||
extend DeployCommands
|
extend DeployCommands
|
||||||
extend StatusCommands
|
extend StatusCommands
|
||||||
extend ServerCommands
|
extend ServerCommands
|
||||||
|
|
||||||
def self.get_projects
|
def projects
|
||||||
lambda {
|
|
||||||
check_privileges("project", "r")
|
|
||||||
fields = []
|
fields = []
|
||||||
if params.key?("fields") and params["fields"].is_a?(Array)
|
if @params.key?("fields") and @params["fields"].is_a?(Array)
|
||||||
Devops::Model::Project.fields.each do |k|
|
Devops::Model::Project.fields.each do |k|
|
||||||
fields.push k if params["fields"].include?(k)
|
fields.push k if @params["fields"].include?(k)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
archived = params.include?("archived")
|
archived = @params.include?("archived")
|
||||||
json settings.mongo.projects(nil, nil, fields, archived).map {|p| p.to_hash}
|
Devops::Db.connector.projects(nil, nil, fields, archived)
|
||||||
}
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.get_project
|
def project id
|
||||||
lambda {
|
Devops::Db.connector.project(id)
|
||||||
check_privileges("project", "r")
|
|
||||||
json settings.mongo.project(params[:project])
|
|
||||||
}
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.get_project_servers
|
def project_servers id
|
||||||
lambda {
|
Devops::Db.connector.project(id)
|
||||||
check_privileges("project", "r")
|
Devops::Db.connector.servers(id, @params[:deploy_env])
|
||||||
settings.mongo.project(params[:project])
|
|
||||||
json settings.mongo.servers(params[:project], params[:deploy_env]).map{|s| s.to_hash}
|
|
||||||
}
|
|
||||||
end
|
end
|
||||||
|
|
||||||
# TODO: multi project
|
# TODO: multi project
|
||||||
def self.create_project
|
def create_project body
|
||||||
lambda {
|
|
||||||
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 = Devops::Model::Project.new(body)
|
p = Devops::Model::Project.new(body)
|
||||||
halt_response("Project '#{p.id}' already exist") if settings.mongo.is_project_exists?(p)
|
halt_response("Project '#{p.id}' already exist") if Devops::Db.connector.is_project_exists?(p)
|
||||||
p.add_authorized_user [request.env['REMOTE_USER']]
|
p.add_authorized_user [@request.env['REMOTE_USER']]
|
||||||
p.create
|
p.create
|
||||||
roles_res = ""
|
|
||||||
if p.multi?
|
if p.multi?
|
||||||
logger.info "Project '#{p.id}' with type 'multi' created"
|
"Project '#{p.id}' with type 'multi' created"
|
||||||
else
|
else
|
||||||
logger.info "Project '#{p.id}' created"
|
roles = create_roles p.id, p.deploy_envs, logger
|
||||||
roles = Project.create_roles p.id, p.deploy_envs, logger
|
"Project '#{p.id}' created. " + create_roles_response(roles)
|
||||||
roles_res = ". " + Project.create_roles_response(roles)
|
|
||||||
end
|
end
|
||||||
res = "Created" + roles_res
|
|
||||||
create_response(res, nil, 201)
|
|
||||||
}
|
|
||||||
end
|
end
|
||||||
|
|
||||||
# TODO: multi project
|
# TODO: multi project
|
||||||
def self.update_project
|
def update_project id, body
|
||||||
lambda {
|
project = Devops::Model::Project.new(body)
|
||||||
check_privileges("project", "w")
|
project.id = id
|
||||||
project = Devops::Model::Project.new(create_object_from_json_body)
|
old_project = Devops::Db.connector.project id
|
||||||
project.id = params[:project]
|
Devops::Db.connector.project_update project
|
||||||
old_project = settings.mongo.project params[:project]
|
roles = create_new_roles(old_project, project, logger)
|
||||||
settings.mongo.project_update project
|
create_roles_response(roles)
|
||||||
roles = Devops::Version2_0::Handler::Project.create_new_roles(old_project, project, logger)
|
|
||||||
info = "Project '#{project.id}' has been updated." + Project.create_roles_response(roles)
|
|
||||||
create_response(info)
|
|
||||||
}
|
|
||||||
end
|
end
|
||||||
|
|
||||||
# TODO: multi project
|
# TODO: multi project
|
||||||
def self.update_project_users
|
def update_project_users id, deploy_env, users
|
||||||
lambda {
|
project = Devops::Db.connector.project(id)
|
||||||
check_privileges("project", "w")
|
dbusers = Devops::Db.connector.users(users).map{|u| u.id}
|
||||||
body = create_object_from_json_body
|
buf = dbusers - users
|
||||||
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 = settings.mongo.project(params[:id])
|
|
||||||
users = settings.mongo.users(users).map{|u| u.id}
|
|
||||||
buf = users - users
|
|
||||||
project.add_authorized_user users, deploy_env
|
project.add_authorized_user users, deploy_env
|
||||||
settings.mongo.project_update(project)
|
Devops::Db.connector.project_update(project)
|
||||||
info = "Users '#{users.join("', '")}' have been added to '#{params[:id]}' project's authorized users"
|
info = "Users '#{dbusers.join("', '")}' has been added to '#{id}' project's authorized users"
|
||||||
info << ", invalid users: '#{buf.join("', '")}'" unless buf.empty?
|
info << ", invalid users: '#{buf.join("', '")}'" unless buf.empty?
|
||||||
create_response(info)
|
info
|
||||||
}
|
|
||||||
end
|
end
|
||||||
|
|
||||||
# TODO: multi project
|
# TODO: multi project
|
||||||
def self.delete_project_users
|
def delete_project_users id, deploy_env, users
|
||||||
lambda {
|
project = Devops::Db.connector.project(id)
|
||||||
check_privileges("project", "w")
|
project.remove_authorized_user users, deploy_env
|
||||||
@project.remove_authorized_user @users, @deploy_env
|
Devops::Db.connector.project_update project
|
||||||
settings.mongo.project_update @project
|
"Users '#{users.join("', '")}' have been removed from '#{id}' project's authorized users"
|
||||||
info = "Users '#{@users.join("', '")}' have been removed from '#{params[:id]}' project's authorized users"
|
|
||||||
create_response(info)
|
|
||||||
}
|
|
||||||
end
|
end
|
||||||
|
|
||||||
# TODO: multi project
|
# TODO: multi project
|
||||||
def self.set_project_env_run_list
|
def set_project_env_run_list id, deploy_env, list
|
||||||
lambda {
|
project = Devops::Db.connector.project(id)
|
||||||
check_privileges("project", "w")
|
env = project.deploy_env deploy_env
|
||||||
list = create_object_from_json_body(Array)
|
|
||||||
check_array(list, "Body must contains not empty array of strings")
|
|
||||||
project = settings.mongo.project(params[:id])
|
|
||||||
env = project.deploy_env params[:env]
|
|
||||||
env.run_list = list
|
env.run_list = list
|
||||||
settings.mongo.project_update project
|
Devops::Db.connector.project_update project
|
||||||
create_response("Updated environment '#{env.identifier}' with run_list '#{env.run_list.inspect}' in project '#{project.id}'")
|
"Updated environment '#{env.identifier}' with run_list '#{env.run_list.inspect}' in project '#{project.id}'"
|
||||||
}
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.delete_project
|
def delete_project id, deploy_env
|
||||||
lambda {
|
servers = Devops::Db.connector.servers id
|
||||||
check_privileges("project", "w")
|
raise DependencyError.new "Deleting #{id} is forbidden: Project has servers" if !servers.empty?
|
||||||
servers = settings.mongo.servers params[:project]
|
project = Devops::Db.connector.project(id)
|
||||||
raise DependencyError.new "Deleting #{params[:project]} 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
|
|
||||||
project = settings.mongo.project(params[:project])
|
|
||||||
info = if deploy_env.nil?
|
info = if deploy_env.nil?
|
||||||
project.delete
|
project.delete
|
||||||
"Project '#{params[:project]}' is deleted"
|
"Project '#{id}' is deleted"
|
||||||
else
|
else
|
||||||
project.remove_env deploy_env
|
project.remove_env deploy_env
|
||||||
settings.mongo.project_update project
|
Devops::Db.connector.project_update project
|
||||||
"Project '#{params[:project]}'. Deploy environment '#{deploy_env}' has been deleted"
|
"Project '#{id}'. Deploy environment '#{deploy_env}' has been deleted"
|
||||||
end
|
end
|
||||||
create_response(info)
|
|
||||||
}
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.deploy_project
|
def deploy_project_stream out, id, deploy_env, servers, body
|
||||||
lambda {
|
|
||||||
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 = settings.mongo.project(params[:id])
|
|
||||||
servers = settings.mongo.servers(params[:id], obj["deploy_env"], obj["servers"], true)
|
|
||||||
keys = {}
|
keys = {}
|
||||||
if obj.key?("trace")
|
dbserver = servers(id, deploy_env, servers)
|
||||||
stream() do |out|
|
out << (dbservers.empty? ? "No reserved servers to deploy\n" : "Deploy servers: '#{dbservers.map{|s| s.chef_node_name}.join("', '")}'\n")
|
||||||
begin
|
|
||||||
out << (servers.empty? ? "No reserved servers to deploy\n" : "Deploy servers: '#{servers.map{|s| s.chef_node_name}.join("', '")}'\n")
|
|
||||||
status = []
|
status = []
|
||||||
servers.each do |s|
|
servers.each do |s|
|
||||||
logger.debug "Deploy server: #{s.inspect}"
|
|
||||||
|
|
||||||
begin
|
begin
|
||||||
settings.mongo.check_project_auth s.project, s.deploy_env, request.env['REMOTE_USER']
|
Devops::Db.connector.check_project_auth s.project, s.deploy_env, @request.env['REMOTE_USER']
|
||||||
rescue InvalidPrivileges, RecordNotFound => e
|
rescue InvalidPrivileges, RecordNotFound => e
|
||||||
out << e.message + "\n"
|
out << e.message + "\n"
|
||||||
status.push 2
|
status.push 2
|
||||||
next
|
next
|
||||||
end
|
end
|
||||||
unless keys.key? s.key
|
unless keys.key? s.key
|
||||||
k = settings.mongo.key s.key
|
k = Devops::Db.connector.key s.key
|
||||||
keys[s.key] = k.path
|
keys[s.key] = k.path
|
||||||
end
|
end
|
||||||
status.push(deploy_server(out, s, keys[s.key]))
|
status.push(deploy_server(out, s, keys[s.key]))
|
||||||
end
|
end
|
||||||
out << create_status(status)
|
status
|
||||||
rescue IOError => e
|
|
||||||
logger.error e.message
|
|
||||||
end
|
end
|
||||||
end
|
|
||||||
else
|
def deploy_project id, deploy_env, servers, body
|
||||||
dir = DevopsConfig[:report_dir_v2]
|
dir = DevopsConfig[:report_dir_v2]
|
||||||
files = []
|
files = []
|
||||||
uri = URI.parse(request.url)
|
uri = URI.parse(request.url)
|
||||||
servers.each do |s|
|
servers(id, deploy_env, servers).each do |s|
|
||||||
project = begin
|
project = begin
|
||||||
settings.mongo.check_project_auth s.project, s.deploy_env, request.env['REMOTE_USER']
|
Devops::Db.connector.check_project_auth s.project, s.deploy_env, request.env['REMOTE_USER']
|
||||||
rescue InvalidPrivileges, RecordNotFound => e
|
rescue InvalidPrivileges, RecordNotFound => e
|
||||||
next
|
next
|
||||||
end
|
end
|
||||||
jid = DeployWorker.perform_async(dir, s.to_hash, [], DevopsConfig.config)
|
jid = DeployWorker.perform_async(dir, s.to_hash, [], DevopsConfig.config)
|
||||||
logger.info "Job '#{jid}' has been started"
|
#logger.info "Job '#{jid}' has been started"
|
||||||
uri.path = "#{DevopsConfig[:url_prefix]}/v2.0/report/" + jid
|
uri.path = "#{DevopsConfig[:url_prefix]}/v2.0/report/" + jid
|
||||||
files.push uri.to_s
|
files.push uri.to_s
|
||||||
end
|
end
|
||||||
json files
|
files
|
||||||
end
|
|
||||||
}
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.archive_project
|
def servers project_id, deploy_env, servers
|
||||||
lambda {
|
project = Devops::Db.connector.project(project_id)
|
||||||
check_privileges("project", "w")
|
dbservers = Devops::Db.connector.servers(project_id, deploy_env, servers, true)
|
||||||
project = settings.mongo.project(params[:project])
|
|
||||||
if project.nil?
|
|
||||||
create_response("Project '#{params[:project]}' not found", nil, 404)
|
|
||||||
else
|
|
||||||
settings.mongo.archive_project(params[:project])
|
|
||||||
info = "Project '#{params[:project]}' has been archived"
|
|
||||||
create_response(info)
|
|
||||||
end
|
|
||||||
}
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.unarchive_project
|
def archive_project id
|
||||||
lambda {
|
project = Devops::Db.connector.project(id)
|
||||||
check_privileges("project", "w")
|
Devops::Db.connector.archive_project(id)
|
||||||
project = settings.mongo.project(params[:project])
|
"Project '#{id}' has been archived"
|
||||||
if project.nil?
|
|
||||||
create_response("Project '#{params[:project]}' not found", nil, 404)
|
|
||||||
else
|
|
||||||
settings.mongo.unarchive_project(params[:project])
|
|
||||||
info = "Project '#{params[:project]}' has been unarchived"
|
|
||||||
create_response(info)
|
|
||||||
end
|
|
||||||
}
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.test_project
|
def unarchive_project id
|
||||||
lambda {
|
project = Devops::Db.connector.project(id)
|
||||||
check_privileges("project", "r")
|
Devops::Db.connector.unarchive_project(id)
|
||||||
project = settings.mongo.project(params[:id])
|
"Project '#{id}' has been unarchived"
|
||||||
env = project.deploy_env params[:env]
|
end
|
||||||
logger.info "Test project '#{project.id}' and environment '#{env.identifier}'"
|
|
||||||
|
def test_project id, deploy_env
|
||||||
|
project = Devops::Db.connector.project(id)
|
||||||
|
env = project.deploy_env deploy_env
|
||||||
|
#logger.info "Test project '#{project.id}' and environment '#{env.identifier}'"
|
||||||
if env.provider == ::Provider::Static::PROVIDER
|
if env.provider == ::Provider::Static::PROVIDER
|
||||||
msg = "Can not test environment with provider '#{::Provider::Static::PROVIDER}'"
|
msg = "Can not test environment with provider '#{::Provider::Static::PROVIDER}'"
|
||||||
Logger.warn msg
|
Logger.warn msg
|
||||||
return [400, msg]
|
raise InvalidRecord.new(msg)
|
||||||
end
|
end
|
||||||
|
|
||||||
dir = DevopsConfig[:report_dir_v2]
|
dir = DevopsConfig[:report_dir_v2]
|
||||||
@ -245,19 +173,17 @@ module Devops
|
|||||||
p = {
|
p = {
|
||||||
:project => project.id,
|
:project => project.id,
|
||||||
:env => env.identifier,
|
:env => env.identifier,
|
||||||
:user => request.env['REMOTE_USER']
|
:user => @request.env['REMOTE_USER']
|
||||||
}
|
}
|
||||||
jid = ProjectTestWorker.perform_async(dir, p, DevopsConfig.config)
|
jid = ProjectTestWorker.perform_async(dir, p, DevopsConfig.config)
|
||||||
Worker.set_status jid, Worker::STATUS::IN_QUEUE
|
Worker.set_status jid, Worker::STATUS::IN_QUEUE
|
||||||
logger.info "Job '#{jid}' has been created"
|
#logger.info "Job '#{jid}' has been created"
|
||||||
uri.path = "#{DevopsConfig[:url_prefix]}/v2.0/report/" + jid
|
uri.path = "#{DevopsConfig[:url_prefix]}/v2.0/report/" + jid
|
||||||
files = [uri.to_s]
|
|
||||||
sleep 1
|
sleep 1
|
||||||
json files
|
return [uri.to_s]
|
||||||
}
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.create_roles project_id, envs, logger
|
def create_roles project_id, envs, logger
|
||||||
all_roles = KnifeCommands.roles
|
all_roles = KnifeCommands.roles
|
||||||
return " Can't get roles list" if all_roles.nil?
|
return " Can't get roles list" if all_roles.nil?
|
||||||
roles = {:new => [], :error => [], :exist => []}
|
roles = {:new => [], :error => [], :exist => []}
|
||||||
@ -279,14 +205,14 @@ module Devops
|
|||||||
roles
|
roles
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.create_new_roles old_project, new_project, logger
|
def create_new_roles old_project, new_project, logger
|
||||||
old_project.deploy_envs.each do |e|
|
old_project.deploy_envs.each do |e|
|
||||||
new_project.remove_env(e.identifier)
|
new_project.remove_env(e.identifier)
|
||||||
end
|
end
|
||||||
Devops::Version2_0::Handler::Project.create_roles new_project.id, new_project.deploy_envs, logger
|
create_roles new_project.id, new_project.deploy_envs, logger
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.create_roles_response roles
|
def create_roles_response roles
|
||||||
if roles.is_a?(String)
|
if roles.is_a?(String)
|
||||||
roles
|
roles
|
||||||
else
|
else
|
||||||
|
|||||||
@ -1,9 +1,10 @@
|
|||||||
require "providers/provider_factory"
|
require "providers/provider_factory"
|
||||||
|
require_relative "request_handler"
|
||||||
|
|
||||||
module Devops
|
module Devops
|
||||||
module API2_0
|
module API2_0
|
||||||
module Handler
|
module Handler
|
||||||
class Provider
|
class Provider < RequestHandler
|
||||||
|
|
||||||
def providers
|
def providers
|
||||||
::Provider::ProviderFactory.providers
|
::Provider::ProviderFactory.providers
|
||||||
|
|||||||
@ -36,191 +36,115 @@ module Devops
|
|||||||
::Provider::ProviderFactory.get(provider).servers
|
::Provider::ProviderFactory.get(provider).servers
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.get_server
|
def server id
|
||||||
lambda {
|
get_server_by_key(id, @params[:key])
|
||||||
check_privileges("server", "r")
|
|
||||||
json Server.get_server_by_key(params[:name], params[:key]).to_hash
|
|
||||||
}
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.delete_server
|
def delete id, key
|
||||||
lambda {
|
s = get_server_by_key(params[:id], key)
|
||||||
check_privileges("server", "w")
|
|
||||||
body = create_object_from_json_body(Hash, true)
|
|
||||||
key = (body.nil? ? nil : body["key"])
|
|
||||||
s = Server.get_server_by_key(params[:id], key)
|
|
||||||
### Authorization
|
### Authorization
|
||||||
settings.mongo.check_project_auth s.project, s.deploy_env, request.env['REMOTE_USER']
|
Devops::Db.connector.check_project_auth s.project, s.deploy_env, request.env['REMOTE_USER']
|
||||||
info, r = delete_server(s, settings.mongo, logger)
|
delete_server(s, Devops::Db.connector, logger)
|
||||||
create_response(info, r)
|
|
||||||
}
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.create_server
|
def create_server_stream out, body
|
||||||
lambda {
|
status = []
|
||||||
check_privileges("server", "w")
|
prepare_create_server(body).each do |s|
|
||||||
body = create_object_from_json_body
|
res = create_server_proc.call(out, s, provider, Devops::Db.connector)
|
||||||
user = request.env['REMOTE_USER']
|
status.push res
|
||||||
project_name = check_string(body["project"], "Parameter 'project' must be a not empty string")
|
end
|
||||||
env_name = check_string(body["deploy_env"], "Parameter 'deploy_env' must be a not empty string")
|
status
|
||||||
server_name = check_string(body["name"], "Parameter 'name' should be null or not empty string", true)
|
end
|
||||||
without_bootstrap = body["without_bootstrap"]
|
|
||||||
halt_response("Parameter 'without_bootstrap' should be a null or true") unless without_bootstrap.nil? or without_bootstrap == true
|
|
||||||
force = body["force"]
|
|
||||||
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 = settings.mongo.key(key_name) unless key_name.nil?
|
|
||||||
|
|
||||||
p = settings.mongo.check_project_auth(project_name, env_name, user)
|
def create_server body
|
||||||
env = p.deploy_env(env_name)
|
dir = DevopsConfig[:report_dir_v2]
|
||||||
|
files = []
|
||||||
|
uri = URI.parse(request.url)
|
||||||
|
prepare_create_server(body).each do |s|
|
||||||
|
h = s.to_hash
|
||||||
|
h["options"] = s.options
|
||||||
|
jid = CreateServerWorker.perform_async(dir, env.provider, h, @request.env['REMOTE_USER'], DevopsConfig.config)
|
||||||
|
Worker.set_status jid, Worker::STATUS::IN_QUEUE
|
||||||
|
#logger.info "Job '#{jid}' has been started"
|
||||||
|
uri.path = "#{DevopsConfig[:url_prefix]}/v2.0/report/" + jid
|
||||||
|
files.push uri.to_s
|
||||||
|
end
|
||||||
|
sleep 1
|
||||||
|
files
|
||||||
|
end
|
||||||
|
|
||||||
|
def prepare_create_server body
|
||||||
|
user = @request.env['REMOTE_USER']
|
||||||
|
key_name = body["key"]
|
||||||
|
new_key = Devops::Db.connector.key(key_name) unless key_name.nil?
|
||||||
|
|
||||||
|
p = Devops::Db.connector.check_project_auth(body["project"], body["deploy_env"], user)
|
||||||
|
env = p.deploy_env(body["deploy_env"])
|
||||||
|
|
||||||
provider = ::Provider::ProviderFactory.get(env.provider)
|
provider = ::Provider::ProviderFactory.get(env.provider)
|
||||||
Server.check_chef_node_name(server_name, provider) unless server_name.nil?
|
server_name = body["name"]
|
||||||
|
check_chef_node_name(server_name, provider) unless server_name.nil?
|
||||||
|
groups = body["groups"]
|
||||||
unless groups.nil?
|
unless groups.nil?
|
||||||
buf = groups - provider.groups.keys
|
buf = groups - provider.groups.keys
|
||||||
halt_response("Invalid security groups '#{buf.join("', '")}' for provider '#{provider.name}'") if buf.empty?
|
halt_response("Invalid security groups '#{buf.join("', '")}' for provider '#{provider.name}'") if buf.empty?
|
||||||
end
|
end
|
||||||
|
|
||||||
servers = Server.extract_servers(provider, p, env, body, user, settings.mongo)
|
Server.extract_servers(provider, p, env, body, user, Devops::Db.connector)
|
||||||
if body.key?("trace")
|
|
||||||
stream() do |out|
|
|
||||||
begin
|
|
||||||
status = []
|
|
||||||
servers.each do |s|
|
|
||||||
res = create_server_proc.call(out, s, provider, settings.mongo)
|
|
||||||
status.push res
|
|
||||||
end
|
|
||||||
out << create_status(status)
|
|
||||||
rescue IOError => e
|
|
||||||
logger.error e.message
|
|
||||||
end
|
|
||||||
end
|
|
||||||
else
|
|
||||||
dir = DevopsConfig[:report_dir_v2]
|
|
||||||
files = []
|
|
||||||
uri = URI.parse(request.url)
|
|
||||||
servers.each do |s|
|
|
||||||
h = s.to_hash
|
|
||||||
h["options"] = s.options
|
|
||||||
jid = CreateServerWorker.perform_async(dir, env.provider, h, request.env['REMOTE_USER'], DevopsConfig.config)
|
|
||||||
Worker.set_status jid, Worker::STATUS::IN_QUEUE
|
|
||||||
logger.info "Job '#{jid}' has been started"
|
|
||||||
uri.path = "#{DevopsConfig[:url_prefix]}/v2.0/report/" + jid
|
|
||||||
files.push uri.to_s
|
|
||||||
end
|
|
||||||
sleep 1
|
|
||||||
json files
|
|
||||||
end
|
|
||||||
}
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.pause_server
|
def pause_server node_name, key
|
||||||
lambda {
|
s = Server.get_server_by_key(node_name, key)
|
||||||
check_privileges("server", "w")
|
|
||||||
body = create_object_from_json_body(Hash, true)
|
|
||||||
key = (body.nil? ? nil : body["key"])
|
|
||||||
s = Server.get_server_by_key(params[:node_name], key)
|
|
||||||
## Authorization
|
## Authorization
|
||||||
settings.mongo.check_project_auth s.project, s.deploy_env, request.env['REMOTE_USER']
|
Devops::Db.connector.check_project_auth s.project, s.deploy_env, @request.env['REMOTE_USER']
|
||||||
provider = ::Provider::ProviderFactory.get(s.provider)
|
provider = ::Provider::ProviderFactory.get(s.provider)
|
||||||
r = provider.pause_server s
|
r = provider.pause_server s
|
||||||
if r.nil?
|
if r.nil?
|
||||||
create_response("Server with instance ID '#{s.id}' and node name '#{params[:node_name]}' is paused")
|
"Server with instance ID '#{s.id}' and node name '#{node_name}' is paused"
|
||||||
else
|
else
|
||||||
halt_response("Server with instance ID '#{s.id}' and node name '#{params[:node_name]}' can not be paused, It in state '#{r}'", 409)
|
raise ConflictException.new("Server with instance ID '#{s.id}' and node name '#{node_name}' can not be paused, It in state '#{r}'", 409)
|
||||||
end
|
end
|
||||||
}
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.unpause_server
|
def unpause_server node_name, key
|
||||||
lambda {
|
|
||||||
check_privileges("server", "w")
|
|
||||||
body = create_object_from_json_body(Hash, true)
|
|
||||||
key = (body.nil? ? nil : body["key"])
|
|
||||||
s = Server.get_server_by_key(params[:node_name], key)
|
s = Server.get_server_by_key(params[:node_name], key)
|
||||||
## Authorization
|
## Authorization
|
||||||
settings.mongo.check_project_auth s.project, s.deploy_env, request.env['REMOTE_USER']
|
Devops::Db.connector.check_project_auth s.project, s.deploy_env, @request.env['REMOTE_USER']
|
||||||
provider = ::Provider::ProviderFactory.get(s.provider)
|
provider = ::Provider::ProviderFactory.get(s.provider)
|
||||||
r = provider.unpause_server s
|
r = provider.unpause_server s
|
||||||
if r.nil?
|
if r.nil?
|
||||||
create_response("Server with instance ID '#{s.id}' and node name '#{params[:node_name]}' is unpaused")
|
"Server with instance ID '#{s.id}' and node name '#{node_name}' is unpaused"
|
||||||
else
|
else
|
||||||
halt_response("Server with instance ID '#{s.id}' and node name '#{params[:node_name]}' can not be unpaused, It in state '#{r}'", 409)
|
raise ConflictException.new("Server with instance ID '#{s.id}' and node name '#{node_name}' can not be unpaused, It in state '#{r}'")
|
||||||
end
|
end
|
||||||
}
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.reserve_server
|
def reserve_server node_name, key
|
||||||
lambda {
|
s = get_server_by_key(node_name, key)
|
||||||
check_privileges("server", "w")
|
Devops::Db.connector.check_project_auth s.project, s.deploy_env, @request.env['REMOTE_USER']
|
||||||
body = create_object_from_json_body(Hash, true)
|
raise ConflictException.new("Server '#{node_name}' already reserved") unless s.reserved_by.nil?
|
||||||
key = (body.nil? ? nil : body["key"])
|
|
||||||
s = Server.get_server_by_key(params[:node_name], key)
|
|
||||||
user = request.env['REMOTE_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
|
s.reserved_by = user
|
||||||
settings.mongo.server_update(s)
|
Devops::Db.connector.server_update(s)
|
||||||
create_response("Server '#{params[:node_name]}' has been reserved")
|
|
||||||
}
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.unreserve_server
|
def unreserve_server node_name, key
|
||||||
lambda {
|
s = get_server_by_key(node_name, key)
|
||||||
check_privileges("server", "w")
|
Devops::Db.connector.check_project_auth s.project, s.deploy_env, @request.env['REMOTE_USER']
|
||||||
body = create_object_from_json_body(Hash, true)
|
raise ConflictException.new("Server '#{node_name}' is not reserved") if s.reserved_by.nil?
|
||||||
key = (body.nil? ? nil : body["key"])
|
|
||||||
s = Server.get_server_by_key(params[:node_name], key)
|
|
||||||
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
|
s.reserved_by = nil
|
||||||
settings.mongo.server_update(s)
|
Devops::Db.connector.server_update(s)
|
||||||
create_response("Server '#{params[:node_name]}' has been unreserved")
|
|
||||||
}
|
|
||||||
end
|
end
|
||||||
|
|
||||||
# TODO: check bootstrap template name
|
# TODO: check bootstrap template name
|
||||||
def self.bootstrap_server
|
def bootstrap_server_stream out, body
|
||||||
lambda {
|
s = prepare_create_server body
|
||||||
check_privileges("server", "w")
|
|
||||||
body = create_object_from_json_body(Hash, true)
|
|
||||||
id = check_string(body["instance_id"], "Parameter 'instance_id' must be a not empty string")
|
|
||||||
name = check_string(body["name"], "Parameter 'name' should be a not empty string", true)
|
|
||||||
rl = check_array(body["run_list"], "Parameter 'run_list' should be a not empty array of string", String, true)
|
|
||||||
unless rl.nil?
|
|
||||||
validator = Validators::Helpers::RunList.new(rl)
|
|
||||||
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 = settings.mongo.server_by_instance_id(id)
|
|
||||||
|
|
||||||
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)
|
|
||||||
|
|
||||||
Server.check_chef_node_name(name, provider) unless name.nil?
|
|
||||||
s.options = {
|
|
||||||
:run_list => rl || d.run_list,
|
|
||||||
}
|
|
||||||
unless t.nil?
|
|
||||||
templates = get_templates
|
|
||||||
halt_response("Invalid bootstrap template '#{t}', available values: #{templates.join(", ")}", 400) unless templates.include?(t)
|
|
||||||
s.options[:bootstrap_template] = t
|
|
||||||
end
|
|
||||||
s.chef_node_name = name || provider.create_default_chef_node_name(s)
|
|
||||||
logger.debug "Chef node name: '#{s.chef_node_name}'"
|
|
||||||
status = []
|
status = []
|
||||||
if body.key?("trace")
|
cert = Devops::Db.connector.key s.key
|
||||||
stream() do |out|
|
|
||||||
begin
|
|
||||||
cert = settings.mongo.key s.key
|
|
||||||
logger.debug "Bootstrap certificate path: #{cert.path}"
|
logger.debug "Bootstrap certificate path: #{cert.path}"
|
||||||
bootstrap s, out, cert.path, logger
|
bootstrap s, out, cert.path, logger
|
||||||
str = nil
|
str = nil
|
||||||
r = if check_server(s)
|
r = if check_server(s)
|
||||||
settings.mongo.server_set_chef_node_name s
|
Devops::Db.connector.server_set_chef_node_name s
|
||||||
str = "Server with id '#{s.id}' is bootstraped"
|
str = "Server with id '#{s.id}' is bootstraped"
|
||||||
logger.info str
|
logger.info str
|
||||||
0
|
0
|
||||||
@ -232,19 +156,18 @@ module Devops
|
|||||||
status.push r
|
status.push r
|
||||||
out << str
|
out << str
|
||||||
out << "\n"
|
out << "\n"
|
||||||
out << create_status(status)
|
status
|
||||||
rescue IOError => e
|
|
||||||
logger.error e.message
|
|
||||||
end
|
end
|
||||||
end
|
|
||||||
else
|
def bootstrap_server body
|
||||||
|
s = prepare_create_server body
|
||||||
dir = DevopsConfig[:report_dir_v2]
|
dir = DevopsConfig[:report_dir_v2]
|
||||||
files = []
|
files = []
|
||||||
uri = URI.parse(request.url)
|
uri = URI.parse(@request.url)
|
||||||
h = s.to_hash
|
h = s.to_hash
|
||||||
h["options"] = s.options
|
h["options"] = s.options
|
||||||
h["_id"] = s.id
|
h["_id"] = s.id
|
||||||
jid = BootstrapWorker.perform_async(dir, d.provider, h, request.env['REMOTE_USER'], DevopsConfig.config)
|
jid = BootstrapWorker.perform_async(dir, d.provider, h, @request.env['REMOTE_USER'], DevopsConfig.config)
|
||||||
Worker.set_status jid, Worker::STATUS::IN_QUEUE
|
Worker.set_status jid, Worker::STATUS::IN_QUEUE
|
||||||
logger.info "Job '#{jid}' has been started"
|
logger.info "Job '#{jid}' has been started"
|
||||||
uri.path = "#{DevopsConfig[:url_prefix]}/v2.0/report/" + jid
|
uri.path = "#{DevopsConfig[:url_prefix]}/v2.0/report/" + jid
|
||||||
@ -252,48 +175,61 @@ module Devops
|
|||||||
uri.fragment = nil
|
uri.fragment = nil
|
||||||
files.push uri.to_s
|
files.push uri.to_s
|
||||||
sleep 1
|
sleep 1
|
||||||
json files
|
files
|
||||||
end
|
|
||||||
}
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.add_server
|
def prepare_bootstrap_server body
|
||||||
lambda {
|
id = body["instance_id"]
|
||||||
check_privileges("server", "w")
|
name = body["name"]
|
||||||
body = create_object_from_json_body
|
s = Devops::Db.connector.server_by_instance_id(id)
|
||||||
project = check_string(body["project"], "Parameter 'project' must be a not empty string")
|
|
||||||
deploy_env = check_string(body["deploy_env"], "Parameter 'deploy_env' must be a not empty string")
|
p = Devops::Db.connector.check_project_auth s.project, s.deploy_env, @request.env['REMOTE_USER']
|
||||||
key = check_string(body["key"], "Parameter 'key' must be a not empty string")
|
d = p.deploy_env s.deploy_env
|
||||||
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")
|
provider = ::Provider::ProviderFactory.get(s.provider)
|
||||||
public_ip = check_string(body["public_ip"], "Parameter 'public_ip' should be a not empty string", true)
|
|
||||||
p = settings.mongo.check_project_auth project, deploy_env, request.env['REMOTE_USER']
|
check_chef_node_name(name, provider) unless name.nil?
|
||||||
|
s.options = {
|
||||||
|
:run_list => rl || d.run_list,
|
||||||
|
}
|
||||||
|
unless t.nil?
|
||||||
|
templates = get_templates
|
||||||
|
halt_response("Invalid bootstrap template '#{t}', available values: #{templates.join(", ")}", 400) unless templates.include?(t)
|
||||||
|
s.options[:bootstrap_template] = t
|
||||||
|
end
|
||||||
|
s.chef_node_name = name || provider.create_default_chef_node_name(s)
|
||||||
|
s
|
||||||
|
end
|
||||||
|
|
||||||
|
def add_server body
|
||||||
|
project = body["project"]
|
||||||
|
deploy_env = body["deploy_env"]
|
||||||
|
p = Devops::Db.connector.check_project_auth project, deploy_env, @request.env['REMOTE_USER']
|
||||||
|
|
||||||
d = p.deploy_env(deploy_env)
|
d = p.deploy_env(deploy_env)
|
||||||
|
|
||||||
cert = settings.mongo.key(key)
|
cert = Devops::Db.connector.key(body["key"])
|
||||||
provider = ::Provider::ProviderFactory.get("static")
|
provider = ::Provider::ProviderFactory.get("static")
|
||||||
s = Devops::Model::Server.new
|
s = Devops::Model::Server.new
|
||||||
s.provider = provider.name
|
s.provider = provider.name
|
||||||
s.project = project
|
s.project = project
|
||||||
s.deploy_env = deploy_env
|
s.deploy_env = deploy_env
|
||||||
s.remote_user = remote_user
|
s.remote_user = body["remote_user"]
|
||||||
s.private_ip = private_ip
|
s.private_ip = body["private_ip"]
|
||||||
s.public_ip = public_ip
|
s.public_ip = body["public_ip"]
|
||||||
s.static = true
|
s.static = true
|
||||||
s.id = "static_#{cert.id}-#{Time.now.to_i}"
|
s.id = "static_#{cert.id}-#{Time.now.to_i}"
|
||||||
s.key = cert.id
|
s.key = cert.id
|
||||||
settings.mongo.server_insert s
|
Devops::Db.connector.server_insert s
|
||||||
create_response("Server '#{s.id}' has been added")
|
"Server '#{s.id}' has been added"
|
||||||
}
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.get_server_by_key id, key
|
def get_server_by_key id, key
|
||||||
mongo = Devops::Db.connector
|
mongo = Devops::Db.connector
|
||||||
key == "instance" ? mongo.server_by_instance_id(id) : mongo.server_by_chef_node_name(id)
|
key == "instance" ? mongo.server_by_instance_id(id) : mongo.server_by_chef_node_name(id)
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.check_chef_node_name name, provider
|
def check_chef_node_name name, provider
|
||||||
mongo = Devops::Db.connector
|
mongo = Devops::Db.connector
|
||||||
mongo.server_by_chef_node_name name
|
mongo.server_by_chef_node_name name
|
||||||
halt(400, "Server with name '#{name}' already exist")
|
halt(400, "Server with name '#{name}' already exist")
|
||||||
|
|||||||
@ -1,12 +1,9 @@
|
|||||||
module Devops
|
module Devops
|
||||||
module Version2_0
|
module API2_0
|
||||||
module Routes
|
module Routes
|
||||||
module ImageRoutes
|
module ImageRoutes
|
||||||
|
|
||||||
def self.registered(app)
|
def self.registered(app)
|
||||||
app.after %r{\A/image(/[\w]+)?\z} do
|
|
||||||
statistic
|
|
||||||
end
|
|
||||||
|
|
||||||
# Get devops images list
|
# Get devops images list
|
||||||
#
|
#
|
||||||
@ -27,7 +24,12 @@ module Devops
|
|||||||
# "id": "36dc7618-4178-4e29-be43-286fbfe90f50"
|
# "id": "36dc7618-4178-4e29-be43-286fbfe90f50"
|
||||||
# }
|
# }
|
||||||
# ]
|
# ]
|
||||||
app.get_with_headers "/images", :headers => [:accept], &Devops::Version2_0::Handler::Image.get_images
|
app.get_with_headers "/images", :headers => [:accept] do
|
||||||
|
check_privileges("image", "r")
|
||||||
|
provider = params[:provider]
|
||||||
|
check_provider(provider) if provider
|
||||||
|
json Devops::API2_0::Handler::Image.new(request, params).images(provider).map(&:to_hash)
|
||||||
|
end
|
||||||
|
|
||||||
# Get raw images for :provider
|
# Get raw images for :provider
|
||||||
#
|
#
|
||||||
@ -53,7 +55,11 @@ module Devops
|
|||||||
# "status": "ACTIVE"
|
# "status": "ACTIVE"
|
||||||
# }
|
# }
|
||||||
# ]
|
# ]
|
||||||
app.get_with_headers "/images/provider/:provider", :headers => [:accept], &Devops::Version2_0::Handler::Image.get_provider_images
|
app.get_with_headers "/images/provider/:provider", :headers => [:accept] do |provider|
|
||||||
|
check_privileges("image", "r")
|
||||||
|
check_provider(provider)
|
||||||
|
json Devops::API2_0::Handler::Image.new(request, params).provider_images(provider)
|
||||||
|
end
|
||||||
|
|
||||||
# Create devops image
|
# Create devops image
|
||||||
#
|
#
|
||||||
@ -73,7 +79,12 @@ module Devops
|
|||||||
#
|
#
|
||||||
# * *Returns* :
|
# * *Returns* :
|
||||||
# 201 - Created
|
# 201 - Created
|
||||||
app.post_with_headers "/image", :headers => [:accept, :content_type], &Devops::Version2_0::Handler::Image.create_image
|
app.post_with_headers "/image", :headers => [:accept, :content_type] do
|
||||||
|
check_privileges("image", "w")
|
||||||
|
image = create_object_from_json_body
|
||||||
|
Devops::API2_0::Handler::Image.new(request, params).create_image(image)
|
||||||
|
create_response "Created", nil, 201
|
||||||
|
end
|
||||||
|
|
||||||
hash = {}
|
hash = {}
|
||||||
# Get devops image by id
|
# Get devops image by id
|
||||||
@ -91,7 +102,10 @@ module Devops
|
|||||||
# "bootstrap_template": null,
|
# "bootstrap_template": null,
|
||||||
# "id": "36dc7618-4178-4e29-be43-286fbfe90f50"
|
# "id": "36dc7618-4178-4e29-be43-286fbfe90f50"
|
||||||
# }
|
# }
|
||||||
hash["GET"] = Devops::Version2_0::Handler::Image.get_image
|
hash["GET"] = lambda { |image_id|
|
||||||
|
check_privileges("image", "r")
|
||||||
|
json Devops::API2_0::Handler::Image.new(request, params).image(image_id)
|
||||||
|
}
|
||||||
|
|
||||||
# Update devops image
|
# Update devops image
|
||||||
#
|
#
|
||||||
@ -111,7 +125,12 @@ module Devops
|
|||||||
#
|
#
|
||||||
# * *Returns* :
|
# * *Returns* :
|
||||||
# 200 - Updated
|
# 200 - Updated
|
||||||
hash["PUT"] = Devops::Version2_0::Handler::Image.update_image
|
hash["PUT"] = lambda {|image_id|
|
||||||
|
check_privileges("image", "w")
|
||||||
|
image = create_object_from_json_body
|
||||||
|
Devops::API2_0::Handler::Image.new(request, params).update_image(image_id, image)
|
||||||
|
create_response("Image '#{image_id}' has been updated")
|
||||||
|
}
|
||||||
|
|
||||||
# Delete devops image
|
# Delete devops image
|
||||||
#
|
#
|
||||||
@ -122,7 +141,11 @@ module Devops
|
|||||||
#
|
#
|
||||||
# * *Returns* :
|
# * *Returns* :
|
||||||
# 200 - Deleted
|
# 200 - Deleted
|
||||||
hash["DELETE"] = Devops::Version2_0::Handler::Image.delete_image
|
hash["DELETE"] = lambda {|image_id|
|
||||||
|
check_privileges("image", "w")
|
||||||
|
Devops::API2_0::Handler::Image.delete_image
|
||||||
|
create_response("Image '#{image_id}' has been removed")
|
||||||
|
}
|
||||||
|
|
||||||
app.multi_routes "/image/:image_id", {}, hash
|
app.multi_routes "/image/:image_id", {}, hash
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
# encoding: UTF-8
|
# encoding: UTF-8
|
||||||
module Devops
|
module Devops
|
||||||
module Version2_0
|
module API2_0
|
||||||
module Routes
|
module Routes
|
||||||
module NetworkRoutes
|
module NetworkRoutes
|
||||||
|
|
||||||
@ -32,7 +32,11 @@ module Devops
|
|||||||
# "id": "b14f8df9-ac27-48e2-8d65-f7ef78dc2654"
|
# "id": "b14f8df9-ac27-48e2-8d65-f7ef78dc2654"
|
||||||
# }
|
# }
|
||||||
# ]
|
# ]
|
||||||
app.get_with_headers "/networks/:provider", :headers => [:accept], &Devops::Version2_0::Handler::Network.get_networks
|
app.get_with_headers "/networks/:provider", :headers => [:accept] do |provider|
|
||||||
|
check_privileges("network", "r")
|
||||||
|
check_provider(provider)
|
||||||
|
json Devops::API2_0::Handler::Network.new(request, params).networks
|
||||||
|
end
|
||||||
|
|
||||||
puts "Network routes initialized"
|
puts "Network routes initialized"
|
||||||
end
|
end
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
module Devops
|
module Devops
|
||||||
module Version2_0
|
module API2_0
|
||||||
module Routes
|
module Routes
|
||||||
module ProjectRoutes
|
module ProjectRoutes
|
||||||
|
|
||||||
@ -18,7 +18,10 @@ module Devops
|
|||||||
# [
|
# [
|
||||||
# {"name" : "project_1"}
|
# {"name" : "project_1"}
|
||||||
# ]
|
# ]
|
||||||
app.get_with_headers "/projects", :headers => [:accept], &Devops::Version2_0::Handler::Project.get_projects
|
app.get_with_headers "/projects", :headers => [:accept] do
|
||||||
|
check_privileges("project", "r")
|
||||||
|
json Devops::API2_0::Handler::Project.new(request, params).projects.map(&:to_hash)
|
||||||
|
end
|
||||||
|
|
||||||
# Get project by id
|
# Get project by id
|
||||||
#
|
#
|
||||||
@ -53,7 +56,10 @@ module Devops
|
|||||||
# "name": "project_1"
|
# "name": "project_1"
|
||||||
# }
|
# }
|
||||||
hash = {}
|
hash = {}
|
||||||
hash["GET"] = Devops::Version2_0::Handler::Project.get_project
|
hash["GET"] = lambda {|project|
|
||||||
|
check_privileges("project", "r")
|
||||||
|
json Devops::API2_0::Handler::Project.new(request, params).project(project)
|
||||||
|
}
|
||||||
|
|
||||||
# Update project and create chef roles
|
# Update project and create chef roles
|
||||||
#
|
#
|
||||||
@ -90,7 +96,13 @@ module Devops
|
|||||||
#
|
#
|
||||||
# * *Returns* :
|
# * *Returns* :
|
||||||
# 200 - Updated
|
# 200 - Updated
|
||||||
hash["PUT"] = Devops::Version2_0::Handler::Project.update_project
|
hash["PUT"] = lambda { |project|
|
||||||
|
check_privileges("project", "w")
|
||||||
|
body = create_object_from_json_body
|
||||||
|
r = Devops::API2_0::Handler::Project.new(request, params).update_project project, body
|
||||||
|
info = "Project '#{project.id}' has been updated." + r
|
||||||
|
create_response(info)
|
||||||
|
}
|
||||||
|
|
||||||
# Delete project
|
# Delete project
|
||||||
#
|
#
|
||||||
@ -106,7 +118,15 @@ module Devops
|
|||||||
#
|
#
|
||||||
# * *Returns* :
|
# * *Returns* :
|
||||||
# 200 - Deleted
|
# 200 - Deleted
|
||||||
hash["DELETE"] = Devops::Version2_0::Handler::Project.delete_project
|
hash["DELETE"] = lambda {|project|
|
||||||
|
check_privileges("project", "w")
|
||||||
|
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 = Devops::API2_0::Handler::Project.new(request, params).delete_project(project, deploy_env)
|
||||||
|
create_response(info)
|
||||||
|
}
|
||||||
app.multi_routes "/project/:project", {}, hash
|
app.multi_routes "/project/:project", {}, hash
|
||||||
|
|
||||||
# Get project servers
|
# Get project servers
|
||||||
@ -135,7 +155,10 @@ module Devops
|
|||||||
# "id": "nstance id"
|
# "id": "nstance id"
|
||||||
# }
|
# }
|
||||||
# ]
|
# ]
|
||||||
app.get_with_headers "/project/:project/servers", :headers => [:accept], &Devops::Version2_0::Handler::Project.get_project_servers
|
app.get_with_headers "/project/:project/servers", :headers => [:accept] do |project|
|
||||||
|
check_privileges("project", "r")
|
||||||
|
json Devops::API2_0::Handler::Project.new(request, params).project_servers(project).map(&:to_hash)
|
||||||
|
end
|
||||||
|
|
||||||
# Create project and chef roles
|
# Create project and chef roles
|
||||||
#
|
#
|
||||||
@ -172,7 +195,15 @@ module Devops
|
|||||||
#
|
#
|
||||||
# * *Returns* :
|
# * *Returns* :
|
||||||
# 201 - Created
|
# 201 - Created
|
||||||
app.post_with_headers "/project", :headers => [:accept, :content_type], &Devops::Version2_0::Handler::Project.create_project
|
app.post_with_headers "/project", :headers => [:accept, :content_type] do
|
||||||
|
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)
|
||||||
|
res = Devops::API2_0::Handler::Project.new(request, params).create_project body
|
||||||
|
res = "Created. " + res
|
||||||
|
create_response(res, nil, 201)
|
||||||
|
end
|
||||||
|
|
||||||
users_hash = {}
|
users_hash = {}
|
||||||
# Add users to project environment
|
# Add users to project environment
|
||||||
@ -192,7 +223,14 @@ module Devops
|
|||||||
#
|
#
|
||||||
# * *Returns* :
|
# * *Returns* :
|
||||||
# 200 - Updated
|
# 200 - Updated
|
||||||
users_hash["PUT"] = Devops::Version2_0::Handler::Project.update_project_users
|
users_hash["PUT"] = lambda { |project|
|
||||||
|
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)
|
||||||
|
info = Devops::API2_0::Handler::Project.new(request, params).update_project_users(project, deploy_env, users)
|
||||||
|
create_response(info)
|
||||||
|
}
|
||||||
|
|
||||||
# Delete users from project environment
|
# Delete users from project environment
|
||||||
#
|
#
|
||||||
@ -211,7 +249,14 @@ module Devops
|
|||||||
#
|
#
|
||||||
# * *Returns* :
|
# * *Returns* :
|
||||||
# 200 - Updated
|
# 200 - Updated
|
||||||
users_hash["DELETE"] = Devops::Version2_0::Handler::Project.delete_project_users
|
users_hash["DELETE"] = lambda {|project|
|
||||||
|
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)
|
||||||
|
info = Devops::API2_0::Handler::Project.new(request, params).delete_project_users(project, deploy_env, users)
|
||||||
|
create_response(info)
|
||||||
|
}
|
||||||
app.multi_routes "/project/:id/user", {}, users_hash
|
app.multi_routes "/project/:id/user", {}, users_hash
|
||||||
|
|
||||||
# Set run_list to project environment
|
# Set run_list to project environment
|
||||||
@ -229,7 +274,13 @@ module Devops
|
|||||||
#
|
#
|
||||||
# * *Returns* :
|
# * *Returns* :
|
||||||
# 200 - Updated
|
# 200 - Updated
|
||||||
app.put_with_headers "/project/:id/:env/run_list", :headers => [:accept, :content_type], &Devops::Version2_0::Handler::Project.set_project_env_run_list
|
app.put_with_headers "/project/:id/:env/run_list", :headers => [:accept, :content_type] do |project, deploy_env|
|
||||||
|
check_privileges("project", "w")
|
||||||
|
list = create_object_from_json_body(Array)
|
||||||
|
check_array(list, "Body must contains not empty array of strings")
|
||||||
|
info = Devops::API2_0::Handler::Project.new(request, params).set_project_env_run_list(project, deploy_env, list)
|
||||||
|
create_response(info)
|
||||||
|
end
|
||||||
|
|
||||||
# Run chef-client on reserved project servers
|
# Run chef-client on reserved project servers
|
||||||
#
|
#
|
||||||
@ -246,7 +297,25 @@ module Devops
|
|||||||
# }
|
# }
|
||||||
#
|
#
|
||||||
# * *Returns* : text stream
|
# * *Returns* : text stream
|
||||||
app.post_with_headers "/project/:id/deploy", :headers => [:content_type], &Devops::Version2_0::Handler::Project.deploy_project
|
app.post_with_headers "/project/:id/deploy", :headers => [:content_type] do |project|
|
||||||
|
check_privileges("project", "x")
|
||||||
|
obj = create_object_from_json_body
|
||||||
|
deploy_env = check_string(obj["deploy_env"], "Parameter 'deploy_env' should be a not empty string", true)
|
||||||
|
servers = check_array(obj["servers"], "Parameter 'servers' should be a not empty array of strings", String, true)
|
||||||
|
handler = Devops::API2_0::Handler::Project.new(request, params)
|
||||||
|
if obj.key?("trace")
|
||||||
|
stream() do |out|
|
||||||
|
begin
|
||||||
|
status = handler.deploy_project_stream out, project, deploy_env, servers
|
||||||
|
out << create_status(status)
|
||||||
|
rescue IOError => e
|
||||||
|
logger.error e.message
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
json handler.deploy_project project, deploy_env, servers
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
# Set project to archivated state
|
# Set project to archivated state
|
||||||
#
|
#
|
||||||
@ -254,7 +323,11 @@ module Devops
|
|||||||
# - method : POST
|
# - method : POST
|
||||||
# - headers :
|
# - headers :
|
||||||
# - Content-Type: application/json
|
# - Content-Type: application/json
|
||||||
app.post_with_headers "/project/:project/archive", :headers => [:content_type], &Devops::Version2_0::Handler::Project.archive_project
|
app.post_with_headers "/project/:project/archive", :headers => [:content_type] do |project|
|
||||||
|
check_privileges("project", "w")
|
||||||
|
info = Devops::API2_0::Handler::Project.new(request, params).archive_project(project)
|
||||||
|
create_response(info)
|
||||||
|
end
|
||||||
|
|
||||||
# Set project to normal state
|
# Set project to normal state
|
||||||
#
|
#
|
||||||
@ -262,7 +335,11 @@ module Devops
|
|||||||
# - method : POST
|
# - method : POST
|
||||||
# - headers :
|
# - headers :
|
||||||
# - Content-Type: application/json
|
# - Content-Type: application/json
|
||||||
app.post_with_headers "/project/:project/unarchive", :headers => [:content_type], &Devops::Version2_0::Handler::Project.unarchive_project
|
app.post_with_headers "/project/:project/unarchive", :headers => [:content_type] do |project|
|
||||||
|
check_privileges("project", "w")
|
||||||
|
info = Devops::API2_0::Handler::Project.new(request, params).unarchive_project(project)
|
||||||
|
create_response(info)
|
||||||
|
end
|
||||||
|
|
||||||
# Test project environment
|
# Test project environment
|
||||||
#
|
#
|
||||||
@ -330,7 +407,10 @@ module Devops
|
|||||||
# },
|
# },
|
||||||
# "message": "Test project 'project_1' and environment 'prod'"
|
# "message": "Test project 'project_1' and environment 'prod'"
|
||||||
# }
|
# }
|
||||||
app.post_with_headers "/project/test/:id/:env", :headers => [:accept, :content_type], &Devops::Version2_0::Handler::Project.test_project
|
app.post_with_headers "/project/test/:id/:env", :headers => [:accept, :content_type] do |project, deploy_env|
|
||||||
|
check_privileges("project", "r")
|
||||||
|
json Devops::API2_0::Handler::Project.new(request, params).test_project(project, deploy_env)
|
||||||
|
end
|
||||||
|
|
||||||
puts "Project routes initialized"
|
puts "Project routes initialized"
|
||||||
end
|
end
|
||||||
|
|||||||
@ -1,6 +1,5 @@
|
|||||||
# encoding: UTF-8
|
# encoding: UTF-8
|
||||||
|
|
||||||
require "json"
|
|
||||||
require "providers/provider_factory"
|
require "providers/provider_factory"
|
||||||
|
|
||||||
module Devops
|
module Devops
|
||||||
@ -24,7 +23,7 @@ module Devops
|
|||||||
# ]
|
# ]
|
||||||
app.get_with_headers "/providers", :headers => [:accept] do#, &Devops::Version2_0::Handler::Provider.get_providers
|
app.get_with_headers "/providers", :headers => [:accept] do#, &Devops::Version2_0::Handler::Provider.get_providers
|
||||||
check_privileges("provider", "r")
|
check_privileges("provider", "r")
|
||||||
json Devops::API2_0::Handler::Provider.new.providers
|
json Devops::API2_0::Handler::Provider.new(request, params).providers
|
||||||
end
|
end
|
||||||
|
|
||||||
puts "Provider routes initialized"
|
puts "Provider routes initialized"
|
||||||
|
|||||||
@ -32,7 +32,7 @@ module Devops
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
reserved = (params.key?("reserved") ? true : nil)
|
reserved = (params.key?("reserved") ? true : nil)
|
||||||
json Devops::Version2_0::Handler::Server.new.servers(fields, reserved)
|
json Devops::API2_0::Handler::Server.new(request, params).servers(fields, reserved)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Get chef nodes list
|
# Get chef nodes list
|
||||||
@ -50,7 +50,7 @@ module Devops
|
|||||||
# ]
|
# ]
|
||||||
app.get_with_headers "/servers/chef", :headers => [:accept] do
|
app.get_with_headers "/servers/chef", :headers => [:accept] do
|
||||||
check_privileges("server", "r")
|
check_privileges("server", "r")
|
||||||
json Devops::Version2_0::Handler::Server.new.chef_servers
|
json Devops::API2_0::Handler::Server.new(request, params).chef_servers
|
||||||
end
|
end
|
||||||
|
|
||||||
# Get provider servers list
|
# Get provider servers list
|
||||||
@ -91,7 +91,7 @@ module Devops
|
|||||||
# ]
|
# ]
|
||||||
app.get_with_headers "/servers/:provider", :headers => [:accept] do
|
app.get_with_headers "/servers/:provider", :headers => [:accept] do
|
||||||
check_privileges("server", "r")
|
check_privileges("server", "r")
|
||||||
json Devops::Version2_0::Handler::Server.provider_servers(params[:provider])
|
json Devops::API2_0::Handler::Server.new(request, params).provider_servers(params[:provider])
|
||||||
end
|
end
|
||||||
|
|
||||||
# Get server info by :name
|
# Get server info by :name
|
||||||
@ -110,7 +110,10 @@ module Devops
|
|||||||
# }
|
# }
|
||||||
# ]
|
# ]
|
||||||
hash = {}
|
hash = {}
|
||||||
hash["GET"] = Devops::Version2_0::Handler::Server.get_server
|
hash["GET"] = lambda {|id|
|
||||||
|
check_privileges("server", "r")
|
||||||
|
json Devops::API2_0::Handler::Server.new(request, params).server(id).to_hash
|
||||||
|
}
|
||||||
|
|
||||||
# Delete devops server
|
# Delete devops server
|
||||||
#
|
#
|
||||||
@ -126,7 +129,13 @@ module Devops
|
|||||||
#
|
#
|
||||||
# * *Returns* :
|
# * *Returns* :
|
||||||
# 200 - Deleted
|
# 200 - Deleted
|
||||||
hash["DELETE"] = Devops::Version2_0::Handler::Server.delete_server
|
hash["DELETE"] = lambda {|id|
|
||||||
|
check_privileges("server", "w")
|
||||||
|
body = create_object_from_json_body(Hash, true)
|
||||||
|
key = (body.nil? ? nil : body["key"])
|
||||||
|
info, r = Devops::API2_0::Handler::Server.new(request, params).delete(id, key)
|
||||||
|
create_response(info, r)
|
||||||
|
}
|
||||||
app.multi_routes "/server/:id", {:headers => [:accept, :content_type]}, hash
|
app.multi_routes "/server/:id", {:headers => [:accept, :content_type]}, hash
|
||||||
|
|
||||||
# Create devops server
|
# Create devops server
|
||||||
@ -149,7 +158,32 @@ module Devops
|
|||||||
# }
|
# }
|
||||||
#
|
#
|
||||||
# * *Returns* : text stream
|
# * *Returns* : text stream
|
||||||
app.post_with_headers "/server", :headers => [:content_type], &Devops::Version2_0::Handler::Server.create_server
|
app.post_with_headers "/server", :headers => [:content_type] do
|
||||||
|
check_privileges("server", "w")
|
||||||
|
body = create_object_from_json_body
|
||||||
|
project_name = check_string(body["project"], "Parameter 'project' must be a not empty string")
|
||||||
|
env_name = check_string(body["deploy_env"], "Parameter 'deploy_env' must be a not empty string")
|
||||||
|
server_name = check_string(body["name"], "Parameter 'name' should be null or not empty string", true)
|
||||||
|
without_bootstrap = body["without_bootstrap"]
|
||||||
|
force = body["force"]
|
||||||
|
halt_response("Parameter 'without_bootstrap' should be a null or true") unless without_bootstrap.nil? or without_bootstrap == true
|
||||||
|
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)
|
||||||
|
handler = Devops::API2_0::Handler::Server.new(request, params)
|
||||||
|
if body.key?("trace")
|
||||||
|
stream() do |out|
|
||||||
|
begin
|
||||||
|
status = handler.create_server_stream out, body
|
||||||
|
out << create_status(status)
|
||||||
|
rescue IOError => e
|
||||||
|
logger.error e.message
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
json handler.create_server body
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
# Pause devops server by name
|
# Pause devops server by name
|
||||||
#
|
#
|
||||||
@ -165,7 +199,13 @@ module Devops
|
|||||||
#
|
#
|
||||||
# * *Returns* :
|
# * *Returns* :
|
||||||
# 200 - Paused
|
# 200 - Paused
|
||||||
app.post_with_headers "/server/:node_name/pause", :headers => [:accept, :content_type], &Devops::Version2_0::Handler::Server.pause_server
|
app.post_with_headers "/server/:node_name/pause", :headers => [:accept, :content_type] do |node_name|
|
||||||
|
check_privileges("server", "w")
|
||||||
|
body = create_object_from_json_body(Hash, true)
|
||||||
|
key = (body.nil? ? nil : body["key"])
|
||||||
|
info = Devops::API2_0::Handler::Server.new(request, params).pause_server(node_name, key)
|
||||||
|
create_response(info)
|
||||||
|
end
|
||||||
|
|
||||||
# Unpause devops server by name
|
# Unpause devops server by name
|
||||||
#
|
#
|
||||||
@ -181,7 +221,13 @@ module Devops
|
|||||||
#
|
#
|
||||||
# * *Returns* :
|
# * *Returns* :
|
||||||
# 200 - Unpaused
|
# 200 - Unpaused
|
||||||
app.post_with_headers "/server/:node_name/unpause", :headers => [:accept, :content_type], &Devops::Version2_0::Handler::Server.unpause_server
|
app.post_with_headers "/server/:node_name/unpause", :headers => [:accept, :content_type] do |node_name|
|
||||||
|
check_privileges("server", "w")
|
||||||
|
body = create_object_from_json_body(Hash, true)
|
||||||
|
key = (body.nil? ? nil : body["key"])
|
||||||
|
info = Devops::API2_0::Handler::Server.new(request, params).unpause_server(node_name, key)
|
||||||
|
create_response(info)
|
||||||
|
end
|
||||||
|
|
||||||
# Reserve devops server
|
# Reserve devops server
|
||||||
#
|
#
|
||||||
@ -197,7 +243,13 @@ module Devops
|
|||||||
#
|
#
|
||||||
# * *Returns* :
|
# * *Returns* :
|
||||||
# 200 - Reserved
|
# 200 - Reserved
|
||||||
app.post_with_headers "/server/:node_name/reserve", :headers => [:accept, :content_type], &Devops::Version2_0::Handler::Server.reserve_server
|
app.post_with_headers "/server/:node_name/reserve", :headers => [:accept, :content_type] do |node_name|
|
||||||
|
check_privileges("server", "w")
|
||||||
|
body = create_object_from_json_body(Hash, true)
|
||||||
|
key = (body.nil? ? nil : body["key"])
|
||||||
|
Devops::API2_0::Handler::Server.new(request, params).reserve_server(node_name, key)
|
||||||
|
create_response("Server '#{node_name}' has been reserved")
|
||||||
|
end
|
||||||
|
|
||||||
# Unreserve devops server
|
# Unreserve devops server
|
||||||
#
|
#
|
||||||
@ -213,7 +265,13 @@ module Devops
|
|||||||
#
|
#
|
||||||
# * *Returns* :
|
# * *Returns* :
|
||||||
# 200 - Unreserved
|
# 200 - Unreserved
|
||||||
app.post_with_headers "/server/:node_name/unreserve", :headers => [:accept, :content_type], &Devops::Version2_0::Handler::Server.unreserve_server
|
app.post_with_headers "/server/:node_name/unreserve", :headers => [:accept, :content_type] do |node_name|
|
||||||
|
check_privileges("server", "w")
|
||||||
|
body = create_object_from_json_body(Hash, true)
|
||||||
|
key = (body.nil? ? nil : body["key"])
|
||||||
|
Devops::API2_0::Handler::Server.new(request, params).unreserve_server(node_name, key)
|
||||||
|
create_response("Server '#{node_name}' has been unreserved")
|
||||||
|
end
|
||||||
|
|
||||||
# Bootstrap devops server
|
# Bootstrap devops server
|
||||||
#
|
#
|
||||||
@ -231,7 +289,32 @@ module Devops
|
|||||||
# }
|
# }
|
||||||
#
|
#
|
||||||
# * *Returns* : text stream
|
# * *Returns* : text stream
|
||||||
app.post_with_headers "/server/bootstrap", :headers => [:accept, :content_type], &Devops::Version2_0::Handler::Server.bootstrap_server
|
app.post_with_headers "/server/bootstrap", :headers => [:accept, :content_type] do
|
||||||
|
check_privileges("server", "w")
|
||||||
|
body = create_object_from_json_body(Hash, true)
|
||||||
|
id = check_string(body["instance_id"], "Parameter 'instance_id' must be a not empty string")
|
||||||
|
name = check_string(body["name"], "Parameter 'name' should be a not empty string", true)
|
||||||
|
rl = check_array(body["run_list"], "Parameter 'run_list' should be a not empty array of string", String, true)
|
||||||
|
unless rl.nil?
|
||||||
|
validator = Validators::Helpers::RunList.new(rl)
|
||||||
|
halt_response(validator.message) unless validator.valid?
|
||||||
|
end
|
||||||
|
t = check_string(body["bootstrap_template"], "Parameter 'bootstrap_template' should be a not empty string", true)
|
||||||
|
|
||||||
|
handler = Devops::API2_0::Handler::Server.new(request, params)
|
||||||
|
if body.key?("trace")
|
||||||
|
stream() do |out|
|
||||||
|
begin
|
||||||
|
status = handler.bootstrap_server_stream out, body
|
||||||
|
out << create_status(status)
|
||||||
|
rescue IOError => e
|
||||||
|
logger.error e.message
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
handler.bootstrap_server(body)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
# Add external server to devops
|
# Add external server to devops
|
||||||
#
|
#
|
||||||
@ -252,7 +335,19 @@ module Devops
|
|||||||
#
|
#
|
||||||
# * *Returns* :
|
# * *Returns* :
|
||||||
# 200 - Added
|
# 200 - Added
|
||||||
app.post_with_headers "/server/add", :headers => [:accept, :content_type], &Devops::Version2_0::Handler::Server.add_server
|
app.post_with_headers "/server/add", :headers => [:accept, :content_type] do
|
||||||
|
check_privileges("server", "w")
|
||||||
|
body = create_object_from_json_body
|
||||||
|
project = check_string(body["project"], "Parameter 'project' must be a not empty string")
|
||||||
|
deploy_env = check_string(body["deploy_env"], "Parameter 'deploy_env' must be a not empty string")
|
||||||
|
key = check_string(body["key"], "Parameter 'key' must be a not empty string")
|
||||||
|
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)
|
||||||
|
|
||||||
|
info = Devops::API2_0::Handler::Server.new(request, params).add_server(body)
|
||||||
|
create_response(info)
|
||||||
|
end
|
||||||
|
|
||||||
puts "Server routes initialized"
|
puts "Server routes initialized"
|
||||||
end
|
end
|
||||||
|
|||||||
@ -8,6 +8,7 @@ require "auth/devops_auth"
|
|||||||
require "exceptions/invalid_record"
|
require "exceptions/invalid_record"
|
||||||
require "exceptions/record_not_found"
|
require "exceptions/record_not_found"
|
||||||
require "exceptions/dependency_error"
|
require "exceptions/dependency_error"
|
||||||
|
require "exceptions/conflict_exception"
|
||||||
require 'core/devops-logger'
|
require 'core/devops-logger'
|
||||||
|
|
||||||
require_relative "../helpers/version_2"
|
require_relative "../helpers/version_2"
|
||||||
@ -72,6 +73,12 @@ module Devops
|
|||||||
halt_response(e.message, 400)
|
halt_response(e.message, 400)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
error ConflictException do
|
||||||
|
e = env["sinatra.error"]
|
||||||
|
logger.warn e.message
|
||||||
|
halt_response(e.message, 409)
|
||||||
|
end
|
||||||
|
|
||||||
error InvalidPrivileges do
|
error InvalidPrivileges do
|
||||||
e = env["sinatra.error"]
|
e = env["sinatra.error"]
|
||||||
logger.warn e.message
|
logger.warn e.message
|
||||||
|
|||||||
@ -8,7 +8,7 @@ module Devops
|
|||||||
require_relative "api2/handlers/filter"
|
require_relative "api2/handlers/filter"
|
||||||
require_relative "api2/handlers/group"
|
require_relative "api2/handlers/group"
|
||||||
require_relative "api2/handlers/user"
|
require_relative "api2/handlers/user"
|
||||||
<<<<<<< HEAD
|
require_relative "api2/handlers/network"
|
||||||
require_relative "api2/handlers/report"
|
require_relative "api2/handlers/report"
|
||||||
require_relative "api2/handlers/deploy"
|
require_relative "api2/handlers/deploy"
|
||||||
require_relative "api2/handlers/script"
|
require_relative "api2/handlers/script"
|
||||||
@ -16,16 +16,12 @@ module Devops
|
|||||||
require_relative "api2/handlers/key"
|
require_relative "api2/handlers/key"
|
||||||
require_relative "api2/handlers/tag"
|
require_relative "api2/handlers/tag"
|
||||||
require_relative "api2/handlers/server"
|
require_relative "api2/handlers/server"
|
||||||
|
require_relative "api2/handlers/image"
|
||||||
|
require_relative "api2/handlers/project"
|
||||||
|
|
||||||
require_relative "api2/handlers/stack"
|
require_relative "api2/handlers/stack"
|
||||||
require_relative "api2/handlers/stack_template"
|
require_relative "api2/handlers/stack_template"
|
||||||
require_relative "api2/handlers/stack_template_preset"
|
require_relative "api2/handlers/stack_template_preset"
|
||||||
=begin
|
|
||||||
require "routes/v2.0/handlers/image"
|
|
||||||
require "routes/v2.0/handlers/network"
|
|
||||||
require "routes/v2.0/handlers/project"
|
|
||||||
require "routes/v2.0/handlers/status"
|
|
||||||
=end
|
|
||||||
|
|
||||||
require 'lib/stubber'
|
require 'lib/stubber'
|
||||||
end
|
end
|
||||||
|
|||||||
4
devops-service/exceptions/conflict_exception.rb
Normal file
4
devops-service/exceptions/conflict_exception.rb
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
class ConflictException < Exception#StandardError
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
Loading…
Reference in New Issue
Block a user