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 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 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