move servers deleting to background

This commit is contained in:
Anton Chuchkalov 2016-02-02 15:43:13 +07:00
parent 8d01ff77b9
commit 775c9758ca
10 changed files with 78 additions and 44 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View 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

View File

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