fluke/devops-service/workers/stack_bootstrap/stack_servers_persister.rb
2016-03-28 10:37:05 +03:00

76 lines
2.3 KiB
Ruby

require 'workers/stack_bootstrap/chef_node_name_builder'
# Fetches info about stack servers from provider and then persist them in mongo.
class StackServersPersister
include PutsAndFlush
attr_reader :stack, :out
def initialize(stack, out)
@stack, @out = stack, out
@project = mongo.project(stack.project)
@deploy_env = @project.deploy_env(stack.deploy_env)
@provider = stack.provider_instance
end
# returns: { priority_as_integer => [Servers] }
def persist
puts_and_flush 'Start saving stack servers into CID database.'
stack_servers_with_priority = {}
@provider.stack_servers(stack).each do |provider_info|
server = persist_stack_server(provider_info)
priority = provider_info['tags']['cid:priority'].to_i
stack_servers_with_priority[priority] ||= []
stack_servers_with_priority[priority] << server
end
puts_and_flush "Stack servers have been saved."
stack_servers_with_priority.each do |priority, servers|
out.puts "Servers with priority '#{priority}': #{servers.map(&:id).join(", ")}"
end
out.flush
stack_servers_with_priority
end
private
# takes a hash, returns Server model
def persist_stack_server(server_info)
server_attrs = {
'_id' => server_info['id'],
'chef_node_name' => get_name_builder(server_info).build_node_name!(incrementers_values),
'created_by' => stack.owner,
'deploy_env' => @deploy_env.identifier,
'key' => server_info['key_name'] || @provider.ssh_key,
'project' => @project.id,
'provider' => @stack.provider,
'provider_account' => @stack.provider_account,
'remote_user' => mongo.image(@deploy_env.image).remote_user,
'private_ip' => server_info['private_ip'],
'public_ip' => server_info['public_ip'],
'run_list' => stack.run_list || [],
'stack' => stack.name
}
server = ::Devops::Model::Server.new(server_attrs)
mongo.server_insert(server)
server
end
def get_name_builder(server_info)
ChefNodeNameBuilder.new(
provider_server_info: server_info,
project_id: @project.id,
env_id: @deploy_env.identifier,
owner: stack.owner
)
end
def incrementers_values
@incrementers_values ||= {}
end
def mongo
Devops::Db.connector
end
end