class Terraspace::Terraform::Tfc::Runs::Pruner

Public Class Methods

new(mod, options={}) click to toggle source

@mod required for Api::Client

# File lib/terraspace/terraform/tfc/runs/pruner.rb, line 6
def initialize(mod, options={})
  super
  @queue, @kept, @needs_pruning = [], nil, false
end

Public Instance Methods

run() click to toggle source
# File lib/terraspace/terraform/tfc/runs/pruner.rb, line 11
def run
  build_project
  build_queue
  are_you_sure?
  process_queue
end

Private Instance Methods

actionable?(item) click to toggle source

Docs seem to be off: www.terraform.io/docs/cloud/api/run.html#apply-a-run

This includes runs in the "pending," "needs confirmation," "policy checked," and "policy override" states.

Cant really discard a “pending” status, but can discard a “planned” status.

# File lib/terraspace/terraform/tfc/runs/pruner.rb, line 93
def actionable?(item)
  discardable?(item) || cancelable?(item)
end
are_you_sure?() click to toggle source
# File lib/terraspace/terraform/tfc/runs/pruner.rb, line 31
    def are_you_sure?
      unless @needs_pruning
        logger.info "Nothing to prune"
        return
      end

      keeping = item_message(@kept)
      items = @queue.map { |i| item_message(i) }.join("\n")
      message =<<~EOL
        Will keep:

        #{keeping}

        Will prune:

        #{items}

        Are you sure?
      EOL
      sure?(message.chop)
    end
build_queue() click to toggle source
# File lib/terraspace/terraform/tfc/runs/pruner.rb, line 19
def build_queue
  runs.each do |item|
    next unless actionable?(item)
    unless @kept
      @kept = item
      next
    end
    queue(item)
    @needs_pruning = true
  end
end
cancelable?(item) click to toggle source
# File lib/terraspace/terraform/tfc/runs/pruner.rb, line 101
def cancelable?(item)
  %w[pending].include?(status(item))
end
discardable?(item) click to toggle source
# File lib/terraspace/terraform/tfc/runs/pruner.rb, line 97
def discardable?(item)
  %w[planned].include?(status(item))
end
item_message(item) click to toggle source
# File lib/terraspace/terraform/tfc/runs/pruner.rb, line 53
def item_message(item)
  p = ItemPresenter.new(item)
  "   #{p.id} #{p.status} #{p.message} #{p.created_at}"
end
process(item) click to toggle source
# File lib/terraspace/terraform/tfc/runs/pruner.rb, line 64
def process(item)
  id = item['id']
  action = discardable?(item) ? "Discarded" : "Cancelled"
  p = ItemPresenter.new(item)
  msg = "#{action} #{p.id} #{p.message}" # note id is named run-xxx
  logger.info("NOOP: #{msg}") && return if @options[:noop]

  if discardable?(item)
    api.runs.discard(id)
  elsif cancelable?(item)
    api.runs.cancel(id)
  end
  logger.info msg
end
process_queue() click to toggle source
# File lib/terraspace/terraform/tfc/runs/pruner.rb, line 58
def process_queue
  @queue.each do |item|
    process(item)
  end
end
queue(item) click to toggle source
# File lib/terraspace/terraform/tfc/runs/pruner.rb, line 79
def queue(item)
  if discardable?(item)
    @queue << item
  elsif cancelable?(item)
    @queue << item
  end
end
status(item) click to toggle source
# File lib/terraspace/terraform/tfc/runs/pruner.rb, line 105
def status(item)
  item['attributes']['status']
end