move servers deleting to background
This commit is contained in:
		
							parent
							
								
									8d01ff77b9
								
							
						
					
					
						commit
						775c9758ca
					
				| @ -87,10 +87,7 @@ class Server < Handler | ||||
|       end | ||||
|       if question(I18n.t("handler.server.question.delete", :name => name)) | ||||
|         puts "Server '#{name}', deleting..." | ||||
|         o = delete("/server/#{name}", options) | ||||
|         ["server", "chef_node", "chef_client", "message"].each do |k| | ||||
|           puts o[k] unless o[k].nil? | ||||
|         end | ||||
|         puts delete("/server/#{name}", options) | ||||
|       end | ||||
|     end | ||||
|     "" | ||||
|  | ||||
| @ -126,7 +126,7 @@ class ServerOptions < CommonOptions | ||||
|         options[:groups] = groups.split(",") | ||||
|       end | ||||
| 
 | ||||
|       parser.recognize_option_value(:private_ip, 'server', short: '-N', i18n_scope: 'create') | ||||
|       parser.recognize_option_value(:private_ip, short: '-N', i18n_scope: 'create') | ||||
| 
 | ||||
|       # it was disabled somewhy | ||||
|       # parser.on('--public-ip', "Associate public IP with server") do | ||||
|  | ||||
| @ -154,17 +154,13 @@ module Output | ||||
|     def delete_servers_output | ||||
|       output = '' | ||||
| 
 | ||||
|       if @data['deleted'].empty? | ||||
|       if @data['reports'].empty? | ||||
|         output << 'There are no deleted servers.' | ||||
|       else | ||||
|         output << "Deleted servers:\n----\n" | ||||
|         output << @data['deleted'].join("\n") | ||||
|         output << "Reports for servers deleting:\n----\n" | ||||
|         output << @data['reports'].join("\n") | ||||
|       end | ||||
| 
 | ||||
|       if !@data['failed'].empty? | ||||
|         output << "\nThere were errors during deleting these servers:\n----\n" | ||||
|         output << @data['failed'].join("\n") | ||||
|       end | ||||
|       output | ||||
|     end | ||||
| 
 | ||||
|  | ||||
| @ -4,6 +4,7 @@ require "workers/project_test_worker" | ||||
| require "app/api2/parsers/project" | ||||
| require "lib/project/type/types_factory" | ||||
| require "lib/executors/server_executor" | ||||
| require "workers/delete_server_worker" | ||||
| 
 | ||||
| require_relative "../helpers/version_2.rb" | ||||
| require_relative "request_handler" | ||||
| @ -314,16 +315,10 @@ module Devops | ||||
|         private | ||||
| 
 | ||||
|         def delete_chosen_servers!(servers) | ||||
|           deleted, failed = [], [] | ||||
|           servers.each do |server| | ||||
|             begin | ||||
|               Devops::Executor::ServerExecutor.new(server, '').delete_server | ||||
|               deleted << server.id | ||||
|             rescue | ||||
|               failed << server.id | ||||
|             end | ||||
|           reports = servers.map do |server| | ||||
|             Worker.start_async(DeleteServerWorker, 'server_id' => server.id) | ||||
|           end | ||||
|           {deleted: deleted, failed: failed} | ||||
|           {reports: reports} | ||||
|         end | ||||
| 
 | ||||
|       end | ||||
|  | ||||
| @ -10,6 +10,7 @@ require "db/mongo/models/server" | ||||
| 
 | ||||
| require "workers/create_server_worker" | ||||
| require "workers/bootstrap_worker" | ||||
| require "workers/delete_server_worker" | ||||
| require "app/api2/parsers/server" | ||||
| require_relative "request_handler" | ||||
| 
 | ||||
| @ -47,10 +48,10 @@ module Devops | ||||
|         end | ||||
| 
 | ||||
|         def delete id | ||||
|           s = get_server_by_key(id, parser.instance_key) | ||||
|           ### Authorization | ||||
|           Devops::Db.connector.check_project_auth s.project, s.deploy_env, parser.current_user | ||||
|           Devops::Executor::ServerExecutor.new(s, "").delete_server | ||||
|           server = get_server_by_key(id, parser.instance_key) | ||||
|           Devops::Db.connector.check_project_auth server.project, server.deploy_env, parser.current_user | ||||
|           jid = Worker.start_async(DeleteServerWorker, 'server_id' => id) | ||||
|           [jid] | ||||
|         end | ||||
| 
 | ||||
|         def create_server_stream out | ||||
|  | ||||
| @ -127,8 +127,7 @@ module Devops | ||||
|           #   200 - Deleted | ||||
|           hash["DELETE"] = lambda {|id| | ||||
|             check_privileges("server", "w") | ||||
|             info, r = Devops::API2_0::Handler::Server.new(request).delete(id) | ||||
|             create_response(info, r) | ||||
|             json Devops::API2_0::Handler::Server.new(request).delete(id) | ||||
|           } | ||||
|           app.multi_routes "/server/:id", {:headers => [:accept, :content_type]}, hash | ||||
| 
 | ||||
|  | ||||
| @ -432,23 +432,25 @@ module Devops | ||||
|             unbootstrap | ||||
|           end | ||||
|           mongo.server_delete @server.id | ||||
|           msg = "Static server '#{@server.id}' is removed" | ||||
|           DevopsLogger.logger.info msg | ||||
|           return msg, nil | ||||
|           puts_and_flush "Static server '#{@server.id}' is removed" | ||||
|           return 0 | ||||
|         end | ||||
|         r = delete_from_chef_server(@server.chef_node_name) | ||||
| 
 | ||||
