111 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			111 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| module Devops
 | |
|   module Model
 | |
|     class StackBase < MongoModel
 | |
| 
 | |
|       attr_accessor :id, :project, :deploy_env, :stack_template,
 | |
|         :cloud_stack_id, :provider, :parameters, :details
 | |
| 
 | |
|       types id: {type: String, empty: false},
 | |
|             provider: {type: String, empty: false},
 | |
|             project: {type: String},
 | |
|             deploy_env: {type: String},
 | |
|             stack_template: {type: String, empty: false},
 | |
|             cloud_stack_id: {type: String, nil: true}
 | |
|             # details: {type: String, nil: true}
 | |
| 
 | |
|       def initialize attrs={}
 | |
|         self.provider = self.class.provider
 | |
| 
 | |
|         self.id = attrs['id']
 | |
|         self.project = attrs['project']
 | |
|         self.deploy_env = attrs['deploy_env']
 | |
|         self.stack_template = attrs['stack_template']
 | |
|         self.cloud_stack_id = attrs['cloud_stack_id']
 | |
|         self.parameters = attrs['parameters']
 | |
|         self.details = attrs['details']
 | |
|         self
 | |
|       end
 | |
| 
 | |
|       def to_hash_without_id
 | |
|         {
 | |
|           provider: provider,
 | |
|           project: project,
 | |
|           deploy_env: deploy_env,
 | |
|           stack_template: stack_template,
 | |
|           cloud_stack_id: cloud_stack_id,
 | |
|           parameters: parameters,
 | |
|           details: details,
 | |
|           stack_status: stack_status
 | |
|         }
 | |
|       end
 | |
| 
 | |
|       def create_stack_in_cloud!
 | |
|         begin
 | |
|           self.cloud_stack_id = provider_class.create_stack(self)
 | |
|         rescue ProviderErrors::NameConflict
 | |
|           raise InvalidRecord.new "Duplicate key error: stack with name '#{id}' already exists in cloud"
 | |
|         end
 | |
|       end
 | |
| 
 | |
|       def delete_stack_in_cloud!
 | |
|         provider_class.delete_stack(self)
 | |
|       end
 | |
| 
 | |
|       def sync_details!
 | |
|         self.details = provider_class.stack_details(self)
 | |
|       end
 | |
| 
 | |
|       def resources
 | |
|         provider_class.stack_resources(self)
 | |
|       end
 | |
| 
 | |
|       def resource(resource_id)
 | |
|         provider_class.stack_resource(self, resource_id)
 | |
|       end
 | |
| 
 | |
|       def template_body
 | |
|         Devops::Api2.settings.mongo.stack_template(stack_template).template_body
 | |
|       end
 | |
| 
 | |
|       def stack_status
 | |
|         raise 'override me'
 | |
|       end
 | |
| 
 | |
|       def stack_statuses
 | |
|         # maybe they differ in different providers, so use method instead of hardcoding
 | |
|         {
 | |
|           in_progress: 'CREATE_IN_PROGRESS',
 | |
|           complete: 'CREATE_COMPLETE'
 | |
|         }
 | |
|       end
 | |
| 
 | |
|       class << self
 | |
|         attr_accessor :provider
 | |
| 
 | |
|         # attrs should include:
 | |
|         # - id (String)
 | |
|         # - deploy_env (String)
 | |
|         # - stack_template (String)
 | |
|         def create(attrs)
 | |
|           model = new(attrs)
 | |
|           model.create_stack_in_cloud!
 | |
|           model.sync_details!
 | |
|           model
 | |
|         end
 | |
| 
 | |
|         def build_from_bson(attrs)
 | |
|           attrs['id'] = attrs["_id"]
 | |
|           self.new(attrs)
 | |
|         end
 | |
|       end
 | |
| 
 | |
|       private
 | |
| 
 | |
|       def provider_class
 | |
|         Provider::ProviderFactory.get(provider)
 | |
|       end
 | |
| 
 | |
|     end
 | |
|   end
 | |
| end
 | 
