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