fluke/devops-service/db/mongo/models/stack/stack_base.rb

153 lines
5.3 KiB
Ruby
Raw Normal View History

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-04-04 13:17:07 +03:00
attr_accessor :parameters, :events, :stack_status, :persisting_is_locked
attr_accessor :launch_options # {'without_bootstrap' => false, 'skip_rollback' => true}
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={}
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']
self.parameters = attrs['parameters']
2015-07-30 02:14:45 +03:00
self.owner = attrs['owner']
self.run_list = attrs['run_list'] || []
2016-02-26 14:27:14 +03:00
self.tags = attrs['tags'] || {}
2016-02-24 21:26:44 +03:00
self.stack_status = attrs['stack_status']
2016-04-04 13:17:07 +03:00
self.persisting_is_locked = attrs['persisting_is_locked']
self.launch_options = attrs['launch_options'] || {}
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
{
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,
2016-04-04 13:17:07 +03:00
tags: tags,
persisting_is_locked: persisting_is_locked,
launch_options: launch_options
}.merge(provider_hash)
2015-03-06 12:20:30 +03:00
end
2015-08-28 17:00:48 +03:00
def create_stack_in_cloud! out
2015-07-14 16:51:40 +03:00
begin
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-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-04-04 13:17:07 +03:00
def sync_status_and_events!
2016-02-24 21:26:44 +03:00
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)
rescue Fog::AWS::CloudFormation::NotFound
self.stack_status = 'NOT_FOUND'
2015-07-15 18:37:27 +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
2016-04-04 13:17:07 +03:00
def lock_persisting!
self.persisting_is_locked = true
Devops::Db.connector.lock_persisting_stack(id)
end
def unlock_persisting!
self.persisting_is_locked = false
Devops::Db.connector.unlock_persisting_stack(id)
end
def without_bootstrap?
launch_options['without_bootstrap'] || false
end
def skip_rollback?
result = launch_options['skip_rollback']
result.nil? ? true : result
end
2015-07-14 16:51:40 +03:00
class << self
# attrs should include:
# - id (String)
# - deploy_env (String)
# - stack_template (String)
# - provider (String)
# - provider_account (String)
def create(attrs, out)
2015-07-14 16:51:40 +03:00
model = new(attrs)
model.create_stack_in_cloud!(out)
2016-04-04 13:17:07 +03:00
model.sync_status_and_events!
2015-07-14 16:51:40 +03:00
model
end
def build_from_bson(attrs)
attrs['id'] = attrs["_id"]
self.new(attrs)
end
end
2015-03-06 12:20:30 +03:00
end
2015-02-12 13:01:05 +03:00
end
end