require 'workers/stack_bootstrap/chef_node_name_builder' 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 syncing stack servers with CID' stack_servers_with_priority = {} stack_servers_info.each do |priority, info_array| stack_servers_with_priority[priority] = info_array.map do |info_hash| out.puts "Instance '#{info_hash["id"]}' has been launched with stack." persist_stack_server(info_hash) end end puts_and_flush "Stack servers have been synced with CID" 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 # returns: {priority_as_integer => array_of_sersvers_info} def stack_servers_info stack_servers = @provider.stack_servers(stack) stack_servers.each do |info| info['tags']['cid:priority'] = info['tags']['cid:priority'].to_i end stack_servers.group_by{|info| info['tags']['cid:priority']} end # 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' => @provider.name, '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