Merge branch 'cid-390-async_servers_deleting' into temp_merge

This commit is contained in:
Anton Chuchkalov 2016-02-10 20:54:23 +03:00
commit bd179bb325
13 changed files with 96 additions and 59 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

@ -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,11 @@ 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
current_user = parser.current_user
reports = servers.map do |server|
Worker.start_async(DeleteServerWorker, 'server_id' => server.id, 'current_user' => current_user)
end
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,11 @@ 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)
current_user = parser.current_user
Devops::Db.connector.check_project_auth server.project, server.deploy_env, current_user
jid = Worker.start_async(DeleteServerWorker, 'server_id' => server.id, 'current_user' => current_user)
[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

@ -11,6 +11,7 @@ module Devops
STACK_TYPE = 5
DEPLOY_STACK_TYPE = 6
DELETE_SERVER_TYPE = 7
EXPIRE_SERVER_TYPE = 8
attr_accessor :id, :file, :updated_at, :created_by, :project, :deploy_env, :type, :chef_node_name, :host, :status, :stack, :subreports, :job_result_code

View File

@ -1,4 +1,4 @@
require "workers/delete_server_worker"
require "workers/delete_expired_server_worker"
module Devops
module Executor
@ -9,7 +9,7 @@ module Devops
def schedule_expiration!
return unless @expires
DeleteServerWorker.perform_in(interval_in_seconds, server_chef_node_name: @server.chef_node_name)
DeleteExpiredServerWorker.perform_in(interval_in_seconds, server_chef_node_name: @server.chef_node_name)
end
def interval_in_seconds

View File

@ -436,23 +436,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
@ -497,6 +499,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

@ -5,12 +5,12 @@ RSpec.describe Devops::Executor::ExpirationScheduler do
describe '#schedule_expiration!' do
it 'schedules server deleting at given time' do
expect(DeleteServerWorker).to receive(:perform_in).with(120, server_chef_node_name: 'chef_node_name')
expect(DeleteExpiredServerWorker).to receive(:perform_in).with(120, server_chef_node_name: 'chef_node_name')
described_class.new('2m', server).schedule_expiration!
end
it "doesn't schedule job if expires is nil" do
expect(DeleteServerWorker).not_to receive(:perform_in)
expect(DeleteExpiredServerWorker).not_to receive(:perform_in)
described_class.new(nil, server).schedule_expiration!
end
end

View File

@ -139,14 +139,14 @@ RSpec.describe Devops::Executor::ServerExecutor, type: :executor, stubbed_connec
it 'schedules expiration for server' do
deploy_env.expires = '2m'
allow(DeleteServerWorker).to receive(:perform_in)
expect(DeleteServerWorker).to receive(:perform_in).with(120, {server_chef_node_name: 'node_name'})
allow(DeleteExpiredServerWorker).to receive(:perform_in)
expect(DeleteExpiredServerWorker).to receive(:perform_in).with(120, {server_chef_node_name: 'node_name'})
create_server
end
it "doesn't schedule expiration if deploy_env.expires is nil" do
deploy_env.expires = nil
expect(DeleteServerWorker).not_to receive(:perform_in)
expect(DeleteExpiredServerWorker).not_to receive(:perform_in)
create_server
end
@ -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,37 @@
require "db/mongo/models/server"
require "db/mongo/models/report"
require "lib/executors/server_executor"
require "workers/worker"
class DeleteExpiredServerWorker < Worker
def perform(options)
chef_node_name = options.fetch('server_chef_node_name')
call() do |out, file|
out.puts "Expire server '#{chef_node_name}'."
server = mongo.server_by_chef_node_name(chef_node_name)
report = save_report(file, server)
e = Devops::Executor::ServerExecutor.new(server, out)
e.report = report
e.delete_server
end
end
private
def save_report(file, server)
report = Devops::Model::Report.new(
"file" => file,
"_id" => jid,
"created_by" => 'SYSTEM',
"project" => server.project,
"deploy_env" => server.deploy_env,
"type" => Devops::Model::Report::EXPIRE_SERVER_TYPE
)
mongo.save_report(report)
report
end
end

View File

@ -5,15 +5,17 @@ require "workers/worker"
class DeleteServerWorker < Worker
# options should contain 'server_id'
def perform(options)
chef_node_name = options.fetch('server_chef_node_name')
puts "Expire server '#{chef_node_name}'."
server_id = options.fetch('server_id')
current_user = options.fetch('current_user')
call() do |out, file|
server = mongo.server_by_chef_node_name(chef_node_name)
report = save_report(file, server)
out.puts "Deleting server with id #{server_id}" and out.flush
@server = mongo.server_by_instance_id(server_id)
report = save_report(file, current_user)
e = Devops::Executor::ServerExecutor.new(server, out)
e = Devops::Executor::ServerExecutor.new(@server, out)
e.report = report
e.delete_server
end
@ -21,13 +23,13 @@ class DeleteServerWorker < Worker
private
def save_report(file, server)
def save_report(file, current_user)
report = Devops::Model::Report.new(
"file" => file,
"_id" => jid,
"created_by" => 'SYSTEM',
"project" => server.project,
"deploy_env" => server.deploy_env,
"created_by" => current_user,
"project" => @server.project,
"deploy_env" => @server.deploy_env,
"type" => Devops::Model::Report::DELETE_SERVER_TYPE
)
mongo.save_report(report)

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