fluke/devops-service/lib/executors/stack_executor.rb

98 lines
3.0 KiB
Ruby
Raw Normal View History

2016-03-30 12:05:59 +03:00
require "db/mongo/models/stack/stack_factory"
require "lib/puts_and_flush"
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]
2018-04-04 22:44:39 +03:00
self.just_persisted_by_priority = {}
@current_user = options.fetch(:current_user)
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)
2018-04-04 22:44:39 +03:00
@stack.save
2016-03-30 12:05:59 +03:00
end
2016-04-04 13:17:07 +03:00
def wait_till_stack_is_created
2018-04-04 22:44:39 +03:00
wait_result = waiter.wait
stack.unlock_persisting!
wait_result.ok?
2016-04-04 13:17:07 +03:00
end
def persist_new_servers
2018-04-04 22:44:39 +03:00
reload_stack
raise 'It seems that stack is synchronizing at the moment' if stack.persisting_is_locked
begin
stack.lock_persisting!
fetcher.new_servers_by_priorities.each do |priority, provider_infos|
servers = provider_infos.map {|info| persister.persist(info) }
just_persisted_by_priority[priority] = servers
end
just_persisted_by_priority.values.flatten.each do |server|
puts_and_flush "\n\nPersisted server #{server.id}: #{JSON.pretty_generate(server.to_hash)}"
end
ensure
stack.unlock_persisting!
2016-04-04 13:17:07 +03:00
end
end
def bootstrap_just_persisted(jid)
2018-04-04 22:44:39 +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
2018-04-04 22:44:39 +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
2018-04-04 22:44:39 +03:00
fetcher.stale_servers.each do |server|
server_executor = Devops::Executor::ServerExecutor.new(server, out, @current_user)
server_executor.delete_server
2016-04-04 13:17:07 +03:00
end
2016-03-30 12:05:59 +03:00
end
def delete_stack
stack.delete_stack_in_cloud!
2018-04-04 22:44:39 +03:00
# mongo.stack_servers_delete(stack.name)
# mongo.stack_delete(stack.id)
Devops::Model::Server.delete_stack_servers(stack.id)
stack.delete
2016-03-30 12:05:59 +03:00
end
private
2018-04-04 22:44:39 +03:00
attr_accessor :just_persisted_by_priority
2016-03-30 12:05:59 +03:00
2018-04-04 22:44:39 +03:00
def reload_stack
@stack = Model::StackAws.find(@stack.id)
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