fluke/devops-service/db/mongo/models/stack/stack_base.rb
Tim Lianov 03dc3d8d99 v3
2018-04-04 22:44:39 +03:00

106 lines
3.0 KiB
Ruby

require "db/mongo/models/model_with_provider"
require "db/mongo/models/stack_template/stack_template_factory"
require "providers/exceptions/name_conflict"
require "db/validators/run_list_array"
module Devops
module Model
class StackBase
include ::Mongoid::Document
include ::Mongoid::Timestamps::Created
include ::ActiveModel::Validations
store_in collection: "stacks"
include ModelWithProviderAccount
field :_id, as: :id, overwrite: true, type: String
field :name, type: String
field :project, type: String
field :environment, type: String
field :category, type: String
field :stack_template, type: String
field :parameters, type: Hash, default: {}
field :owner, type: String
field :run_list, type: Array, default: []
field :stack_status, type: String
field :persisting_is_locked, type: Boolean
field :tags, type: Hash, default: {}
attr_accessor :events
validates :id, :project, :environment, :category, :stack_template, :owner, presence: true
validates :id, uniqueness: true, on: :create
validates :name, presence: true, allow_nil: true
validates :run_list, runListArray: {allow_nil: true}
def to_hash
attributes.tap { |hash| hash['id'] = hash.delete('_id') }
end
def create_stack_in_cloud! out
begin
provider_instance.create_stack(self, out)
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_status_and_events!
self.stack_status = provider_instance.stack_details(self)[:stack_status]
self.events = provider_instance.stack_events(self)
rescue Fog::AWS::CloudFormation::NotFound
self.stack_status = 'NOT_FOUND'
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_template_model
Devops::Model::StackTemplateFactory.get_class(provider).find(stack_template)
end
def lock_persisting!
update_attribute :persisting_is_locked, true
end
def unlock_persisting!
update_attribute :persisting_is_locked, false
end
def account_instance
@account_instance ||= Devops::Model::AwsProviderAccount.find(provider_account)
end
class << self
# attrs should include:
# - id (String)
# - environment (String)
# - stack_template (String)
# - provider (String)
# - provider_account (String)
def create(attrs, out)
model = new(attrs)
model.create_stack_in_cloud!(out)
model.sync_status_and_events!
model
end
end
end
end
end