Merge branch 'cid-390-async_servers_deleting' into features

This commit is contained in:
Anton Chuchkalov 2016-02-06 01:03:19 +07:00
commit 0fcd17b8bb
14 changed files with 94 additions and 59 deletions

View File

@ -87,10 +87,7 @@ class Server < Handler
end end
if question(I18n.t("handler.server.question.delete", :name => name)) if question(I18n.t("handler.server.question.delete", :name => name))
puts "Server '#{name}', deleting..." puts "Server '#{name}', deleting..."
o = delete("/server/#{name}", options) puts delete("/server/#{name}", options)
["server", "chef_node", "chef_client", "message"].each do |k|
puts o[k] unless o[k].nil?
end
end end
end end
"" ""

View File

@ -126,7 +126,7 @@ class ServerOptions < CommonOptions
options[:groups] = groups.split(",") options[:groups] = groups.split(",")
end 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 # it was disabled somewhy
# parser.on('--public-ip', "Associate public IP with server") do # parser.on('--public-ip', "Associate public IP with server") do

View File

@ -154,17 +154,13 @@ module Output
def delete_servers_output def delete_servers_output
output = '' output = ''
if @data['deleted'].empty? if @data['reports'].empty?
output << 'There are no deleted servers.' output << 'There are no deleted servers.'
else else
output << "Deleted servers:\n----\n" output << "Reports for servers deleting:\n----\n"
output << @data['deleted'].join("\n") output << @data['reports'].join("\n")
end end
if !@data['failed'].empty?
output << "\nThere were errors during deleting these servers:\n----\n"
output << @data['failed'].join("\n")
end
output output
end end

View File

@ -4,6 +4,7 @@ require "workers/project_test_worker"
require "app/api2/parsers/project" require "app/api2/parsers/project"
require "lib/project/type/types_factory" require "lib/project/type/types_factory"
require "lib/executors/server_executor" require "lib/executors/server_executor"
require "workers/delete_server_worker"
require_relative "../helpers/version_2.rb" require_relative "../helpers/version_2.rb"
require_relative "request_handler" require_relative "request_handler"
@ -314,16 +315,10 @@ module Devops
private private
def delete_chosen_servers!(servers) def delete_chosen_servers!(servers)
deleted, failed = [], [] reports = servers.map do |server|
servers.each do |server| Worker.start_async(DeleteServerWorker, 'server_id' => server.id)
begin
Devops::Executor::ServerExecutor.new(server, '').delete_server
deleted << server.id
rescue
failed << server.id
end end
end {reports: reports}
{deleted: deleted, failed: failed}
end end
end end

View File

@ -10,6 +10,7 @@ require "db/mongo/models/server"
require "workers/create_server_worker" require "workers/create_server_worker"
require "workers/bootstrap_worker" require "workers/bootstrap_worker"
require "workers/delete_server_worker"
require "app/api2/parsers/server" require "app/api2/parsers/server"
require_relative "request_handler" require_relative "request_handler"
@ -47,10 +48,10 @@ module Devops
end end
def delete id def delete id
s = get_server_by_key(id, parser.instance_key) server = get_server_by_key(id, parser.instance_key)
### Authorization Devops::Db.connector.check_project_auth server.project, server.deploy_env, parser.current_user
Devops::Db.connector.check_project_auth s.project, s.deploy_env, parser.current_user jid = Worker.start_async(DeleteServerWorker, 'server_id' => id)
Devops::Executor::ServerExecutor.new(s, "").delete_server [jid]
end end
def create_server_stream out def create_server_stream out

View File

@ -127,8 +127,7 @@ module Devops
# 200 - Deleted # 200 - Deleted
hash["DELETE"] = lambda {|id| hash["DELETE"] = lambda {|id|
check_privileges("server", "w") check_privileges("server", "w")
info, r = Devops::API2_0::Handler::Server.new(request).delete(id) json Devops::API2_0::Handler::Server.new(request).delete(id)
create_response(info, r)
} }
app.multi_routes "/server/:id", {:headers => [:accept, :content_type]}, hash app.multi_routes "/server/:id", {:headers => [:accept, :content_type]}, hash

View File

@ -11,6 +11,7 @@ module Devops
STACK_TYPE = 5 STACK_TYPE = 5
DEPLOY_STACK_TYPE = 6 DEPLOY_STACK_TYPE = 6
DELETE_SERVER_TYPE = 7 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 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 Devops
module Executor module Executor
@ -9,7 +9,7 @@ module Devops
def schedule_expiration! def schedule_expiration!
return unless @expires 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 end
def interval_in_seconds def interval_in_seconds

View File

