class Terradactyl::CLI

rubocop:disable Metrics/ClassLength

Public Class Methods

exit_on_failure?() click to toggle source
# File lib/terradactyl/cli.rb, line 26
def self.exit_on_failure?
  true
end
new(*args) click to toggle source
Calls superclass method
# File lib/terradactyl/cli.rb, line 30
def initialize(*args)
  # Hook ensures abort on stack errors
  at_exit { abort if Stacks.error? }
  super
end

Public Instance Methods

apply(name) click to toggle source
# File lib/terradactyl/cli.rb, line 343
def apply(name)
  @stack ||= Stack.new(name)
  print_warning "Applying: #{@stack.name}"
  if @stack.apply.zero?
    print_ok "Applied: #{@stack.name}"
  else
    Stacks.error!(@stack)
    print_crit "Failed to apply changes: #{@stack.name}"
  end
end
audit(name) click to toggle source
# File lib/terradactyl/cli.rb, line 313
def audit(name)
  plan(name)
  if (@stack = Stacks.dirty?(name))
    Stacks.error!(@stack)
    print_crit "Dirty stack: #{@stack.name}"
  end
end
audit_all() click to toggle source

rubocop:disable Metrics/AbcSize

# File lib/terradactyl/cli.rb, line 213
def audit_all
  report = { start: Time.now.to_json }
  print_header 'Auditing ALL Stacks ...'
  Stacks.load.each do |name|
    catch(:error) do
      clean(name)
      init(name)
      audit(name)
    end
    @stack = nil
  end
  report[:finish] = Time.now.to_json
  if options[:report]
    print_header 'Audit Report ...'
    generate_report(report)
  end
end
clean(name) click to toggle source
# File lib/terradactyl/cli.rb, line 335
def clean(name)
  @stack ||= Stack.new(name)
  print_warning "Cleaning: #{@stack.name}"
  @stack.clean
  print_ok "Cleaned: #{@stack.name}"
end
clean_all() click to toggle source
# File lib/terradactyl/cli.rb, line 188
def clean_all
  print_header 'Cleaning ALL Stacks ...'
  Stacks.load.each do |name|
    clean(name)
    @stack = nil
  end
end
defaults() click to toggle source
# File lib/terradactyl/cli.rb, line 94
def defaults
  puts config.to_h.to_yaml
end
destroy(name) click to toggle source
# File lib/terradactyl/cli.rb, line 367
def destroy(name)
  @stack ||= Stack.new(name)
  print_crit "Destroying: #{@stack.name}"
  if @stack.destroy.zero?
    print_warning "Destroyed: #{@stack.name}"
  else
    Stacks.error!(@stack)
    print_crit "Failed to apply changes: #{@stack.name}"
  end
end
fmt(name) click to toggle source
# File lib/terradactyl/cli.rb, line 263
def fmt(name)
  @stack ||= Stack.new(name)
  print_warning "Formatting: #{@stack.name}"
  if @stack.fmt.zero?
    print_ok "Formatted: #{@stack.name}"
  else
    Stacks.error!(@stack)
    print_crit "Formatting failed: #{@stack.name}"
  end
end
generate_report(report) click to toggle source
# File lib/terradactyl/cli.rb, line 59
def generate_report(report)
  data_file = "#{config.base_folder}.audit.json"
  print_warning "Writing Report: #{data_file} ..."
  report[:error] = Stacks.error.map { |s| "#{config.base_folder}/#{s.name}" }.sort
  File.write data_file, JSON.pretty_generate(report)
  print_ok 'Done!'
end
init(name, backend: true) click to toggle source
# File lib/terradactyl/cli.rb, line 275
def init(name, backend: true)
  @stack ||= Stack.new(name)
  @stack.config.terraform.init.backend = backend

  print_ok "Initializing: #{@stack.name}"
  if @stack.init.zero?
    print_ok "Initialized: #{@stack.name}"
  else
    Stacks.error!(@stack)
    print_crit "Initialization failed: #{@stack.name}"
    throw :error
  end
end
install(component) click to toggle source

rubocop:disable Metrics/AbcSize

