| 
									
										
										
										
											2015-02-12 13:01:05 +03:00
										 |  |  | require 'tempfile' | 
					
						
							|  |  |  | require 'securerandom' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class StackTemplateBase < MongoModel | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   attr_accessor :id, :template_url, :template_json, :provider | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   # Few words about template_url: | 
					
						
							|  |  |  |   # In Amazon Cloudformation the template file must be stored on an Amazon S3 bucket, | 
					
						
							|  |  |  |   # but for Openstack stacks it isn't neccessary (your may use local file). | 
					
						
							|  |  |  |   # I decided to enforce template_url strategy using in openstack to reach more common | 
					
						
							|  |  |  |   # interface between different providers' stack templates. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   types id: {type: String, empty: false}, | 
					
						
							|  |  |  |     provider: {type: String, empty: false}, | 
					
						
							|  |  |  |     template_json: {type: String, empty: false}, | 
					
						
							|  |  |  |     template_url: {type: String, empty: false} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def initialize(attrs) | 
					
						
							|  |  |  |     self.id = attrs['id'] | 
					
						
							|  |  |  |     self.template_json = attrs['template_json'].to_s | 
					
						
							|  |  |  |     self.template_url = attrs['template_url'] | 
					
						
							|  |  |  |     self.provider = attrs['provider'] | 
					
						
							|  |  |  |     self | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def to_hash_without_id | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       provider: provider, | 
					
						
							|  |  |  |       template_json: template_json, | 
					
						
							|  |  |  |       template_url: template_url | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   # do not forget to destroy template files on template destroying | 
					
						
							|  |  |  |   def delete_template_file_from_storage | 
					
						
							|  |  |  |     raise 'Override me' | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   # attrs should include: | 
					
						
							|  |  |  |   # - id (String) | 
					
						
							|  |  |  |   # - provider (String) | 
					
						
							|  |  |  |   # - template_json (String) | 
					
						
							|  |  |  |   def self.create(attrs) | 
					
						
							|  |  |  |     json = attrs['template_json'] | 
					
						
							|  |  |  |     attrs['template_url'] = generate_template_file_and_upload_to_storage(attrs['id'], json) | 
					
						
							|  |  |  |     new(attrs) | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-18 11:00:24 +03:00
										 |  |  |   def self.build_from_bson(attrs) | 
					
						
							| 
									
										
										
										
											2015-02-12 13:01:05 +03:00
										 |  |  |     attrs['id'] = attrs["_id"] | 
					
						
							|  |  |  |     self.new(attrs) | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   class << self | 
					
						
							|  |  |  |     private | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def generate_template_file_and_upload_to_storage(id, json) | 
					
						
							|  |  |  |       tempfile = Tempfile.new('foo') | 
					
						
							|  |  |  |       tempfile.write(json) | 
					
						
							|  |  |  |       secure_filename = "#{id}-#{SecureRandom.hex}.template" | 
					
						
							|  |  |  |       upload_file_to_storage(secure_filename, tempfile.path) | 
					
						
							|  |  |  |     ensure | 
					
						
							|  |  |  |       tempfile.close | 
					
						
							|  |  |  |       tempfile.unlink | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def upload_file_to_storage(filename, file_path) | 
					
						
							|  |  |  |       raise 'Override me' | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end |