| 
									
										
										
										
											2015-08-04 12:36:10 +03:00
										 |  |  | require "db/mongo/models/model_with_provider" | 
					
						
							| 
									
										
										
										
											2015-08-28 17:00:48 +03:00
										 |  |  | require "providers/exceptions/name_conflict" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-06 12:20:30 +03:00
										 |  |  | module Devops | 
					
						
							|  |  |  |   module Model | 
					
						
							|  |  |  |     class StackBase < MongoModel | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-04 12:36:10 +03:00
										 |  |  |       include ModelWithProvider | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-24 21:26:44 +03:00
										 |  |  |       attr_accessor :id, :name, :project, :deploy_env, :stack_template, :parameters, :events, :owner, :run_list, :stack_status | 
					
						
							| 
									
										
										
										
											2015-03-06 12:20:30 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-04 12:43:07 +03:00
										 |  |  |       set_field_validators :id, [::Validators::FieldValidator::NotNil, | 
					
						
							| 
									
										
										
										
											2015-11-03 11:46:54 +03:00
										 |  |  |                                       ::Validators::FieldValidator::FieldType::String, | 
					
						
							| 
									
										
										
										
											2015-12-04 12:43:07 +03:00
										 |  |  |                                       ::Validators::FieldValidator::NotEmpty] | 
					
						
							| 
									
										
										
										
											2015-11-03 11:46:54 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-04 12:43:07 +03:00
										 |  |  |       set_field_validators :provider, [::Validators::FieldValidator::NotNil, | 
					
						
							| 
									
										
										
										
											2015-11-03 11:46:54 +03:00
										 |  |  |                                       ::Validators::FieldValidator::FieldType::String, | 
					
						
							| 
									
										
										
										
											2015-12-04 12:43:07 +03:00
										 |  |  |                                       ::Validators::FieldValidator::NotEmpty] | 
					
						
							| 
									
										
										
										
											2015-11-03 11:46:54 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-04 12:43:07 +03:00
										 |  |  |       set_field_validators :project, [::Validators::FieldValidator::NotNil, | 
					
						
							| 
									
										
										
										
											2015-11-03 11:46:54 +03:00
										 |  |  |                                       ::Validators::FieldValidator::FieldType::String, | 
					
						
							| 
									
										
										
										
											2015-12-04 12:43:07 +03:00
										 |  |  |                                       ::Validators::FieldValidator::NotEmpty] | 
					
						
							| 
									
										
										
										
											2015-11-03 11:46:54 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-04 12:43:07 +03:00
										 |  |  |       set_field_validators :deploy_env, [::Validators::FieldValidator::NotNil, | 
					
						
							| 
									
										
										
										
											2015-11-03 11:46:54 +03:00
										 |  |  |                                       ::Validators::FieldValidator::FieldType::String, | 
					
						
							| 
									
										
										
										
											2015-12-04 12:43:07 +03:00
										 |  |  |                                       ::Validators::FieldValidator::NotEmpty] | 
					
						
							| 
									
										
										
										
											2015-11-03 11:46:54 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-04 12:43:07 +03:00
										 |  |  |       set_field_validators :stack_template, [::Validators::FieldValidator::NotNil, | 
					
						
							| 
									
										
										
										
											2015-11-03 11:46:54 +03:00
										 |  |  |                                       ::Validators::FieldValidator::FieldType::String, | 
					
						
							| 
									
										
										
										
											2015-12-04 12:43:07 +03:00
										 |  |  |                                       ::Validators::FieldValidator::NotEmpty] | 
					
						
							| 
									
										
										
										
											2015-11-03 11:46:54 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-04 12:43:07 +03:00
										 |  |  |       set_field_validators :name, [::Validators::FieldValidator::Nil, | 
					
						
							| 
									
										
										
										
											2015-11-03 11:46:54 +03:00
										 |  |  |                                       ::Validators::FieldValidator::FieldType::String, | 
					
						
							| 
									
										
										
										
											2015-12-04 12:43:07 +03:00
										 |  |  |                                       ::Validators::FieldValidator::NotEmpty] | 
					
						
							| 
									
										
										
										
											2015-11-03 11:46:54 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-04 12:43:07 +03:00
										 |  |  |       set_field_validators :owner, [::Validators::FieldValidator::NotNil, | 
					
						
							| 
									
										
										
										
											2015-11-03 11:46:54 +03:00
										 |  |  |                                       ::Validators::FieldValidator::FieldType::String, | 
					
						
							| 
									
										
										
										
											2015-12-04 12:43:07 +03:00
										 |  |  |                                       ::Validators::FieldValidator::NotEmpty] | 
					
						
							| 
									
										
										
										
											2015-11-03 11:46:54 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-04 12:43:07 +03:00
										 |  |  |       set_field_validators :run_list, [::Validators::FieldValidator::NotNil, | 
					
						
							| 
									
										
										
										
											2015-11-03 11:46:54 +03:00
										 |  |  |                                       ::Validators::FieldValidator::FieldType::Array, | 
					
						
							| 
									
										
										
										
											2015-12-04 12:43:07 +03:00
										 |  |  |                                       ::Validators::FieldValidator::RunList] | 
					
						
							| 
									
										
										
										
											2015-11-03 11:46:54 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-26 14:27:14 +03:00
										 |  |  |       set_field_validators :tags, [::Validators::FieldValidator::Nil, | 
					
						
							|  |  |  |                                       ::Validators::FieldValidator::FieldType::Hash] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-06 12:20:30 +03:00
										 |  |  |       def initialize attrs={} | 
					
						
							| 
									
										
										
										
											2015-10-27 12:01:21 +03:00
										 |  |  |         self.set_provider(attrs) | 
					
						
							| 
									
										
										
										
											2015-03-06 12:20:30 +03:00
										 |  |  |         self.id = attrs['id'] | 
					
						
							|  |  |  |         self.project = attrs['project'] | 
					
						
							|  |  |  |         self.deploy_env = attrs['deploy_env'] | 
					
						
							|  |  |  |         self.stack_template = attrs['stack_template'] | 
					
						
							| 
									
										
										
										
											2015-08-12 13:32:26 +03:00
										 |  |  |         self.name = attrs['name'] | 
					
						
							| 
									
										
										
										
											2015-04-16 17:54:40 +03:00
										 |  |  |         self.parameters = attrs['parameters'] | 
					
						
							| 
									
										
										
										
											2015-07-30 02:14:45 +03:00
										 |  |  |         self.owner = attrs['owner'] | 
					
						
							| 
									
										
										
										
											2015-08-14 17:48:07 +03:00
										 |  |  |         self.run_list = attrs['run_list'] || [] | 
					
						
							| 
									
										
										
										
											2016-02-24 21:26:44 +03:00
										 |  |  |         self.stack_status = attrs['stack_status'] | 
					
						
							| 
									
										
										
										
											2016-02-26 14:27:14 +03:00
										 |  |  |         self.tags = attrs['tags'] || {} | 
					
						
							| 
									
										
										
										
											2015-03-06 12:20:30 +03:00
										 |  |  |         self | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-03 11:46:54 +03:00
										 |  |  |       # TODO: use string keys | 
					
						
							| 
									
										
										
										
											2015-03-06 12:20:30 +03:00
										 |  |  |       def to_hash_without_id | 
					
						
							|  |  |  |         { | 
					
						
							| 
									
										
										
										
											2015-04-16 17:54:40 +03:00
										 |  |  |           project: project, | 
					
						
							|  |  |  |           deploy_env: deploy_env, | 
					
						
							|  |  |  |           stack_template: stack_template, | 
					
						
							| 
									
										
										
										
											2015-08-12 13:32:26 +03:00
										 |  |  |           name: name, | 
					
						
							| 
									
										
										
										
											2015-07-14 16:51:40 +03:00
										 |  |  |           parameters: parameters, | 
					
						
							| 
									
										
										
										
											2015-07-30 02:14:45 +03:00
										 |  |  |           stack_status: stack_status, | 
					
						
							| 
									
										
										
										
											2015-11-03 11:46:54 +03:00
										 |  |  |           owner: owner, | 
					
						
							| 
									
										
										
										
											2016-02-26 14:27:14 +03:00
										 |  |  |           run_list: run_list, | 
					
						
							|  |  |  |           tags: tags | 
					
						
							| 
									
										
										
										
											2015-10-27 12:01:21 +03:00
										 |  |  |         }.merge(provider_hash) | 
					
						
							| 
									
										
										
										
											2015-03-06 12:20:30 +03:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-28 17:00:48 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-14 17:48:07 +03:00
										 |  |  |       def create_stack_in_cloud! out | 
					
						
							| 
									
										
										
										
											2015-07-14 16:51:40 +03:00
										 |  |  |         begin | 
					
						
							| 
									
										
										
										
											2015-08-14 17:48:07 +03:00
										 |  |  |           provider_instance.create_stack(self, out) | 
					
						
							| 
									
										
										
										
											2015-07-14 16:51:40 +03:00
										 |  |  |         rescue ProviderErrors::NameConflict | 
					
						
							|  |  |  |           raise InvalidRecord.new "Duplicate key error: stack with name '#{id}' already exists in cloud" | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2015-04-16 17:54:40 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-14 16:51:40 +03:00
										 |  |  |       def delete_stack_in_cloud! | 
					
						
							| 
									
										
										
										
											2015-08-04 12:36:10 +03:00
										 |  |  |         provider_instance.delete_stack(self) | 
					
						
							| 
									
										
										
										
											2015-03-06 12:20:30 +03:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-24 21:26:44 +03:00
										 |  |  |       def sync! | 
					
						
							|  |  |  |         self.stack_status = provider_instance.stack_details(self)[:stack_status] | 
					
						
							| 
									
										
										
										
											2015-11-17 13:23:13 +03:00
										 |  |  |         self.events = provider_instance.stack_events(self) | 
					
						
							| 
									
										
										
										
											2015-07-15 18:37:27 +03:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       def resources | 
					
						
							| 
									
										
										
										
											2015-08-04 12:36:10 +03:00
										 |  |  |         provider_instance.stack_resources(self) | 
					
						
							| 
									
										
										
										
											2015-03-06 12:20:30 +03:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-23 12:54:36 +03:00
										 |  |  |       # resource_id is logical | 
					
						
							| 
									
										
										
										
											2015-07-16 16:01:53 +03:00
										 |  |  |       def resource(resource_id) | 
					
						
							| 
									
										
										
										
											2015-08-04 12:36:10 +03:00
										 |  |  |         provider_instance.stack_resource(self, resource_id) | 
					
						
							| 
									
										
										
										
											2015-07-16 16:01:53 +03:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-30 02:14:45 +03:00
										 |  |  |       def template_body | 
					
						
							| 
									
										
										
										
											2015-12-15 18:56:14 +03:00
										 |  |  |         stack_template_model.template_body | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       def stack_template_model | 
					
						
							|  |  |  |         Devops::Db.connector.stack_template(stack_template) | 
					
						
							| 
									
										
										
										
											2015-07-30 02:14:45 +03:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-14 16:51:40 +03:00
										 |  |  |       class << self | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # attrs should include: | 
					
						
							|  |  |  |         # - id (String) | 
					
						
							|  |  |  |         # - deploy_env (String) | 
					
						
							|  |  |  |         # - stack_template (String) | 
					
						
							| 
									
										
										
										
											2015-10-27 12:01:21 +03:00
										 |  |  |         # - provider (String) | 
					
						
							|  |  |  |         # - provider_account (String) | 
					
						
							| 
									
										
										
										
											2015-08-14 17:48:07 +03:00
										 |  |  |         def create(attrs, out) | 
					
						
							| 
									
										
										
										
											2015-07-14 16:51:40 +03:00
										 |  |  |           model = new(attrs) | 
					
						
							| 
									
										
										
										
											2015-08-14 17:48:07 +03:00
										 |  |  |           model.create_stack_in_cloud!(out) | 
					
						
							| 
									
										
										
										
											2016-02-24 21:26:44 +03:00
										 |  |  |           model.sync! | 
					
						
							| 
									
										
										
										
											2015-07-14 16:51:40 +03:00
										 |  |  |           model | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def build_from_bson(attrs) | 
					
						
							|  |  |  |           attrs['id'] = attrs["_id"] | 
					
						
							|  |  |  |           self.new(attrs) | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2015-04-16 17:54:40 +03:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-06 12:20:30 +03:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2015-02-12 13:01:05 +03:00
										 |  |  |   end | 
					
						
							|  |  |  | end |