2016-03-30 12:05:59 +03:00
|
|
|
require "db/mongo/models/stack/stack_factory"
|
|
|
|
|
require "lib/puts_and_flush"
|
2016-03-30 12:57:24 +03:00
|
|
|
module Devops; module Executor; class StackExecutor; end; end; end # predeclare for visibility
|
2016-03-30 12:05:59 +03:00
|
|
|
require_relative "stack_executor/stack_creation_waiter"
|
|
|
|
|
require_relative "stack_executor/stack_servers_persister"
|
|
|
|
|
require_relative "stack_executor/prioritized_groups_bootstrapper"
|
2016-04-04 13:17:07 +03:00
|
|
|
require_relative "stack_executor/stack_servers_fetcher"
|
2016-03-30 12:05:59 +03:00
|
|
|
|
|
|
|
|
module Devops
|
|
|
|
|
module Executor
|
|
|
|
|
class StackExecutor
|
|
|
|
|
include PutsAndFlush
|
|
|
|
|
attr_reader :out, :stack
|
|
|
|
|
|
|
|
|
|
def initialize(options)
|
|
|
|
|
@out = options.fetch(:out)
|
|
|
|
|
@stack = options[:stack]
|
2016-04-15 15:51:52 +03:00
|
|
|
@just_persisted_by_priority = {}
|
2016-03-30 12:05:59 +03:00
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def create_stack(stack_attrs)
|
2016-04-04 13:17:07 +03:00
|
|
|
stack_attrs.merge!('persisting_is_locked' => true)
|
2016-03-30 12:05:59 +03:00
|
|
|
@stack = Devops::Model::StackFactory.create(stack_attrs["provider"], stack_attrs, out)
|
|
|
|
|
mongo.stack_insert(@stack)
|
|
|
|
|
end
|
|
|
|
|
|
2016-04-04 13:17:07 +03:00
|
|
|
def wait_till_stack_is_created
|
2016-04-15 17:05:50 +03:00
|
|
|
waiter.wait.ok?
|
2016-04-04 13:17:07 +03:00
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def persist_new_servers
|
2016-04-15 15:51:52 +03:00
|
|
|
fetcher.reset_states
|
|
|
|
|
servers_to_persist = fetcher.servers_to_persist
|
|
|
|
|
if servers_to_persist.any?
|
|
|
|
|
out.puts 'Servers to persist:'
|
|
|
|
|
servers_to_persist.each { |info| out.puts JSON.pretty_generate(info) }
|
|
|
|
|
puts_and_flush "\n\nPersisting new servers:"
|
|
|
|
|
else
|
|
|
|
|
puts_and_flush 'There are no servers to persist.'
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
fetcher.new_servers_by_priorities.each do |priority, provider_infos|
|
|
|
|
|
servers = provider_infos.map {|info| persister.persist(info) }
|
|
|
|
|
@just_persisted_by_priority[priority] = servers
|
2016-04-04 13:17:07 +03:00
|
|
|
end
|
2016-04-15 15:51:52 +03:00
|
|
|
puts_and_flush "New servers have been persisted"
|
2016-04-04 13:17:07 +03:00
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def bootstrap_just_persisted(jid)
|
2016-04-15 15:51:52 +03:00
|
|
|
puts_and_flush "Bootstrapping just persisted servers" if @just_persisted_by_priority.values.flatten.any?
|
|
|
|
|
@just_persisted_by_priority.each do |priority, servers|
|
2016-04-04 13:17:07 +03:00
|
|
|
puts_and_flush "Servers with priority '#{priority}': #{servers.map(&:id).join(", ")}"
|
|
|
|
|
end
|
2016-04-15 15:51:52 +03:00
|
|
|
PrioritizedGroupsBootstrapper.new(out, jid, @just_persisted_by_priority).bootstrap_servers_by_priority
|
2016-03-30 12:05:59 +03:00
|
|
|
end
|
|
|
|
|
|
2016-04-04 13:17:07 +03:00
|
|
|
def delete_stale_servers
|
2016-04-15 15:51:52 +03:00
|
|
|
fetcher.reset_states
|
|
|
|
|
servers_to_delete = fetcher.stale_servers
|
|
|
|
|
if servers_to_delete.any?
|
|
|
|
|
out.puts "\nStale servers:"
|
|
|
|
|
servers_to_delete.each { |server| out.puts JSON.pretty_generate(server.to_hash) }
|
|
|
|
|
puts_and_flush 'Deleting stale servers.'
|
|
|
|
|
else
|
|
|
|
|
puts_and_flush "\nThere are no stale servers."
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
servers_to_delete.each do |server|
|
2016-04-13 16:09:25 +03:00
|
|
|
proper_remove_server(server)
|
2016-04-04 13:17:07 +03:00
|
|
|
end
|
2016-03-30 12:05:59 +03:00
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def delete_stack
|
2016-04-13 23:18:17 +03:00
|
|
|
out.puts "Removing stack from cloud"
|
2016-03-30 12:05:59 +03:00
|
|
|
stack.delete_stack_in_cloud!
|
2016-04-13 23:18:17 +03:00
|
|
|
out.puts "Removing stack servers"
|
2016-04-13 16:09:25 +03:00
|
|
|
mongo.stack_servers(@stack.name).each do |server|
|
|
|
|
|
proper_remove_server(server)
|
|
|
|
|
end
|
2016-04-13 23:18:17 +03:00
|
|
|
out.puts "Removing stack from db"
|
2016-03-30 12:05:59 +03:00
|
|
|
mongo.stack_delete(stack.id)
|
2016-04-13 23:18:17 +03:00
|
|
|
out.flush
|
2016-03-30 12:05:59 +03:00
|
|
|
end
|
|
|
|
|
|
|
|
|
|
private
|
|
|
|
|
|
|
|
|
|
def mongo
|
|
|
|
|
Devops::Db.connector
|
|
|
|
|
end
|
|
|
|
|
|
2016-04-13 16:09:25 +03:00
|
|
|
def proper_remove_server(server)
|
|
|
|
|
begin
|
|
|
|
|
e = Devops::Executor::ServerExecutor.new(server, out)
|
|
|
|
|
e.delete_server
|
|
|
|
|
rescue StandardError => e
|
|
|
|
|
puts_and_flush [e.message, e.backtrace].join("\n")
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
2016-04-04 13:17:07 +03:00
|
|
|
def fetcher
|
|
|
|
|
@fetcher ||= StackServersFetcher.new(stack, out)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def persister
|
|
|
|
|
@persister ||= StackServersPersister.new(@stack)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def waiter
|
|
|
|
|
StackCreationWaiter.new(stack, out)
|
|
|
|
|
end
|
|
|
|
|
|
2016-03-30 12:05:59 +03:00
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|