Merge branch 'devops_3_amartynov' of http://git.stu.neva.ru/cloudtechlab/devops-service into devops_3_amartynov
This commit is contained in:
commit
f25e95df45
@ -1,18 +1,12 @@
|
|||||||
require "commands/bootstrap_templates"
|
require "commands/bootstrap_templates"
|
||||||
|
|
||||||
module Devops
|
module Devops
|
||||||
module Version2_0
|
module API2_0
|
||||||
module Handler
|
module Handler
|
||||||
class BootstrapTemplates
|
class BootstrapTemplates
|
||||||
extend BootstrapTemplatesCommands
|
|
||||||
|
|
||||||
def self.get_bootstrap_templates
|
include BootstrapTemplatesCommands
|
||||||
lambda {
|
|
||||||
check_privileges("templates", "r")
|
|
||||||
# broadcast(:cancel_order_failed, "hello")
|
|
||||||
json BootstrapTemplates.get_templates
|
|
||||||
}
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@ -1,56 +1,41 @@
|
|||||||
|
require "db/mongo/models/key"
|
||||||
|
require "fileutils"
|
||||||
|
|
||||||
module Devops
|
module Devops
|
||||||
module Version2_0
|
module API2_0
|
||||||
module Handler
|
module Handler
|
||||||
class Key
|
class Key
|
||||||
|
|
||||||
def self.get_keys
|
def keys
|
||||||
lambda {
|
keys = Devops::DB.connector.keys.map {|i| i.to_hash}
|
||||||
check_privileges("key", "r")
|
keys.each {|k| k.delete("path")} # We should not return path to the key
|
||||||
keys = settings.mongo.keys.map {|i| i.to_hash}
|
|
||||||
keys.each {|k| k.delete("path")} # We should not return path to the key
|
|
||||||
json keys
|
|
||||||
}
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.create_key
|
def create body, file_name
|
||||||
lambda {
|
File.open(file_name, "w") do |f|
|
||||||
check_privileges("key", "w")
|
f.write(body["content"])
|
||||||
key = create_object_from_json_body
|
f.chmod(0400)
|
||||||
fname = check_filename(key["file_name"], "Parameter 'file_name' must be a not empty string")
|
end
|
||||||
kname = check_string(key["key_name"], "Parameter 'key_name' should be a not empty string")
|
|
||||||
content = check_string(key["content"], "Parameter 'content' should be a not empty string")
|
|
||||||
file_name = File.join(settings.keys_dir, fname)
|
|
||||||
halt(400, "File '#{fname}' already exist") if File.exists?(file_name)
|
|
||||||
File.open(file_name, "w") do |f|
|
|
||||||
f.write(content)
|
|
||||||
f.chmod(0400)
|
|
||||||
end
|
|
||||||
|
|
||||||
key = Devops::Model::Key.new({"path" => file_name, "id" => kname})
|
key = Devops::Model::Key.new({"path" => file_name, "id" => body["key_name"]})
|
||||||
settings.mongo.key_insert key
|
Devops::DB.connector.key_insert key
|
||||||
create_response("Created", nil, 201)
|
|
||||||
}
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.delete_key
|
def delete key_id
|
||||||
lambda {
|
mongo = Devops::DB.connector
|
||||||
check_privileges("key", "w")
|
servers = mongo.servers_by_key key_id
|
||||||
servers = settings.mongo.servers_by_key params[:key]
|
|
||||||
unless servers.empty?
|
unless servers.empty?
|
||||||
s_str = servers.map{|s| s.id}.join(", ")
|
s_str = servers.map{|s| s.id}.join(", ")
|
||||||
raise DependencyError.new "Deleting is forbidden: Key is used in servers: #{s_str}"
|
raise DependencyError.new "Deleting is forbidden: Key is used in servers: #{s_str}"
|
||||||
end
|
end
|
||||||
|
|
||||||
k = settings.mongo.key params[:key]
|
k = mongo.key key_id
|
||||||
begin
|
begin
|
||||||
FileUtils.rm(k.path)
|
FileUtils.rm(k.path)
|
||||||
rescue
|
rescue
|
||||||
logger.error "Missing key file for #{params[:key]} - #{k.filename}"
|
logger.error "Missing key file for #{key_id} - #{k.filename}"
|
||||||
end
|
end
|
||||||
r = settings.mongo.key_delete params[:key]
|
mongo.key_delete key_id
|
||||||
return [500, r["err"].inspect] unless r["err"].nil?
|
|
||||||
create_response("Key '#{params[:key]}' removed")
|
|
||||||
}
|
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
@ -14,7 +14,7 @@ require "workers/create_server_worker"
|
|||||||
require "workers/bootstrap_worker"
|
require "workers/bootstrap_worker"
|
||||||
|
|
||||||
module Devops
|
module Devops
|
||||||
module Version2_0
|
module API2_0
|
||||||
module Handler
|
module Handler
|
||||||
class Server
|
class Server
|
||||||
|
|
||||||
@ -24,32 +24,16 @@ module Devops
|
|||||||
|
|
||||||
scheduler = Rufus::Scheduler.new
|
scheduler = Rufus::Scheduler.new
|
||||||
|
|
||||||
def self.get_servers
|
def servers fields, reserved
|
||||||
lambda {
|
Devops::DB.connector.servers(nil, nil, nil, reserved, fields).map {|s| s.to_hash}
|
||||||
check_privileges("server", "r")
|
|
||||||
fields = []
|
|
||||||
if params.key?("fields") and params["fields"].is_a?(Array)
|
|
||||||
Devops::Model::Server.fields.each do |k|
|
|
||||||
fields.push k if params["fields"].include?(k)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
reserved = (params.key?("reserved") ? true : nil)
|
|
||||||
json settings.mongo.servers(nil, nil, nil, reserved, fields).map {|s| s.to_hash}
|
|
||||||
}
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.get_chef_servers
|
def chef_servers
|
||||||
lambda {
|
KnifeCommands.chef_node_list
|
||||||
check_privileges("server", "r")
|
|
||||||
json KnifeCommands.chef_node_list
|
|
||||||
}
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.get_provider_servers
|
def provider_servers provider
|
||||||
lambda {
|
::Provider::ProviderFactory.get(provider).servers
|
||||||
check_privileges("server", "r")
|
|
||||||
json ::Provider::ProviderFactory.get(params[:provider]).servers
|
|
||||||
}
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.get_server
|
def self.get_server
|
||||||
|
|||||||
@ -1,48 +1,31 @@
|
|||||||
require "commands/knife_commands"
|
require "commands/knife_commands"
|
||||||
|
|
||||||
module Devops
|
module Devops
|
||||||
module Version2_0
|
module API2_0
|
||||||
module Handler
|
module Handler
|
||||||
class Tag
|
class Tag
|
||||||
|
|
||||||
def self.get_tags
|
def initialize node_name
|
||||||
lambda {
|
@node_name = node_name
|
||||||
check_privileges("server", "r")
|
@server = Devops::DB.connector.server_by_chef_node_name(@node_name)
|
||||||
server = settings.mongo.server_by_chef_node_name(params[:node_name])
|
#TODO: raise
|
||||||
halt_response("No servers found for name '#{params[:node_name]}'", 404) if server.nil?
|
halt_response("No servers found for name '#{@node_name}'", 404) if @server.nil?
|
||||||
chef_node_name = server.chef_node_name
|
|
||||||
json(KnifeCommands.tags_list(chef_node_name))
|
|
||||||
}
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.set_tags
|
def tags
|
||||||
lambda {
|
KnifeCommands.tags_list(@node_name)
|
||||||
check_privileges("server", "w")
|
end
|
||||||
tags = create_object_from_json_body(Array)
|
|
||||||
check_array(tags, "Request body should be a not empty array of strings")
|
def set_tags tags
|
||||||
server = settings.mongo.server_by_chef_node_name(params[:node_name])
|
tagsStr = tags.join(" ")
|
||||||
halt_response("No servers found for name '#{params[:node_name]}'", 404) if server.nil?
|
cmd = KnifeCommands.tags_create(@node_name, tagsStr)
|
||||||
chef_node_name = server.chef_node_name
|
halt_response("Error: Cannot add tags #{tagsStr} to server #{@node_name}", 500) unless cmd[1]
|
||||||
tagsStr = tags.join(" ")
|
|
||||||
cmd = KnifeCommands.tags_create(chef_node_name, tagsStr)
|
|
||||||
halt_response("Error: Cannot add tags #{tagsStr} to server #{chef_node_name}", 500) unless cmd[1]
|
|
||||||
create_response("Set tags for #{chef_node_name}: #{tagsStr}")
|
|
||||||
}
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.unset_tags
|
def self.unset_tags
|
||||||
lambda {
|
tagsStr = tags.join(" ")
|
||||||
check_privileges("server", "w")
|
cmd = KnifeCommands.tags_delete(@node_name, tagsStr)
|
||||||
tags = create_object_from_json_body(Array)
|
halt_response("Cannot delete tags #{tagsStr} from server #{@node_name}: #{cmd[0]}", 500) unless cmd[1]
|
||||||
check_array(tags, "Request body should be a not empty array of strings")
|
|
||||||
server = settings.mongo.server_by_chef_node_name(params[:node_name])
|
|
||||||
halt_response("No servers found for name '#{params[:node_name]}'", 404) if server.nil?
|
|
||||||
chef_node_name = server.chef_node_name
|
|
||||||
tagsStr = tags.join(" ")
|
|
||||||
cmd = KnifeCommands.tags_delete(chef_node_name, tagsStr)
|
|
||||||
halt_response("Cannot delete tags #{tagsStr} from server #{chef_node_name}: #{cmd[0]}", 500) unless cmd[1]
|
|
||||||
create_response("Deleted tags for #{chef_node_name}: #{tagsStr}")
|
|
||||||
}
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
module Devops
|
module Devops
|
||||||
module Version2_0
|
module API2_0
|
||||||
module Routes
|
module Routes
|
||||||
module BootstrapTemplatesRoutes
|
module BootstrapTemplatesRoutes
|
||||||
|
|
||||||
@ -18,7 +18,10 @@ module Devops
|
|||||||
# [
|
# [
|
||||||
# "omnibus"
|
# "omnibus"
|
||||||
# ]
|
# ]
|
||||||
app.get_with_headers "/templates", :headers => [:accept], &Devops::Version2_0::Handler::BootstrapTemplates.get_bootstrap_templates
|
app.get_with_headers "/templates", :headers => [:accept] do
|
||||||
|
check_privileges("templates", "r")
|
||||||
|
json Devops::API2_0::Handler::BootstrapTemplates.new.get_templates
|
||||||
|
end
|
||||||
|
|
||||||
puts "Bootstrap templates routes initialized"
|
puts "Bootstrap templates routes initialized"
|
||||||
end
|
end
|
||||||
|
|||||||
@ -1,9 +1,7 @@
|
|||||||
require "json"
|
require "json"
|
||||||
require "db/mongo/models/key"
|
|
||||||
require "fileutils"
|
|
||||||
|
|
||||||
module Devops
|
module Devops
|
||||||
module Version2_0
|
module API2_0
|
||||||
module Routes
|
module Routes
|
||||||
module KeyRoutes
|
module KeyRoutes
|
||||||
|
|
||||||
@ -22,7 +20,10 @@ module Devops
|
|||||||
# "id": "devops"
|
# "id": "devops"
|
||||||
# }
|
# }
|
||||||
# ]
|
# ]
|
||||||
app.get_with_headers "/keys", :headers => [:accept], &Devops::Version2_0::Handler::Key.get_keys
|
app.get_with_headers "/keys", :headers => [:accept] do
|
||||||
|
check_privileges("key", "r")
|
||||||
|
json Devops::API2_0::Handler::Key.new.keys
|
||||||
|
end
|
||||||
|
|
||||||
# Create ssh key on devops server
|
# Create ssh key on devops server
|
||||||
#
|
#
|
||||||
@ -40,7 +41,17 @@ module Devops
|
|||||||
#
|
#
|
||||||
# * *Returns* :
|
# * *Returns* :
|
||||||
# 201 - Created
|
# 201 - Created
|
||||||
app.post_with_headers "/key", :headers => [:accept, :content_type], &Devops::Version2_0::Handler::Key.create_key
|
app.post_with_headers "/key", :headers => [:accept, :content_type] do
|
||||||
|
check_privileges("key", "w")
|
||||||
|
key = create_object_from_json_body
|
||||||
|
fname = check_filename(key["file_name"], "Parameter 'file_name' must be a not empty string")
|
||||||
|
kname = check_string(key["key_name"], "Parameter 'key_name' should be a not empty string")
|
||||||
|
content = check_string(key["content"], "Parameter 'content' should be a not empty string")
|
||||||
|
file_name = File.join(settings.keys_dir, fname)
|
||||||
|
halt(400, "File '#{fname}' already exist") if File.exists?(file_name)
|
||||||
|
Devops::API2_0::Handler::Key.new.create(key, file_name)
|
||||||
|
create_response("Created", nil, 201)
|
||||||
|
end
|
||||||
|
|
||||||
# Delete ssh key from devops server
|
# Delete ssh key from devops server
|
||||||
#
|
#
|
||||||
@ -51,7 +62,27 @@ module Devops
|
|||||||
#
|
#
|
||||||
# * *Returns* :
|
# * *Returns* :
|
||||||
# 200 - Deleted
|
# 200 - Deleted
|
||||||
app.delete_with_headers "/key/:key", :headers => [:accept], &Devops::Version2_0::Handler::Key.delete_key
|
app.delete_with_headers "/key/:key", :headers => [:accept] do
|
||||||
|
check_privileges("key", "w")
|
||||||
|
servers = settings.mongo.servers_by_key params[:key]
|
||||||
|
unless servers.empty?
|
||||||
|
s_str = servers.map{|s| s.id}.join(", ")
|
||||||
|
raise DependencyError.new "Deleting is forbidden: Key is used in servers: #{s_str}"
|
||||||
|
end
|
||||||
|
|
||||||
|
k = settings.mongo.key params[:key]
|
||||||
|
begin
|
||||||
|
FileUtils.rm(k.path)
|
||||||
|
rescue
|
||||||
|
logger.error "Missing key file for #{params[:key]} - #{k.filename}"
|
||||||
|
end
|
||||||
|
r = settings.mongo.key_delete params[:key]
|
||||||
|
|
||||||
|
r = Devops::API2_0::Handler::Key.new.delete params[:key]
|
||||||
|
return [500, r["err"].inspect] unless r["err"].nil?
|
||||||
|
create_response("Key '#{params[:key]}' removed")
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
puts "Key routes initialized"
|
puts "Key routes initialized"
|
||||||
end
|
end
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
require "json"
|
require "json"
|
||||||
|
|
||||||
module Devops
|
module Devops
|
||||||
module Version2_0
|
module API2_0
|
||||||
module Routes
|
module Routes
|
||||||
module ServerRoutes
|
module ServerRoutes
|
||||||
|
|
||||||
@ -23,7 +23,17 @@ module Devops
|
|||||||
# "chef_node_name": "chef name"
|
# "chef_node_name": "chef name"
|
||||||
# }
|
# }
|
||||||
# ]
|
# ]
|
||||||
app.get_with_headers "/servers", :headers => [:accept], &Devops::Version2_0::Handler::Server.get_servers
|
app.get_with_headers "/servers", :headers => [:accept] do
|
||||||
|
check_privileges("server", "r")
|
||||||
|
fields = []
|
||||||
|
if params.key?("fields") and params["fields"].is_a?(Array)
|
||||||
|
Devops::Model::Server.fields.each do |k|
|
||||||
|
fields.push k if params["fields"].include?(k)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
reserved = (params.key?("reserved") ? true : nil)
|
||||||
|
json Devops::Version2_0::Handler::Server.new.servers(fields, reserved)
|
||||||
|
end
|
||||||
|
|
||||||
# Get chef nodes list
|
# Get chef nodes list
|
||||||
#
|
#
|
||||||
@ -38,7 +48,10 @@ module Devops
|
|||||||
# "chef_node_name": "chef name"
|
# "chef_node_name": "chef name"
|
||||||
# }
|
# }
|
||||||
# ]
|
# ]
|
||||||
app.get_with_headers "/servers/chef", :headers => [:accept], &Devops::Version2_0::Handler::Server.get_chef_servers
|
app.get_with_headers "/servers/chef", :headers => [:accept] do
|
||||||
|
check_privileges("server", "r")
|
||||||
|
json Devops::Version2_0::Handler::Server.new.chef_servers
|
||||||
|
end
|
||||||
|
|
||||||
# Get provider servers list
|
# Get provider servers list
|
||||||
#
|
#
|
||||||
@ -76,7 +89,10 @@ module Devops
|
|||||||
# "private_ip": "172.17.0.1"
|
# "private_ip": "172.17.0.1"
|
||||||
# }
|
# }
|
||||||
# ]
|
# ]
|
||||||
app.get_with_headers "/servers/:provider", :headers => [:accept], &Devops::Version2_0::Handler::Server.get_provider_servers
|
app.get_with_headers "/servers/:provider", :headers => [:accept] do
|
||||||
|
check_privileges("server", "r")
|
||||||
|
json Devops::Version2_0::Handler::Server.provider_servers(params[:provider])
|
||||||
|
end
|
||||||
|
|
||||||
# Get server info by :name
|
# Get server info by :name
|
||||||
#
|
#
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
module Devops
|
module Devops
|
||||||
module Version2_0
|
module API2_0
|
||||||
module Routes
|
module Routes
|
||||||
module TagRoutes
|
module TagRoutes
|
||||||
|
|
||||||
@ -17,7 +17,10 @@ module Devops
|
|||||||
# [
|
# [
|
||||||
# "tag_1"
|
# "tag_1"
|
||||||
# ]
|
# ]
|
||||||
hash["GET"] = Devops::Version2_0::Handler::Tag.get_tags
|
hash["GET"] = lambda {
|
||||||
|
check_privileges("server", "r")
|
||||||
|
json Devops::API2_0::Handler::Tag.new(params[:node_name]).tags()
|
||||||
|
}
|
||||||
|
|
||||||
# Set tags list to :node_name
|
# Set tags list to :node_name
|
||||||
#
|
#
|
||||||
@ -33,7 +36,13 @@ module Devops
|
|||||||
#
|
#
|
||||||
# * *Returns* :
|
# * *Returns* :
|
||||||
# 200
|
# 200
|
||||||
hash["POST"] = Devops::Version2_0::Handler::Tag.set_tags
|
hash["POST"] = lambda {
|
||||||
|
check_privileges("server", "w")
|
||||||
|
tags = create_object_from_json_body(Array)
|
||||||
|
check_array(tags, "Request body should be a not empty array of strings")
|
||||||
|
Devops::Version2_0::Handler::Tag.new(params[:node_name]).set_tags(tags)
|
||||||
|
create_response("Set tags for #{params[:node_name]}", tags: tags)
|
||||||
|
}
|
||||||
|
|
||||||
# Delete tags from :node_name
|
# Delete tags from :node_name
|
||||||
#
|
#
|
||||||
@ -49,7 +58,13 @@ module Devops
|
|||||||
#
|
#
|
||||||
# * *Returns* :
|
# * *Returns* :
|
||||||
# 200
|
# 200
|
||||||
hash["DELETE"] = Devops::Version2_0::Handler::Tag.unset_tags
|
hash["DELETE"] = lambda {
|
||||||
|
check_privileges("server", "w")
|
||||||
|
tags = create_object_from_json_body(Array)
|
||||||
|
check_array(tags, "Request body should be a not empty array of strings")
|
||||||
|
Devops::Version2_0::Handler::Tag.new(params[:node_name]).unset_tags(tags)
|
||||||
|
create_response("Deleted tags for #{params[:node_name]}", tags: tags)
|
||||||
|
}
|
||||||
app.multi_routes "/tags/:node_name", {:headers => [:accept, :content_type]}, hash
|
app.multi_routes "/tags/:node_name", {:headers => [:accept, :content_type]}, hash
|
||||||
|
|
||||||
puts "Tag routes initialized"
|
puts "Tag routes initialized"
|
||||||
|
|||||||
@ -8,21 +8,23 @@ 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/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"
|
||||||
|
require_relative "api2/handlers/bootstrap_templates"
|
||||||
|
require_relative "api2/handlers/key"
|
||||||
|
require_relative "api2/handlers/tag"
|
||||||
|
require_relative "api2/handlers/server"
|
||||||
|
|
||||||
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
|
=begin
|
||||||
require "routes/v2.0/handlers/bootstrap_templates"
|
|
||||||
require "routes/v2.0/handlers/image"
|
require "routes/v2.0/handlers/image"
|
||||||
require "routes/v2.0/handlers/network"
|
require "routes/v2.0/handlers/network"
|
||||||
require "routes/v2.0/handlers/key"
|
|
||||||
require "routes/v2.0/handlers/project"
|
require "routes/v2.0/handlers/project"
|
||||||
require "routes/v2.0/handlers/tag"
|
require "routes/v2.0/handlers/status"
|
||||||
require "routes/v2.0/handlers/server"
|
|
||||||
=end
|
=end
|
||||||
|
|
||||||
require 'lib/stubber'
|
require 'lib/stubber'
|
||||||
|
|||||||
@ -2,7 +2,8 @@ module BootstrapTemplatesCommands
|
|||||||
|
|
||||||
def get_templates
|
def get_templates
|
||||||
res = []
|
res = []
|
||||||
Dir.foreach("#{ENV["HOME"]}/.chef/bootstrap/") {|f| res.push(f[0..-5]) if f.end_with?(".erb")} if File.exists? "#{ENV["HOME"]}/.chef/bootstrap/"
|
dir = "#{ENV["HOME"]}/.chef/bootstrap/"
|
||||||
|
Dir.foreach(dir) {|f| res.push(f[0..-5]) if f.end_with?(".erb")} if File.exists? dir
|
||||||
res
|
res
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user