project, server

This commit is contained in:
amartynov 2015-07-27 15:40:10 +03:00
parent f25e95df45
commit cdbbef0ae7
13 changed files with 601 additions and 557 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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")

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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"

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -0,0 +1,4 @@
class ConflictException < Exception#StandardError
end