| 
									
										
										
										
											2015-06-18 17:53:03 +03:00
										 |  |  | require 'db/mongo/models/stack_template/stack_template_factory' | 
					
						
							| 
									
										
										
										
											2015-06-17 22:37:08 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | module Devops | 
					
						
							| 
									
										
										
										
											2015-07-15 19:21:23 +03:00
										 |  |  |   module StackPresets | 
					
						
							| 
									
										
										
										
											2015-06-17 22:37:08 +03:00
										 |  |  |     class Base | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       def id | 
					
						
							| 
									
										
										
										
											2016-01-19 18:06:09 +03:00
										 |  |  |         self.class.to_s.underscore_class | 
					
						
							| 
									
										
										
										
											2015-06-17 22:37:08 +03:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       def to_hash | 
					
						
							| 
									
										
										
										
											2015-07-13 20:26:13 +03:00
										 |  |  |         {id: id, template_body: template_body} | 
					
						
							| 
									
										
										
										
											2015-06-17 22:37:08 +03:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-16 16:01:53 +03:00
										 |  |  |       # attrs should include | 
					
						
							|  |  |  |       #   'provider' | 
					
						
							|  |  |  |       #   'stack' | 
					
						
							|  |  |  |       #   'parameters' | 
					
						
							|  |  |  |       #   'project' | 
					
						
							|  |  |  |       #   'deploy_env' | 
					
						
							|  |  |  |       def create_stack_from_preset(attrs) | 
					
						
							|  |  |  |         provider = attrs.fetch('provider') | 
					
						
							| 
									
										
										
										
											2015-07-15 16:25:06 +03:00
										 |  |  |         template_name = find_or_create_stack_template!(provider) | 
					
						
							| 
									
										
										
										
											2015-07-16 16:01:53 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |         stack_attrs = attrs.merge( | 
					
						
							|  |  |  |           'id' => attrs['stack'], | 
					
						
							| 
									
										
										
										
											2015-07-15 16:25:06 +03:00
										 |  |  |           'stack_template' => template_name | 
					
						
							| 
									
										
										
										
											2015-07-16 16:01:53 +03:00
										 |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         Model::StackFactory.create(provider, stack_attrs) | 
					
						
							| 
									
										
										
										
											2015-06-18 17:53:03 +03:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-13 20:26:13 +03:00
										 |  |  |       def template_body | 
					
						
							| 
									
										
										
										
											2015-07-15 19:21:23 +03:00
										 |  |  |         @template_body ||= File.read("lib/stack_presets/#{id}.#{template_file_extension}") | 
					
						
							| 
									
										
										
										
											2015-06-18 17:53:03 +03:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       # some templates may be YAML files | 
					
						
							|  |  |  |       def template_file_extension | 
					
						
							|  |  |  |         :json | 
					
						
							| 
									
										
										
										
											2015-06-17 22:37:08 +03:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-13 20:26:13 +03:00
										 |  |  |       private | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       def find_or_create_stack_template!(provider) | 
					
						
							|  |  |  |         name = stack_template_name(provider) | 
					
						
							|  |  |  |         begin | 
					
						
							| 
									
										
										
										
											2015-07-15 16:25:06 +03:00
										 |  |  |           stack_template = Devops::Api2.settings.mongo.stack_template(name) | 
					
						
							|  |  |  |           update_stack_template(stack_template) if stack_template.template_body != template_body | 
					
						
							| 
									
										
										
										
											2015-07-13 20:26:13 +03:00
										 |  |  |         rescue RecordNotFound | 
					
						
							| 
									
										
										
										
											2015-07-15 16:25:06 +03:00
										 |  |  |           create_stack_template(provider) | 
					
						
							| 
									
										
										
										
											2015-07-13 20:26:13 +03:00
										 |  |  |         end | 
					
						
							| 
									
										
										
										
											2015-07-15 16:25:06 +03:00
										 |  |  |         name | 
					
						
							| 
									
										
										
										
											2015-07-13 20:26:13 +03:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       def stack_template_name(provider) | 
					
						
							|  |  |  |         "#{id}_#{provider}_preset" | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-15 16:25:06 +03:00
										 |  |  |       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 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-17 22:37:08 +03:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end |