@ -436,23 +436,25 @@ module Devops
unbootstrap unbootstrap
end end
mongo.server_delete @server.id mongo.server_delete @server.id
msg = "Static server '#{@server.id}' is removed" puts_and_flush "Static server '#{@server.id}' is removed"
DevopsLogger.logger.info msg return 0
return msg, nil
end 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 provider = @server.provider_instance
begin begin
r[:server] = provider.delete_server @server puts_and_flush provider.delete_server @server
rescue Fog::Compute::OpenStack::NotFound, Fog::Compute::AWS::NotFound rescue Fog::Compute::OpenStack::NotFound, Fog::Compute::AWS::NotFound
r[:server] = "Server with id '#{@server.id}' not found in '#{provider.name}' servers" puts_and_flush "Server with id '#{@server.id}' not found among '#{provider.name}' servers"
DevopsLogger.logger.warn r[:server]
end end
mongo.server_delete @server.id mongo.server_delete @server.id
info = "Server '#{@server.id}' with name '#{@server.chef_node_name}' for project '#{@server.project}-#{@server.deploy_env}' is removed" puts_and_flush "Server '#{@server.id}' with name '#{@server.chef_node_name}' for project '#{@server.project}-#{@server.deploy_env}' is removed."
DevopsLogger.logger.info info 0
r.each{|key, log| DevopsLogger.logger.info("#{key} - #{log}")}
return info, r
end end
def roll_back def roll_back
@ -497,6 +499,11 @@ module Devops
private private
def puts_and_flush(message)
@out.puts message
@out.flush
end
def schedule_expiration def schedule_expiration
if @deploy_env.expires if @deploy_env.expires
@out << "Planning expiration in #{@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 describe '#schedule_expiration!' do
it 'schedules server deleting at given time' 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! described_class.new('2m', server).schedule_expiration!
end end
it "doesn't schedule job if expires is nil" do 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! described_class.new(nil, server).schedule_expiration!
end end
end end

View File

@ -139,14 +139,14 @@ RSpec.describe Devops::Executor::ServerExecutor, type: :executor, stubbed_connec
it 'schedules expiration for server' do it 'schedules expiration for server' do
deploy_env.expires = '2m' deploy_env.expires = '2m'
allow(DeleteServerWorker).to receive(:perform_in) allow(DeleteExpiredServerWorker).to receive(:perform_in)
expect(DeleteServerWorker).to receive(:perform_in).with(120, {server_chef_node_name: 'node_name'}) expect(DeleteExpiredServerWorker).to receive(:perform_in).with(120, {server_chef_node_name: 'node_name'})
create_server create_server
end end
it "doesn't schedule expiration if deploy_env.expires is nil" do it "doesn't schedule expiration if deploy_env.expires is nil" do
deploy_env.expires = nil deploy_env.expires = nil
expect(DeleteServerWorker).not_to receive(:perform_in) expect(DeleteExpiredServerWorker).not_to receive(:perform_in)
create_server create_server
end end
@ -660,9 +660,8 @@ RSpec.describe Devops::Executor::ServerExecutor, type: :executor, stubbed_connec
delete_server delete_server
end end
it 'returns message and nil' do it 'returns 0' do
expect(delete_server.first).to be_a(String) expect(delete_server).to eq 0
expect(delete_server.last).to be nil
end end
it "doesn't try to remove it from cloud" do 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 delete_server
end end
it 'returns message and hash with :chef_node, :chef_client and :server keys' do it 'returns 0' do
expect(delete_server.first).to be_a(String) expect(delete_server).to eq 0
expect(delete_server.last).to be_a(Hash).and include(:chef_client, :chef_node, :server)
end end
end 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

@ -2,18 +2,20 @@ require "db/mongo/models/server"
require "db/mongo/models/report" require "db/mongo/models/report"
require "lib/executors/server_executor" require "lib/executors/server_executor"
require "workers/worker" require "workers/worker"
require 'byebug'
class DeleteServerWorker < Worker class DeleteServerWorker < Worker
# options should contain 'server_id'
def perform(options) def perform(options)
chef_node_name = options.fetch('server_chef_node_name') server_id = options.fetch('server_id')
puts "Expire server '#{chef_node_name}'."
call() do |out, file| call() do |out, file|
server = mongo.server_by_chef_node_name(chef_node_name) out.puts "Deleting server with id #{server_id}" and out.flush
report = save_report(file, server) @server = mongo.server_by_instance_id(server_id)
report = save_report(file)
e = Devops::Executor::ServerExecutor.new(server, out) e = Devops::Executor::ServerExecutor.new(@server, out)
e.report = report e.report = report
e.delete_server e.delete_server
end end
@ -21,13 +23,13 @@ class DeleteServerWorker < Worker
private private
def save_report(file, server) def save_report(file)
report = Devops::Model::Report.new( report = Devops::Model::Report.new(
"file" => file, "file" => file,
"_id" => jid, "_id" => jid,
"created_by" => 'SYSTEM', "created_by" => 'SYSTEM',
"project" => server.project, "project" => @server.project,
"deploy_env" => server.deploy_env, "deploy_env" => @server.deploy_env,
"type" => Devops::Model::Report::DELETE_SERVER_TYPE "type" => Devops::Model::Report::DELETE_SERVER_TYPE
) )
mongo.save_report(report) 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, "bootstrap_worker")
require File.join(root, "project_test_worker") require File.join(root, "project_test_worker")
require File.join(root, "stack_bootstrap_worker") require File.join(root, "stack_bootstrap_worker")
require File.join(root, "delete_server_worker")
require File.join(root, "delete_expired_server_worker")
config = {} config = {}
#require File.join(root, "../proxy") #require File.join(root, "../proxy")