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

115 lines
3.0 KiB
Ruby
Raw Normal View History

2015-03-06 12:20:30 +03:00
module Devops
module Model
class StackBase < MongoModel
2015-07-14 16:51:40 +03:00
attr_accessor :id, :project, :deploy_env, :stack_template,
2015-07-30 02:14:45 +03:00
:cloud_stack_id, :provider, :parameters, :details, :owner
2015-03-06 12:20:30 +03:00
types id: {type: String, empty: false},
provider: {type: String, empty: false},
project: {type: String},
deploy_env: {type: String},
2015-07-14 16:51:40 +03:00
stack_template: {type: String, empty: false},
2015-07-30 02:14:45 +03:00
cloud_stack_id: {type: String, nil: true},
owner: {type: String}
# details: {type: Hash, nil: true} # Hash type isn't supported yet
2015-03-06 12:20:30 +03:00
def initialize attrs={}
2015-07-14 16:51:40 +03:00
self.provider = self.class.provider
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-07-14 16:51:40 +03:00
self.cloud_stack_id = attrs['cloud_stack_id']
self.parameters = attrs['parameters']
2015-07-14 16:51:40 +03:00
self.details = attrs['details']
2015-07-30 02:14:45 +03:00
self.owner = attrs['owner']
2015-03-06 12:20:30 +03:00
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,
2015-07-14 16:51:40 +03:00
parameters: parameters,
2015-07-15 16:25:06 +03:00
details: details,
2015-07-30 02:14:45 +03:00
stack_status: stack_status,
owner: owner
2015-03-06 12:20:30 +03:00
}
end
2015-07-14 16:51:40 +03:00
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
2015-07-14 16:51:40 +03:00
def delete_stack_in_cloud!
provider_class.delete_stack(self)
2015-03-06 12:20:30 +03:00
end
2015-07-14 16:51:40 +03:00
def sync_details!
2015-07-30 02:14:45 +03:00
self.details = provider_class.stack_details(self).attributes
2015-07-15 18:37:27 +03:00
end
def resources
provider_class.stack_resources(self)
2015-03-06 12:20:30 +03:00
end
2015-07-23 12:54:36 +03:00
# resource_id is logical
def resource(resource_id)
provider_class.stack_resource(self, resource_id)
end
2015-07-20 18:59:26 +03:00
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
2015-07-30 02:14:45 +03:00
def template_body
Devops::Db.connector.stack_template(stack_template).template_body
end
2015-07-14 16:51:40 +03:00
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!
2015-07-20 18:59:26 +03:00
model.sync_details!
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-07-14 16:51:40 +03:00
private
def provider_class
Provider::ProviderFactory.get(provider)
end
2015-03-06 12:20:30 +03:00
end
2015-02-12 13:01:05 +03:00
end
end