class Stackr::Cli

Public Class Methods

source_root() click to toggle source
# File lib/stackr/cli.rb, line 45
def self.source_root
  File.join(File.dirname(__FILE__),'..','..')
end

Public Instance Methods

create_change_set(template_name) click to toggle source
# File lib/stackr/cli.rb, line 202
def create_change_set(template_name)
  return if !validate_template(template_name)

  template = load_template(template_name)
  if !template
    say "There is no template named \'#{template_name}\'."
    return
  end

  change_set_name = options[:change_set_name] || "new-#{template.name}"
  stack_name = options[:stack_name] || template.name
  launcher = Stackr::CloudFormation.new
  say "Creating CloudFormation stack change set #{change_set_name} from template #{template.name} for stack #{stack_name}\n"
  begin
    sets = launcher.create_change_set(stack_name, template, change_set_name, options)
  rescue Stackr::StackMissingError => e
    say e.message
  rescue Stackr::StackUpdateNotRequiredError => e
    say e.message
  rescue Stackr::InsufficientCapabilitiesError => e
    say e.message
  end

end
create_project(name) click to toggle source
# File lib/stackr/cli.rb, line 50
def create_project(name)
  @project_name = name

  say "Creating stackr project: #{name}\n"
  directory 'templates/project', name
end
create_stack(template_name) click to toggle source

TODO: log parameters and their values

# File lib/stackr/cli.rb, line 115
def create_stack(template_name)
  return if !validate_template(template_name)

  template = load_template(template_name)
  if !template
    say "There is no template named \'#{template_name}\'."
    return
  end

  name = options[:name] || template.name
  launcher = Stackr::CloudFormation.new
  say "Creating CloudFormation stack #{name} from template #{template.name}\n"
  begin
    launcher.create_stack(template, options)
  rescue Stackr::StackAlreadyExistsError => e
    say e.message
  end
end
create_template(name) click to toggle source
# File lib/stackr/cli.rb, line 59
def create_template(name)
  @template_name = name
  say "Creating template generator #{name}\n"
  template 'templates/generator.rb.tt', File.join(templates_path, "#{name}.rb")
end
delete_change_set(change_set_name) click to toggle source
# File lib/stackr/cli.rb, line 274
def delete_change_set(change_set_name)
  launcher = Stackr::CloudFormation.new
  stack_name = options[:stack_name]
  begin
    launcher.delete_change_set(change_set_name, stack_name)
  rescue Stackr::ChangeSetMissingError => e
    say e.message
    return
  rescue Stackr::StackNameMissingError => e
    say e.message
    return
  end
  say "Change set #{change_set_name} deleted."
end
delete_stack(stack_name) click to toggle source
# File lib/stackr/cli.rb, line 166
def delete_stack(stack_name)
  say "Deleting CloudFormation stack #{stack_name}\n"
  launcher = Stackr::CloudFormation.new
  begin
    launcher.delete_stack(stack_name)
  rescue Stackr::StackMissingError => e
    say e.message
  end
end
execute_change_set(change_set_name) click to toggle source
# File lib/stackr/cli.rb, line 294
def execute_change_set(change_set_name)
  launcher = Stackr::CloudFormation.new
  stack_name = options[:stack_name]
  begin
    launcher.execute_change_set(change_set_name, stack_name)
  rescue Stackr::ChangeSetMissingError => e
    say e.message
    return
  rescue Stackr::StackNameMissingError => e
    say e.message
    return
  end
  say "Change set #{change_set_name} executed"
end
generate_template(template_name) click to toggle source
# File lib/stackr/cli.rb, line 67
def generate_template(template_name)
  template = load_template(template_name)
  if !template
    say "There is no template named \'#{template_name}\'."
    return
  end

  json_file = json_template_path(template_name)

  say "Writing #{template_name} to #{json_file}\n"
  File.open(json_file, 'w') do |f|
    f.write(template.body)
  end
end
json_template_path(name) click to toggle source
# File lib/stackr/cli.rb, line 23
def json_template_path(name)
  File.join(templates_path, "#{name}.json")
end
list_change_sets(stack_name) click to toggle source
# File lib/stackr/cli.rb, line 228
def list_change_sets(stack_name)
  launcher = Stackr::CloudFormation.new
  begin
    sets = launcher.list_change_sets(stack_name)
  rescue Stackr::StackMissingError => e
    say e.message
    return
  end
  rows = []
  sets.each do |set|
    rows << [
      set.change_set_name,
      set.creation_time,
      set.execution_status,
      set.status
    ]
  end
  print_table rows
end
list_stacks() click to toggle source
# File lib/stackr/cli.rb, line 178
def list_stacks
  launcher = Stackr::CloudFormation.new
  rows = []
  launcher.list_stacks.each do |stack|
    rows << [
      stack.name,
      stack.stack_status,
      stack.creation_time ? stack.creation_time.iso8601 : '',
      stack.last_updated_time ? stack.last_updated_time.iso8601 : ''
    ]
  end
  print_table rows
end
load_template(name) click to toggle source

Only load the template the first time

# File lib/stackr/cli.rb, line 28
def load_template(name)
  if @template.nil?
    template_file = File.join(templates_path, "#{name}.rb")
    @template = Stackr::Template.load(template_file)
  end
  @template
end
project_path() click to toggle source
# File lib/stackr/cli.rb, line 11
def project_path
  @project_path || File.basename(Dir.getwd)
end
project_path=(name) click to toggle source
# File lib/stackr/cli.rb, line 7
def project_path=(name)
  @project_path = name
end
show_change_set(change_set_name) click to toggle source
# File lib/stackr/cli.rb, line 253
def show_change_set(change_set_name)
  launcher = Stackr::CloudFormation.new
  stack_name = options[:stack_name]
  begin
    set = launcher.show_change_set(change_set_name, stack_name)
  rescue Stackr::ChangeSetMissingError => e
    say e.message
    return
  rescue Stackr::StackNameMissingError => e
    say e.message
    return
  end
  require 'json'
  say JSON.pretty_generate(set)
end
templates_path() click to toggle source
# File lib/stackr/cli.rb, line 19
def templates_path()
  @templates_path || 'templates'
end
templates_path=(path) click to toggle source
# File lib/stackr/cli.rb, line 15
def templates_path=(path)
  @templates_path = path
end
update_stack(template_name) click to toggle source

TODO: log parameters and their values

# File lib/stackr/cli.rb, line 141
def update_stack(template_name)
  return if !validate_template(template_name)

  template = load_template(template_name)
  if !template
    say "There is no template named \'#{template_name}\'."
    return
  end

  name = options[:name] || template.name
  say "Updating CloudFormation stack #{name} from template #{template.name}\n"
  launcher = Stackr::CloudFormation.new
  begin
    launcher.update_stack(template, options)
  rescue Stackr::StackMissingError => e
    say e.message
  rescue Stackr::StackUpdateNotRequiredError => e
    say e.message
  rescue Stackr::InsufficientCapabilitiesError => e
    say e.message
  end
end
validate_template(template_name) click to toggle source
# File lib/stackr/cli.rb, line 84
def validate_template(template_name)
  template = load_template(template_name)
  if !template
    say "There is no template named \'#{template_name}\'."
    return
  end

  launcher = Stackr::CloudFormation.new
  begin
    launcher.validate_template(template)
  rescue Aws::S3::Errors::ServiceError => e
    say e.message
    return false
  else
    say "Template #{template_name} validates."
    return true
  end
end
version() click to toggle source
# File lib/stackr/cli.rb, line 39
def version
  say Stackr::VERSION
end