| 
									
										
										
										
											2016-01-31 17:52:11 +03:00
										 |  |  | 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 | 
					
						
							| 
									
										
										
										
											2016-03-02 16:00:20 +03:00
										 |  |  |   def persist_stack_server(server_info) | 
					
						
							| 
									
										
										
										
											2016-01-31 17:52:11 +03:00
										 |  |  |     server_attrs = { | 
					
						
							| 
									
										
										
										
											2016-03-02 16:00:20 +03:00
										 |  |  |       '_id' => server_info['id'], | 
					
						
							|  |  |  |       'chef_node_name' => get_name_builder(server_info).build_node_name!(incrementers_values), | 
					
						
							| 
									
										
										
										
											2016-01-31 17:52:11 +03:00
										 |  |  |       'created_by' => stack.owner, | 
					
						
							|  |  |  |       'deploy_env' => @deploy_env.identifier, | 
					
						
							| 
									
										
										
										
											2016-03-02 16:00:20 +03:00
										 |  |  |       'key' => server_info['key_name'] || @provider.ssh_key, | 
					
						
							| 
									
										
										
										
											2016-01-31 17:52:11 +03:00
										 |  |  |       'project' => @project.id, | 
					
						
							| 
									
										
										
										
											2016-03-09 17:21:46 +03:00
										 |  |  |       'provider' => @stack.provider, | 
					
						
							|  |  |  |       'provider_account' => @stack.provider_account, | 
					
						
							| 
									
										
										
										
											2016-01-31 17:52:11 +03:00
										 |  |  |       'remote_user' => mongo.image(@deploy_env.image).remote_user, | 
					
						
							| 
									
										
										
										
											2016-03-02 16:00:20 +03:00
										 |  |  |       'private_ip' => server_info['private_ip'], | 
					
						
							|  |  |  |       'public_ip' => server_info['public_ip'], | 
					
						
							| 
									
										
										
										
											2016-01-31 17:52:11 +03:00
										 |  |  |       'run_list' => stack.run_list || [], | 
					
						
							|  |  |  |       'stack' => stack.name | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     server = ::Devops::Model::Server.new(server_attrs) | 
					
						
							|  |  |  |     mongo.server_insert(server) | 
					
						
							|  |  |  |     server | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-02 16:00:20 +03:00
										 |  |  |   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 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-31 17:52:11 +03:00
										 |  |  |   def mongo | 
					
						
							|  |  |  |     Devops::Db.connector | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end |