Merge branch 'devops_3_amartynov' of http://git.stu.neva.ru/cloudtechlab/devops-service into devops_3_amartynov

This commit is contained in:
amartynov 2015-07-27 11:16:36 +03:00
commit f25e95df45
10 changed files with 136 additions and 122 deletions

View File

@ -1,18 +1,12 @@
require "commands/bootstrap_templates"
module Devops
module Version2_0
module API2_0
module Handler
class BootstrapTemplates
extend BootstrapTemplatesCommands
def self.get_bootstrap_templates
lambda {
check_privileges("templates", "r")
# broadcast(:cancel_order_failed, "hello")
json BootstrapTemplates.get_templates
}
end
include BootstrapTemplatesCommands
end
end
end

View File

@ -1,56 +1,41 @@
require "db/mongo/models/key"
require "fileutils"
module Devops
module Version2_0
module API2_0
module Handler
class Key
def self.get_keys
lambda {
check_privileges("key", "r")
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
}
def keys
keys = Devops::DB.connector.keys.map {|i| i.to_hash}
keys.each {|k| k.delete("path")} # We should not return path to the key
end
def self.create_key
lambda {
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)
File.open(file_name, "w") do |f|
f.write(content)
f.chmod(0400)
end
def create body, file_name
File.open(file_name, "w") do |f|
f.write(body["content"])
f.chmod(0400)
end
key = Devops::Model::Key.new({"path" => file_name, "id" => kname})
settings.mongo.key_insert key
create_response("Created", nil, 201)
}
key = Devops::Model::Key.new({"path" => file_name, "id" => body["key_name"]})
Devops::DB.connector.key_insert key
end
def self.delete_key
lambda {
check_privileges("key", "w")
servers = settings.mongo.servers_by_key params[:key]
def delete key_id
mongo = Devops::DB.connector
servers = mongo.servers_by_key key_id
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]
k = mongo.key key_id
begin
FileUtils.rm(k.path)
rescue
logger.error "Missing key file for #{params[:key]} - #{k.filename}"
logger.error "Missing key file for #{key_id} - #{k.filename}"
end
r = settings.mongo.key_delete params[:key]
return [500, r["err"].inspect] unless r["err"].nil?
create_response("Key '#{params[:key]}' removed")
}
mongo.key_delete key_id
end
end

View File

@ -14,7 +14,7 @@ require "workers/create_server_worker"
require "workers/bootstrap_worker"
module Devops
module Version2_0
module API2_0
module Handler
class Server
@ -24,32 +24,16 @@ module Devops
scheduler = Rufus::Scheduler.new
def self.get_servers
lambda {
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}
}
def servers fields, reserved
Devops::DB.connector.servers(nil, nil, nil, reserved, fields).map {|s| s.to_hash}
end
def self.get_chef_servers
lambda {
check_privileges("server", "r")
json KnifeCommands.chef_node_list
}
def chef_servers
KnifeCommands.chef_node_list
end
def self.get_provider_servers
lambda {
check_privileges("server", "r")
json ::Provider::ProviderFactory.get(params[:provider]).servers
}
def provider_servers provider
::Provider::ProviderFactory.get(provider).servers
end
def self.get_server

View File

@ -1,48 +1,31 @@
require "commands/knife_commands"
module Devops
module Version2_0
module API2_0
module Handler
class Tag
def self.get_tags
lambda {
check_privileges("server", "r")
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
json(KnifeCommands.tags_list(chef_node_name))
}
def initialize node_name
@node_name = node_name
@server = Devops::DB.connector.server_by_chef_node_name(@node_name)
#TODO: raise
halt_response("No servers found for name '#{@node_name}'", 404) if @server.nil?
end
def self.set_tags
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")
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_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}")
}
def tags
KnifeCommands.tags_list(@node_name)
end
def set_tags tags
tagsStr = tags.join(" ")
cmd = KnifeCommands.tags_create(@node_name, tagsStr)
halt_response("Error: Cannot add tags #{tagsStr} to server #{@node_name}", 500) unless cmd[1]
end
def self.unset_tags
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")
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}")
}
tagsStr = tags.join(" ")
cmd = KnifeCommands.tags_delete(@node_name, tagsStr)
halt_response("Cannot delete tags #{tagsStr} from server #{@node_name}: #{cmd[0]}", 500) unless cmd[1]
end
end
end

View File

@ -1,5 +1,5 @@
module Devops
module Version2_0
module API2_0
module Routes
module BootstrapTemplatesRoutes
@ -18,7 +18,10 @@ module Devops
# [
# "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"
end

View File

@ -1,9 +1,7 @@
require "json"
require "db/mongo/models/key"
require "fileutils"
module Devops
module Version2_0
module API2_0
module Routes
module KeyRoutes
@ -22,7 +20,10 @@ module 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
#
@ -40,7 +41,17 @@ module Devops
#
# * *Returns* :
# 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
#
@ -51,7 +62,27 @@ module Devops
#
# * *Returns* :
# 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"
end

View File

@ -1,7 +1,7 @@
require "json"
module Devops
module Version2_0
module API2_0
module Routes
module ServerRoutes
@ -23,7 +23,17 @@ module Devops
# "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
#
@ -38,7 +48,10 @@ module Devops
# "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
#
@ -76,7 +89,10 @@ module Devops
# "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
#

View File

@ -1,5 +1,5 @@
module Devops
module Version2_0
module API2_0
module Routes
module TagRoutes
@ -17,7 +17,10 @@ module Devops
# [
# "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
#
@ -33,7 +36,13 @@ module Devops
#
# * *Returns* :
# 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
#
@ -49,7 +58,13 @@ module Devops
#
# * *Returns* :
# 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
puts "Tag routes initialized"

View File

@ -8,21 +8,23 @@ module Devops
require_relative "api2/handlers/filter"
require_relative "api2/handlers/group"
require_relative "api2/handlers/user"
<<<<<<< HEAD
require_relative "api2/handlers/report"
require_relative "api2/handlers/deploy"
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_template"
require_relative "api2/handlers/stack_template_preset"
=begin
require "routes/v2.0/handlers/bootstrap_templates"
require "routes/v2.0/handlers/image"
require "routes/v2.0/handlers/network"
require "routes/v2.0/handlers/key"
require "routes/v2.0/handlers/project"
require "routes/v2.0/handlers/tag"
require "routes/v2.0/handlers/server"
require "routes/v2.0/handlers/status"
=end
require 'lib/stubber'

View File

@ -2,7 +2,8 @@ module BootstrapTemplatesCommands
def get_templates
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
end