|         puts_and_flush "Deleting from chef server:" | ||||
|         delete_from_chef_server(@server.chef_node_name).each do |key, result| | ||||
|           @out.puts "#{key} - #{result}" | ||||
|         end | ||||
| 
 | ||||
|         puts_and_flush "Deleting from cloud:" | ||||
|         provider = @server.provider_instance | ||||
|         begin | ||||
|           r[:server] = provider.delete_server @server | ||||
|           puts_and_flush provider.delete_server @server | ||||
|         rescue Fog::Compute::OpenStack::NotFound, Fog::Compute::AWS::NotFound | ||||
|           r[:server] = "Server with id '#{@server.id}' not found in '#{provider.name}' servers" | ||||
|           DevopsLogger.logger.warn r[:server] | ||||
|           puts_and_flush "Server with id '#{@server.id}' not found among '#{provider.name}' servers" | ||||
|         end | ||||
|         mongo.server_delete @server.id | ||||
|         info = "Server '#{@server.id}' with name '#{@server.chef_node_name}' for project '#{@server.project}-#{@server.deploy_env}' is removed" | ||||
|         DevopsLogger.logger.info info | ||||
|         r.each{|key, log| DevopsLogger.logger.info("#{key} - #{log}")} | ||||
|         return info, r | ||||
|         puts_and_flush "Server '#{@server.id}' with name '#{@server.chef_node_name}' for project '#{@server.project}-#{@server.deploy_env}' is removed." | ||||
|         0 | ||||
|       end | ||||
| 
 | ||||
|       def roll_back | ||||
| @ -493,6 +495,11 @@ module Devops | ||||
| 
 | ||||
|       private | ||||
| 
 | ||||
|       def puts_and_flush(message) | ||||
|         @out.puts message | ||||
|         @out.flush | ||||
|       end | ||||
| 
 | ||||
|       def schedule_expiration | ||||
|         if @deploy_env.expires | ||||
|           @out <<  "Planning expiration in #{@deploy_env.expires}" | ||||
|  | ||||
| @ -660,9 +660,8 @@ RSpec.describe Devops::Executor::ServerExecutor, type: :executor, stubbed_connec | ||||
|         delete_server | ||||
|       end | ||||
| 
 | ||||
|       it 'returns message and nil' do | ||||
|         expect(delete_server.first).to be_a(String) | ||||
|         expect(delete_server.last).to be nil | ||||
|       it 'returns 0' do | ||||
|         expect(delete_server).to eq 0 | ||||
|       end | ||||
| 
 | ||||
|       it "doesn't try to remove it from cloud" do | ||||
| @ -707,9 +706,8 @@ RSpec.describe Devops::Executor::ServerExecutor, type: :executor, stubbed_connec | ||||
|         delete_server | ||||
|       end | ||||
| 
 | ||||
|       it 'returns message and hash with :chef_node, :chef_client and :server keys' do | ||||
|         expect(delete_server.first).to be_a(String) | ||||
|         expect(delete_server.last).to be_a(Hash).and include(:chef_client, :chef_node, :server) | ||||
|       it 'returns 0' do | ||||
|         expect(delete_server).to eq 0 | ||||
|       end | ||||
|     end | ||||
|   end | ||||
|  | ||||
							
								
								
									
										39
									
								
								devops-service/workers/delete_server_worker.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								devops-service/workers/delete_server_worker.rb
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,39 @@ | ||||
| require "db/mongo/models/server" | ||||
| require "db/mongo/models/report" | ||||
| require "lib/executors/server_executor" | ||||
| require "workers/worker" | ||||
| require 'byebug' | ||||
| 
 | ||||
| class DeleteServerWorker < Worker | ||||
| 
 | ||||
|   # options should contain 'server_id' | ||||
|   def perform(options) | ||||
|     server_id = options.fetch('server_id') | ||||
| 
 | ||||
|     call() do |out, file| | ||||
|       out.puts "Deleting server with id #{server_id}" and out.flush | ||||
|       @server = mongo.server_by_instance_id(server_id) | ||||
|       report = save_report(file) | ||||
| 
 | ||||
|       e = Devops::Executor::ServerExecutor.new(@server, out) | ||||
|       e.report = report | ||||
|       e.delete_server | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   private | ||||
| 
 | ||||
|   def save_report(file) | ||||
|     report = Devops::Model::Report.new( | ||||
|       "file" => file, | ||||
|       "_id" => jid, | ||||
|       "created_by" => 'SYSTEM', | ||||
|       "project" => @server.project, | ||||
|       "deploy_env" => @server.deploy_env, | ||||
|       "type" => Devops::Model::Report::DELETE_SERVER_TYPE | ||||
|     ) | ||||
|     mongo.save_report(report) | ||||
|     report | ||||
|   end | ||||
| 
 | ||||
| end | ||||
| @ -5,6 +5,8 @@ require File.join(root, "deploy_worker") | ||||
| require File.join(root, "bootstrap_worker") | ||||
| require File.join(root, "project_test_worker") | ||||
| require File.join(root, "stack_bootstrap_worker") | ||||
| require File.join(root, "delete_server_worker") | ||||
| require File.join(root, "delete_expired_server_worker") | ||||
| 
 | ||||
| config = {} | ||||
| #require File.join(root, "../proxy") | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Anton Chuchkalov
						Anton Chuchkalov