diff --git a/devops-service/app/api2/handlers/bootstrap_templates.rb b/devops-service/app/api2/handlers/bootstrap_templates.rb index 90b3cbd..94ffa6b 100644 --- a/devops-service/app/api2/handlers/bootstrap_templates.rb +++ b/devops-service/app/api2/handlers/bootstrap_templates.rb @@ -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 diff --git a/devops-service/app/api2/handlers/key.rb b/devops-service/app/api2/handlers/key.rb index fb96bd9..338a2d0 100644 --- a/devops-service/app/api2/handlers/key.rb +++ b/devops-service/app/api2/handlers/key.rb @@ -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 diff --git a/devops-service/app/api2/handlers/server.rb b/devops-service/app/api2/handlers/server.rb index 800d7d2..f1e5d44 100644 --- a/devops-service/app/api2/handlers/server.rb +++ b/devops-service/app/api2/handlers/server.rb @@ -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 diff --git a/devops-service/app/api2/handlers/tag.rb b/devops-service/app/api2/handlers/tag.rb index 9198aac..ea29315 100644 --- a/devops-service/app/api2/handlers/tag.rb +++ b/devops-service/app/api2/handlers/tag.rb @@ -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 diff --git a/devops-service/app/api2/routes/bootstrap_templates.rb b/devops-service/app/api2/routes/bootstrap_templates.rb index 1e1fc1c..93395e4 100644 --- a/devops-service/app/api2/routes/bootstrap_templates.rb +++ b/devops-service/app/api2/routes/bootstrap_templates.rb @@ -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 diff --git a/devops-service/app/api2/routes/key.rb b/devops-service/app/api2/routes/key.rb index 13d4be4..0b93348 100644 --- a/devops-service/app/api2/routes/key.rb +++ b/devops-service/app/api2/routes/key.rb @@ -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 diff --git a/devops-service/app/api2/routes/server.rb b/devops-service/app/api2/routes/server.rb index bf1c13f..ccb199f 100644 --- a/devops-service/app/api2/routes/server.rb +++ b/devops-service/app/api2/routes/server.rb @@ -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 # diff --git a/devops-service/app/api2/routes/tag.rb b/devops-service/app/api2/routes/tag.rb index d7577b9..30fe0e4 100644 --- a/devops-service/app/api2/routes/tag.rb +++ b/devops-service/app/api2/routes/tag.rb @@ -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" diff --git a/devops-service/app/devops-api2.rb b/devops-service/app/devops-api2.rb index 4587ec6..b309ceb 100644 --- a/devops-service/app/devops-api2.rb +++ b/devops-service/app/devops-api2.rb @@ -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' diff --git a/devops-service/commands/bootstrap_templates.rb b/devops-service/commands/bootstrap_templates.rb index fd53941..3d81e12 100644 --- a/devops-service/commands/bootstrap_templates.rb +++ b/devops-service/commands/bootstrap_templates.rb @@ -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