require 'lib/string_helper' require 'db/mongo/models/stack_template/stack_template_factory' module Devops module StackPresets class Base def id StringHelper.underscore_class(self.class) end def to_hash {id: id, template_body: template_body} end # attrs should include # 'provider' # 'stack' # 'parameters' # 'project' # 'deploy_env' def create_stack_from_preset(attrs) provider = attrs.fetch('provider') template_name = find_or_create_stack_template!(provider) stack_attrs = attrs.merge( 'id' => attrs['stack'], 'stack_template' => template_name ) Model::StackFactory.create(provider, stack_attrs) end def template_body @template_body ||= File.read("lib/stack_presets/#{id}.#{template_file_extension}") end # some templates may be YAML files def template_file_extension :json end private def find_or_create_stack_template!(provider) name = stack_template_name(provider) begin stack_template = Devops::Api2.settings.mongo.stack_template(name) update_stack_template(stack_template) if stack_template.template_body != template_body rescue RecordNotFound create_stack_template(provider) end name end def stack_template_name(provider) "#{id}_#{provider}_preset" end def create_stack_template(provider) stack_template = Model::StackTemplateFactory.create(provider, { 'id' => stack_template_name(provider), 'provider' => provider, 'template_body' => template_body }) Devops::Api2.settings.mongo.stack_template_insert(stack_template) end def update_stack_template(stack_template) stack_template.template_body = template_body Devops::Api2.settings.mongo.stack_template_update(stack_template) end end end end