69 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
		
		
			
		
	
	
			69 lines
		
	
	
		
			2.1 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(info_hash) | ||
|  |     server_attrs = { | ||
|  |       '_id' => info_hash['id'], | ||
|  |       'chef_node_name' => ChefNodeNameBuilder.new(info_hash, @project, @deploy_env).build_node_name, | ||
|  |       'created_by' => stack.owner, | ||
|  |       'deploy_env' => @deploy_env.identifier, | ||
|  |       'key' => info_hash['key_name'] || @provider.ssh_key, | ||
|  |       'project' => @project.id, | ||
|  |       'provider' => @provider.name, | ||
|  |       'remote_user' => mongo.image(@deploy_env.image).remote_user, | ||
|  |       'private_ip' => info_hash['private_ip'], | ||
|  |       'public_ip' => info_hash['public_ip'], | ||
|  |       'run_list' => stack.run_list || [], | ||
|  |       'stack' => stack.name | ||
|  |     } | ||
|  | 
 | ||
|  |     server = ::Devops::Model::Server.new(server_attrs) | ||
|  |     mongo.server_insert(server) | ||
|  |     server | ||
|  |   end | ||
|  | 
 | ||
|  |   def mongo | ||
|  |     Devops::Db.connector | ||
|  |   end | ||
|  | end |