From b565052f6b2da3da6d76d8dbe373c3efedd23c29 Mon Sep 17 00:00:00 2001 From: Anton Chuchkalov Date: Fri, 12 Feb 2016 16:18:17 +0300 Subject: [PATCH] add possibility to delete list of servers --- devops-client/lib/devops-client.rb | 2 +- .../lib/devops-client/handler/server.rb | 14 +++++++++++ .../devops-client/options/server_options.rb | 6 ++++- devops-client/locales/en.yml | 1 + devops-service/app/api2/handlers/server.rb | 21 +++++++++++++++++ devops-service/app/api2/parsers/server.rb | 5 ++++ devops-service/app/api2/routes/deploy.rb | 2 +- devops-service/app/api2/routes/server.rb | 23 +++++++++++++++++++ 8 files changed, 71 insertions(+), 3 deletions(-) diff --git a/devops-client/lib/devops-client.rb b/devops-client/lib/devops-client.rb index fd6c6e7..9c581eb 100644 --- a/devops-client/lib/devops-client.rb +++ b/devops-client/lib/devops-client.rb @@ -49,7 +49,7 @@ module DevopsClient if result.is_a?(Hash) puts result["message"] else - puts result + puts result if result end rescue OptionParser::InvalidOption => e puts e.message diff --git a/devops-client/lib/devops-client/handler/server.rb b/devops-client/lib/devops-client/handler/server.rb index e50a76d..b8dc0c7 100644 --- a/devops-client/lib/devops-client/handler/server.rb +++ b/devops-client/lib/devops-client/handler/server.rb @@ -25,6 +25,8 @@ class Server < Handler create_handler when :delete delete_handler + when :delete_list + delete_list_handler when :bootstrap bootstrap_handler when :sync @@ -94,6 +96,18 @@ class Server < Handler nil end + def delete_list_handler + abort "Please specify at least one server id" if @args.length < 3 + server_ids = @args[2..-1] + if question(I18n.t("handler.server.question.delete_list", ids: server_ids.join(', '))) + servers_jobs = post("/server/delete_list", {servers_ids: server_ids}) + servers_jobs.each do |server_id, job_id| + puts "Report for deleting #{server_id}: #{report_url(job_id)}" + end + end + nil + end + def show_handler r = inspect_parameters @options_parser.show_params, @args[2] unless r.nil? diff --git a/devops-client/lib/devops-client/options/server_options.rb b/devops-client/lib/devops-client/options/server_options.rb index 662db24..455c6f8 100644 --- a/devops-client/lib/devops-client/options/server_options.rb +++ b/devops-client/lib/devops-client/options/server_options.rb @@ -2,7 +2,7 @@ require "devops-client/options/common_options" class ServerOptions < CommonOptions - commands :add, :bootstrap, :create, :delete, :list, :pause, :reserve, :show, :unpause, :unreserve # :sync, + commands :add, :bootstrap, :create, :delete, :list, :pause, :reserve, :show, :unpause, :unreserve, :delete_list def initialize args, def_options super(args, def_options) @@ -161,4 +161,8 @@ class ServerOptions < CommonOptions self.banner_header + " delete NODE_NAME [NODE_NAME ...]\n" end + def delete_list_banner + self.banner_header + " delete_list INSTANCE_ID [INSTANCE_ID ...]\n" + end + end diff --git a/devops-client/locales/en.yml b/devops-client/locales/en.yml index d088e01..64f97e2 100644 --- a/devops-client/locales/en.yml +++ b/devops-client/locales/en.yml @@ -103,6 +103,7 @@ en: server: question: delete: "Are you sure to delete server '%{name}'?" + delete_list: "Are you sure to delete these servers: %{ids}?" stack_template: create: id: "Id: " diff --git a/devops-service/app/api2/handlers/server.rb b/devops-service/app/api2/handlers/server.rb index aa77939..88c2683 100644 --- a/devops-service/app/api2/handlers/server.rb +++ b/devops-service/app/api2/handlers/server.rb @@ -55,6 +55,17 @@ module Devops [jid] end + def delete_list + server_ids = parser.delete_list.uniq + servers = server_ids.map { |id| Devops::Db.connector.server_by_instance_id(id) } + current_user = parser.current_user + check_servers_list_auth(servers, current_user) + server_ids.inject({}) do |hash, server_id| + hash[server_id] = Worker.start_async(DeleteServerWorker, 'server_id' => server_id, 'current_user' => current_user) + hash + end + end + def create_server_stream out status = [] prepare_create_server do |project, env, user, body| @@ -329,6 +340,16 @@ module Devops Devops::Db.connector.server_update(server) end + def check_servers_list_auth(servers, current_user) + project_with_env_pairs = servers.map do |server| + [server.project, server.deploy_env] + end + project_with_env_pairs.uniq.each do |pair| + project, env = *pair + Devops::Db.connector.check_project_auth project, env, current_user + end + end + end end end diff --git a/devops-service/app/api2/parsers/server.rb b/devops-service/app/api2/parsers/server.rb index 1181f29..b9c1a6f 100644 --- a/devops-service/app/api2/parsers/server.rb +++ b/devops-service/app/api2/parsers/server.rb @@ -75,6 +75,11 @@ module Devops rl end + def delete_list + @body ||= create_object_from_json_body + check_array(@body["servers_ids"], "Parameter 'servers_ids' should be a not empty array of string", String, false) + end + end end end diff --git a/devops-service/app/api2/routes/deploy.rb b/devops-service/app/api2/routes/deploy.rb index 8302e35..7a2a208 100644 --- a/devops-service/app/api2/routes/deploy.rb +++ b/devops-service/app/api2/routes/deploy.rb @@ -14,7 +14,7 @@ module Devops # - Content-Type: application/json # - body : # { - # "names": [], -> array of servers names to run chef-client + # "names": [], -> array of servers chef node names to run chef-client # "tags": [], -> array of tags to apply on each server before running chef-client # "build_number": "", -> string, build number to deploy # "run_list": [], -> array of strings to set run_list for chef-client diff --git a/devops-service/app/api2/routes/server.rb b/devops-service/app/api2/routes/server.rb index b411fbc..51c6e6b 100644 --- a/devops-service/app/api2/routes/server.rb +++ b/devops-service/app/api2/routes/server.rb @@ -441,6 +441,29 @@ module Devops create_response("Run list has been changed") end + + # Delete list of servers + # + # * *Request* + # - method : POST + # - headers : + # - Accept: application/json + # - Content-Type: application/json + # - body : + # { + # "servers_ids": [ "server1", "server2"] + # } + # + # * *Returns* : + # { + # "server1": "report_1", + # "server2": "report_2" + # } + app.post_with_headers "/server/delete_list", :headers => [:accept, :content_type] do + check_privileges("server", "w") + json Devops::API2_0::Handler::Server.new(request).delete_list + end + puts "Server routes initialized" end