76 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			76 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| 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 | 