# File lib/terradactyl/cli.rb, line 406
def install(component)
  case component.to_sym
  when :terraform
    print_warning "Installing: #{component}, version: #{options[:version]}"
    version = options[:version] == 'latest' ? terraform_latest : options[:version]
    Terradactyl::Terraform::VersionManager.reset!
    Terradactyl::Terraform::VersionManager.version = version
    Terradactyl::Terraform::VersionManager.install
    if Terradactyl::Terraform::VersionManager.binary
      print_ok "Installed: #{Terradactyl::Terraform::VersionManager.binary}"
    end
  else
    msg = %(Operation not supported -- I don't know how to install: #{component})
    print_crit msg
    exit 1
  end
end
invoke_command(command, *args) click to toggle source

Monkey-patch Thor internal method to break out of nested calls

Calls superclass method
# File lib/terradactyl/cli.rb, line 39
def invoke_command(command, *args)
  catch(:error) { super }
end
lint(name) click to toggle source
# File lib/terradactyl/cli.rb, line 251
def lint(name)
  @stack ||= Stack.new(name)
  print_ok "Linting: #{@stack.name}"
  if @stack.lint.zero?
    print_ok "Formatting OK: #{@stack.name}"
  else
    Stacks.error!(@stack)
    print_warning "Bad Formatting: #{@stack.name}"
  end
end
plan(name) click to toggle source

rubocop:disable Metrics/AbcSize

# File lib/terradactyl/cli.rb, line 291
def plan(name)
  @stack ||= Stack.new(name)
  print_ok "Planning: #{@stack.name}"
  case @stack.plan
  when 0
    print_ok "No changes: #{@stack.name}"
  when 1
    Stacks.error!(@stack)
    print_crit "Plan failed: #{@stack.name}"
    @stack.print_error
    throw :error
  when 2
    Stacks.dirty!(@stack)
    print_warning "Changes detected: #{@stack.name}"
    @stack.print_plan
  else
    raise
  end
end
plan_all() click to toggle source
# File lib/terradactyl/cli.rb, line 197
def plan_all
  print_header 'Planning ALL Stacks ...'
  Stacks.load.each do |name|
    catch(:error) do
      clean(name)
      init(name)
      plan(name)
    end
    @stack = nil
  end
end
planpr() click to toggle source
# File lib/terradactyl/cli.rb, line 118
def planpr
  print_header 'SmartPlanning PR ...'
  stacks = Stacks.load(filter: StacksPlanFilterGitDiffOriginBranch.new)
  validate_planpr(stacks).each do |name|
    clean(name)
    init(name)
    plan(name)
    @stack = nil
  end
end
quickplan(name) click to toggle source
# File lib/terradactyl/cli.rb, line 180
def quickplan(name)
  print_header "Quick planning #{name} ..."
  clean(name)
  init(name)
  plan(name)
end
refresh(name) click to toggle source
# File lib/terradactyl/cli.rb, line 355
def refresh(name)
  @stack ||= Stack.new(name)
  print_crit "Refreshing: #{@stack.name}"
  if @stack.refresh.zero?
    print_warning "Refreshed: #{@stack.name}"
  else
    Stacks.error!(@stack)
    print_crit "Failed to refresh stack: #{@stack.name}"
  end
end
smartapply() click to toggle source
# File lib/terradactyl/cli.rb, line 142
def smartapply
  print_header 'SmartApplying Stacks ...'
  stacks = Stacks.load(filter: StacksApplyFilterPrePlanned.new)
  print_warning 'No stacks contain plan files ...' unless stacks.any?
  stacks.each do |name|
    apply(name)
    @stack = nil
  end
  print_message "Total Stacks Modified: #{stacks.size}"
end
smartplan() click to toggle source
# File lib/terradactyl/cli.rb, line 130
def smartplan
  print_header 'SmartPlanning Stacks ...'
  stacks = Stacks.load(filter: StacksPlanFilterGitDiffHead.new)
  validate_smartplan(stacks).each do |name|
    clean(name)
    init(name)
    plan(name)
    @stack = nil
  end
end
smartrefresh() click to toggle source
# File lib/terradactyl/cli.rb, line 154
def smartrefresh
  print_header 'SmartRefreshing Stacks ...'
  stacks = Stacks.load(filter: StacksApplyFilterPrePlanned.new)
  print_warning 'No stacks contain plan files ...' unless stacks.any?
  stacks.each do |name|
    refresh(name)
    @stack = nil
  end
  print_message "Total Stacks Refreshed: #{stacks.size}"
end
stacks() click to toggle source
# File lib/terradactyl/cli.rb, line 99
def stacks
  print_ok 'Stacks:'
  Stacks.load.each do |name|
    print_dot name.to_s
  end
end
terraform_latest() click to toggle source
# File lib/terradactyl/cli.rb, line 67
def terraform_latest
  Terradactyl::Terraform::VersionManager.latest
end
upgrade(name) click to toggle source
# File lib/terradactyl/cli.rb, line 172
def upgrade(name)
  clean(name)
  init(name, backend: false)
  upgrade_stack(name)
  fmt(name)
end
upgrade_stack(name) click to toggle source
# File lib/terradactyl/cli.rb, line 71
def upgrade_stack(name)
  @stack ||= Stack.new(name)
  print_warning "Upgrading: #{@stack.name}"
  if @stack.upgrade.zero?
    print_ok "Upgraded: #{@stack.name}"
  else
    Stacks.error!(@stack)
    print_crit "Failed to upgrade: #{@stack.name}"
    throw :error
  end
rescue Terradactyl::Terraform::VersionManager::VersionManagerError => e
  print_crit "Error: #{e.message}"
  exit 1
end
validate(name) click to toggle source
# File lib/terradactyl/cli.rb, line 322
def validate(name)
  @stack ||= Stack.new(name)
  print_ok "Validating: #{@stack.name}"
  if @stack.validate.zero?
    print_ok "Validated: #{@stack.name}"
  else
    Stacks.error!(@stack)
    print_crit "Validation failed: #{@stack.name}"
    throw :error
  end
end
validate_all() click to toggle source
# File lib/terradactyl/cli.rb, line 233
def validate_all
  print_header 'Validating ALL Stacks ...'
  Stacks.load.each do |name|
    catch(:error) do
      clean(name)
      init(name)
      validate(name)
    end
    @stack = nil
  end
end
validate_planpr(stacks) click to toggle source
# File lib/terradactyl/cli.rb, line 51
def validate_planpr(stacks)
  if stacks.empty?
    print_message 'No Stacks Modified ...'
    print_line 'Skipping plan ...'
  end
  stacks
end
validate_smartplan(stacks) click to toggle source
# File lib/terradactyl/cli.rb, line 43
def validate_smartplan(stacks)
  if stacks.empty?
    print_message 'No Stacks Modified ...'
    print_line 'Did you forget to `git add` your selected changes?'
  end
  stacks
end
version() click to toggle source
# File lib/terradactyl/cli.rb, line 107
def version
  print_message format('version: %<semver>s', semver: Terradactyl::VERSION)
end