104 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			104 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| require "commands/knife_commands"
 | |
| require "routes/v2.0/base_routes"
 | |
| require "providers/provider_factory"
 | |
| require "commands/deploy"
 | |
| require "commands/status"
 | |
| 
 | |
| module Version2_0
 | |
|   class DeployRoutes < BaseRoutes
 | |
| 
 | |
|     include DeployCommands
 | |
|     include StatusCommands
 | |
| 
 | |
|     def initialize wrapper
 | |
|       super wrapper
 | |
|       puts "Deploy routes initialized"
 | |
|     end
 | |
| 
 | |
|     after "/deploy" do
 | |
|       statistic
 | |
|     end
 | |
| 
 | |
|     # Run chef-client on reserved server
 | |
|     #
 | |
|     # * *Request*
 | |
|     #   - method : POST
 | |
|     #   - headers :
 | |
|     #     - Content-Type: application/json
 | |
|     #   - body :
 | |
|     #     {
 | |
|     #       "names": [], -> array of servers names to run chef-client
 | |
|     #       "tags": []   -> array of tags to apply on each server before running chef-client
 | |
|     #     }
 | |
|     #
 | |
|     # * *Returns* : text stream
 | |
|     post "/deploy" do
 | |
|       check_headers :content_type
 | |
|       check_privileges("server", "w")
 | |
|       r = create_object_from_json_body
 | |
|       names = check_array(r["names"], "Parameter 'names' should be a not empty array of strings")
 | |
|       tags = check_array(r["tags"], "Parameter 'tags' should be an array of strings", String, true) || []
 | |
| 
 | |
|       servers = BaseRoutes.mongo.servers_by_names(names)
 | |
|       servers.delete_if{|s| s.reserved_by.nil?}
 | |
|       halt(404, "No reserved servers found for names '#{names.join("', '")}'") if servers.empty?
 | |
|       keys = {}
 | |
|       servers.sort_by!{|s| names.index(s.chef_node_name)}
 | |
|       stream() do |out|
 | |
|         status = []
 | |
|         servers.each do |s|
 | |
|           begin
 | |
| 
 | |
|             begin
 | |
|               BaseRoutes.mongo.check_project_auth s.project, s.deploy_env, request.env['REMOTE_USER']
 | |
|             rescue InvalidPrivileges, RecordNotFound  => e
 | |
|               out << e.message + "\n"
 | |
|               status.push 2
 | |
|               next
 | |
|             end
 | |
| 
 | |
|             old_tags_str = nil
 | |
|             new_tags_str = nil
 | |
|             unless tags.empty?
 | |
|               old_tags_str = KnifeCommands.tags_list(s.chef_node_name).join(" ")
 | |
|               out << "Server tags: #{old_tags_str}\n"
 | |
|               KnifeCommands.tags_delete(s.chef_node_name, old_tags_str)
 | |
| 
 | |
|               new_tags_str = tags.join(" ")
 | |
|               out << "Server new tags: #{new_tags_str}\n"
 | |
|               cmd = KnifeCommands.tags_create(s.chef_node_name, new_tags_str)
 | |
|               unless cmd[1]
 | |
|                 m = "Error: Cannot add tags '#{new_tags_str}' to server '#{s.chef_node_name}'"
 | |
|                 logger.error(m)
 | |
|                 out << m + "\n"
 | |
|                 status.push 3
 | |
|                 next
 | |
|               end
 | |
|               logger.info("Set tags for '#{s.chef_node_name}': #{new_tags_str}")
 | |
|             end
 | |
| 
 | |
|             unless keys.key? s.key
 | |
|               k = BaseRoutes.mongo.key s.key
 | |
|               keys[s.key] = k.path
 | |
|             end
 | |
|             status.push(deploy_server out, s, keys[s.key])
 | |
| 
 | |
|             unless tags.empty?
 | |
|               out << "Restore tags\n"
 | |
|               cmd = KnifeCommands.tags_delete(s.chef_node_name, new_tags_str)
 | |
|               logger.info("Deleted tags for #{s.chef_node_name}: #{new_tags_str}")
 | |
|               cmd = KnifeCommands.tags_create(s.chef_node_name, old_tags_str)
 | |
|               logger.info("Set tags for #{s.chef_node_name}: #{old_tags_str}")
 | |
|             end
 | |
|             out << create_status(status)
 | |
|           rescue IOError => e
 | |
|             logger.error e.message
 | |
|             break
 | |
|           end
 | |
|         end
 | |
|       end
 | |
|     end
 | |
| 
 | |
|   end
 | |
| end
 | 
