66 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
		
		
			
		
	
	
			66 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
|   | require 'db/mongo/models/stack_template/stack_template_factory' | ||
|  | require 'app/api3/parsers/stack_template' | ||
|  | require_relative "request_handler" | ||
|  | require 'exceptions/conflict_exception' | ||
|  | 
 | ||
|  | module Devops | ||
|  |   module API3 | ||
|  |     module Handler | ||
|  |       class StackTemplate < RequestHandler | ||
|  | 
 | ||
|  |         set_parser Devops::API3::Parser::StackTemplateParser | ||
|  | 
 | ||
|  |         def stack_templates | ||
|  |           # we just need to build json from attributes hash, so there is no need | ||
|  |           # to build appropriate (not Base) class | ||
|  |           Model::StackTemplateBase.all | ||
|  |         end | ||
|  | 
 | ||
|  |         def stack_templates_for_provider provider | ||
|  |           Model::StackTemplateBase.where(provider: provider) | ||
|  |         end | ||
|  | 
 | ||
|  |         def create_stack_template provider | ||
|  |           template_model = Model::StackTemplateFactory.create(provider, parser.create) | ||
|  |           template_model.owner = parser.current_user | ||
|  |           template_model.save | ||
|  |           template_model | ||
|  |         end | ||
|  | 
 | ||
|  |         def get_stack_template id | ||
|  |           Model::StackTemplateBase.find(id) | ||
|  |         end | ||
|  | 
 | ||
|  |         def delete_stack_template id | ||
|  |           envs_with_this_template = envs_using_stack_template(id) | ||
|  | 
 | ||
|  |           if envs_with_this_template.empty? | ||
|  |             Devops::Model::StackTemplateBase.find(id).delete | ||
|  |           else | ||
|  |             raise Exception::ConflictError.new("Stack template '#{id}' is already in use in #{envs_with_this_template.map{|project, envs| "#{project}: #{envs.join(', ')}"}.join('; ')}") | ||
|  |           end | ||
|  |         end | ||
|  | 
 | ||
|  |         private | ||
|  | 
 | ||
|  |         # returns: | ||
|  |         # { "project" => ["environment"] } | ||
|  |         def envs_using_stack_template(stack_template_id) | ||
|  |           Devops::Model::Project.all.inject({}) do |usages, project| | ||
|  |             envs_with_this_template = project.environments.select do |env| | ||
|  |               stack_categories = env.categories.select {|t| t.provider.type == Model::CategoryProvider::STACK_TYPE} | ||
|  |               used_templates = stack_categories.map {|c| c.provider.stack_template} | ||
|  |               used_templates.include?(stack_template_id) | ||
|  |             end | ||
|  |             next usages if envs_with_this_template.empty? | ||
|  | 
 | ||
|  |             usages[project.id] = envs_with_this_template.map(&:id) | ||
|  |             usages | ||
|  |           end | ||
|  |         end | ||
|  | 
 | ||
|  |       end | ||
|  |     end | ||
|  |   end | ||
|  | end |