82 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			82 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| 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 | 
