class Murk::Model::Stack

Attributes

env[R]
name[R]
template[R]
user[R]

Public Class Methods

new(name, env:, user:, template_filename: name + '.json') click to toggle source
# File lib/murk/model/stack.rb, line 14
def initialize(name, env:, user:, template_filename: name + '.json')
  @name = name
  @env = env
  @template = Template.new(template_filename)
  @user = user
  @parameters = []
end

Public Instance Methods

add_parameter(parameter) click to toggle source
# File lib/murk/model/stack.rb, line 26
def add_parameter(parameter)
  if @template.parameter?(parameter.key)
    @parameters << parameter
  else
    fail StackError, "No such parameter '#{parameter.key}' for template '#{@template.filename}'"
  end
end
create_or_update() click to toggle source
# File lib/murk/model/stack.rb, line 38
def create_or_update
  fail StackError, "Stack '#{@name}' is in failed state" if failed?
  exists? ? update : create
end
delete() click to toggle source
# File lib/murk/model/stack.rb, line 43
def delete
  fail StackError "Stack #{@name} does not exist" unless exists?
  cloudformation.delete_stack(stack_name: qualified_name)
end
exists?() click to toggle source
# File lib/murk/model/stack.rb, line 48
def exists?
  existing.any?
end
failed?() click to toggle source
# File lib/murk/model/stack.rb, line 52
def failed?
  existing.any? do |stack|
    stack.stack_status =~ /FAILED/
  end
end
output(key) click to toggle source
# File lib/murk/model/stack.rb, line 70
def output(key)
  return unless exists?
  outputs = cloudformation.describe_stacks(stack_name: qualified_name)[:stacks][0][:outputs]
  output = outputs.find { |o| o.output_key == key.to_s }
  output ? output.output_value : nil
end
parameter_value(parameter_key) click to toggle source
# File lib/murk/model/stack.rb, line 34
def parameter_value(parameter_key)
  @parameters.find { |parameter| parameter.key == parameter_key }.resolve
end
qualified_name() click to toggle source
# File lib/murk/model/stack.rb, line 62
def qualified_name
  qualified_name = ''
  if Murk.options[:stack_prefix]
    qualified_name += Murk.options[:stack_prefix] + '-'
  end
  qualified_name + "#{@env}-#{@user}-#{@name}"
end
template_filename=(template_filename) click to toggle source
# File lib/murk/model/stack.rb, line 22
def template_filename=(template_filename)
  @template = Template.new(template_filename)
end
wait(state) { || ... } click to toggle source
# File lib/murk/model/stack.rb, line 58
def wait state
  cloudformation.wait_forever(:stack_create_complete, stack_name: qualified_name) { yield if block_given? }
end

Private Instance Methods

config() click to toggle source
# File lib/murk/model/stack.rb, line 101
def config
  {
    stack_name: qualified_name,
    template_body: @template.body,
    capabilities: ['CAPABILITY_IAM'],
    parameters: implicit_parameters + explicit_parameters
  }
end
create() click to toggle source
# File lib/murk/model/stack.rb, line 79
def create
  cloudformation.create_stack(config)
rescue Aws::CloudFormation::Errors::ValidationError
  raise StackError, "Failed to create stack #{@name}"
end
existing() click to toggle source
# File lib/murk/model/stack.rb, line 95
def existing
  cloudformation.list_stacks.stack_summaries.select do |stack|
    stack.stack_name == qualified_name && stack.stack_status != 'DELETE_COMPLETE'
  end
end
explicit_parameters() click to toggle source
# File lib/murk/model/stack.rb, line 119
def explicit_parameters
  @parameters.map do |parameter|
    { parameter_key: parameter.key, parameter_value: parameter.resolve }
  end
end
implicit_parameters() click to toggle source
# File lib/murk/model/stack.rb, line 110
def implicit_parameters
  implicit_parameters = {}
  implicit_parameters[:Prefix] = Murk.options[:stack_prefix] if @template.parameter?(:Prefix)
  implicit_parameters[:Env] = @env if @template.parameter?(:Env)
  implicit_parameters[:Name] = @name if @template.parameter?(:Name)
  implicit_parameters[:QualifiedName] = qualified_name if @template.parameter?(:QualifiedName)
  implicit_parameters.map { |key, value| { parameter_key: key, parameter_value: value } }
end
update() click to toggle source
# File lib/murk/model/stack.rb, line 85
def update
  cloudformation.update_stack(config)
rescue Aws::CloudFormation::Errors::ValidationError => e
  if e.message =~ /No updates are to be performed/
    return
  else
    raise StackError, "Failed to update stack #{@name}"
  end
end