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
|