key, tag, bootstrap_template

This commit is contained in:
Anton Martynov 2015-07-17 20:22:29 +03:00
parent 31f1fd5e2b
commit 1555258d31
10 changed files with 134 additions and 122 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -8,17 +8,17 @@ 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"
require_relative "api2/handlers/bootstrap_templates"
require_relative "api2/handlers/key"
require_relative "api2/handlers/tag"
require_relative "api2/handlers/server"
=begin =begin
require "routes/v2.0/handlers/bootstrap_templates"
require "routes/v2.0/handlers/deploy" require "routes/v2.0/handlers/deploy"
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/script" require "routes/v2.0/handlers/script"
require "routes/v2.0/handlers/status" require "routes/v2.0/handlers/status"
require "routes/v2.0/handlers/tag"
require "routes/v2.0/handlers/server"
require "routes/v2.0/handlers/stack" require "routes/v2.0/handlers/stack"
require "routes/v2.0/handlers/stack_template" require "routes/v2.0/handlers/stack_template"
require "routes/v2.0/handlers/report" require "routes/v2.0/handlers/report"

View File

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