112 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			112 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| require "db/mongo/models/model_with_provider"
 | |
| module Devops
 | |
|   module Model
 | |
|     class StackBase < MongoModel
 | |
| 
 | |
|       include ModelWithProvider
 | |
| 
 | |
|       attr_accessor :id, :project, :deploy_env, :stack_template,
 | |
|         :cloud_stack_id, :parameters, :details, :owner
 | |
| 
 | |
|       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},
 | |
|             owner: {type: String},
 | |
|             :run_list => {:type => Array, :value_type => String, :empty => true, :nil => false}
 | |
|             # details: {type: Hash, nil: true} # Hash type isn't supported yet
 | |
| 
 | |
|       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.owner = attrs['owner']
 | |
|         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,
 | |
|           owner: owner
 | |
|         }
 | |
|       end
 | |
| 
 | |
|       def create_stack_in_cloud!
 | |
|         begin
 | |
|           self.cloud_stack_id = provider_instance.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_instance.delete_stack(self)
 | |
|       end
 | |
| 
 | |
|       def sync_details!
 | |
|         self.details = provider_instance.stack_details(self).attributes
 | |
|       end
 | |
| 
 | |
|       def resources
 | |
|         provider_instance.stack_resources(self)
 | |
|       end
 | |
| 
 | |
|       # resource_id is logical
 | |
|       def resource(resource_id)
 | |
|         provider_instance.stack_resource(self, resource_id)
 | |
|       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
 | |
| 
 | |
|       def template_body
 | |
|         Devops::Db.connector.stack_template(stack_template).template_body
 | |
|       end
 | |
| 
 | |
|       class << self
 | |
| 
 | |
|         # 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
 | |
| 
 | |
|     end
 | |
|   end
 | |
| end
 | 
