class TerraformWrapper::Shared::Runner

Attributes

binary[R]
code[R]
config[R]
downloaded[R]
initialised[R]

Public Class Methods

new(binary:, code:) click to toggle source
# File lib/terraform-wrapper/shared/runner.rb, line 31
def initialize(binary:, code:)
  logger.fatal("Terraform code location: #{code.path} does not exist!") unless code.check

  @binary = binary
  @code   = code

  @initialised = false
end

Public Instance Methods

apply(file: nil) click to toggle source
# File lib/terraform-wrapper/shared/runner.rb, line 97
def apply(file: nil)
  logger.fatal("Cannot Terraform apply before initialising backend!") unless initialised

  parameters = Array.new
  parameters.append("-auto-approve")

  if (not file.nil?) and file.kind_of?(String) and (not file.strip.empty?) then
    logger.fatal("Plan file: #{file} does not exist!") unless File.file?(file)
    parameters.append("\"#{file}\"")
  else
    parameters.concat(variable_files)
    parameters.concat(variable_strings)
  end

  logger.fatal("Terraform apply failed!") unless run(action: "apply", parameters: parameters)
end
destroy() click to toggle source
# File lib/terraform-wrapper/shared/runner.rb, line 135
def destroy
  logger.fatal("Cannot Terraform destroy before initialising backend!") unless initialised

  parameters = Array.new
  parameters.concat(variable_files)
  parameters.concat(variable_strings)
  parameters.append("-auto-approve")

  logger.fatal("Terraform destroy failed!") unless run(action: "destroy", parameters: parameters)
end
download() click to toggle source
# File lib/terraform-wrapper/shared/runner.rb, line 42
def download
  parameters = Array.new
  parameters.append("-backend=false")

  logger.fatal("Failed to download Terraform modules.") unless run(action: "init", parameters: parameters)

  @downloaded = true
end
import(address: nil, id: nil) click to toggle source
# File lib/terraform-wrapper/shared/runner.rb, line 148
def import(address: nil, id: nil)
  logger.fatal("Cannot Terraform import before initialising backend!") unless initialised

  logger.fatal("Terraform state address for import must be a string!") unless address.kind_of?(String)
  logger.fatal("Terraform state address for import must be a string!") unless address.kind_of?(String)
  logger.fatal("Terraform state address for import must not be blank!") if address.strip.empty?

  logger.fatal("Identification for infrastructure to import must be a string!") unless id.kind_of?(String)
  logger.fatal("Identification for infrastructure to import must not be blank!") if id.strip.empty?

  parameters = Array.new
  parameters.concat(variable_files)
  parameters.concat(variable_strings)

  parameters.append("'#{address}'")
  parameters.append("'#{id}'")

  logger.fatal("Terraform import failed!") unless run(action: "import", parameters: parameters)
end
init(config:) click to toggle source
# File lib/terraform-wrapper/shared/runner.rb, line 53
def init(config:)
  parameters = Array.new
  parameters.append("-reconfigure")

  config.backend.hash.each do |key, value|
    parameters.append("-backend-config=\"#{key}=#{value}\"")
  end

  config.auths.map(&:auth)

  logger.fatal("Failed to initialise Terraform with backend.") unless run(action: "init", parameters: parameters)

  @config = config
  @initialised = true
end
plan(destroy: false, file: nil) click to toggle source
# File lib/terraform-wrapper/shared/runner.rb, line 116
def plan(destroy: false, file: nil)
  logger.fatal("Cannot Terraform plan before initialising backend!") unless initialised

  parameters = Array.new
  parameters.concat(variable_files)
  parameters.concat(variable_strings)

  if not file.nil? and file.kind_of?(String) and not file.strip.empty? then
    logger.fatal("Failed to create plan directory: #{directory}") unless ::TerraformWrapper.create_directory(directory: File.dirname(file), purpose: "plan")
    parameters.append("-out=\"#{file}\"")
  end

  parameters.append("-destroy") if destroy

  logger.fatal("Terraform plan failed!") unless run(action: "plan", parameters: parameters)
end
upgrade() click to toggle source
# File lib/terraform-wrapper/shared/runner.rb, line 71
def upgrade
  lockfile_path = File.join(@code.path, @@lockfile_name)

  if File.file?(lockfile_path)
    logger.info("Removing lock file: #{lockfile_path}")
    File.delete(lockfile_path)
  end

  logger.fatal("Lock file removal failed!") if File.file?(lockfile_path)

  parameters = Array.new
  parameters.append("-update")
  logger.fatal("Failed to upgrade Terraform modules!") unless run(action: "get", parameters: parameters)

  parameters = Array.new
  parameters.append("lock")

  @binary.provider.platforms.each do |platform|
    parameters.append("-platform=\"#{platform}\"")
  end

  logger.fatal("Failed to upgrade Terraform providers!") unless run(action: "providers", parameters: parameters)
end
validate() click to toggle source
# File lib/terraform-wrapper/shared/runner.rb, line 170
def validate
  logger.fatal("Cannot Terraform validate before downloading modules!") unless downloaded
  logger.fatal("Terraform validation failed!") unless run(action: "validate")
end

Private Instance Methods

run(action:, parameters: Array.new) click to toggle source
# File lib/terraform-wrapper/shared/runner.rb, line 181
def run(action:, parameters: Array.new)
  result = false

  parameters.reject! { |item| not item.kind_of?(String) or item.strip.empty? }

  cmdline = [ "\"#{@binary.path}\"", action ].concat(parameters).join(" ")

  logger.info("Starting Terraform, action: #{action}")

  puts("\n" + ('#' * 80) + "\n\n")

  Dir.chdir(@code.path)
  result = system(cmdline) || false

  puts("\n" + ('#' * 80) + "\n\n")

  return result
end
variable_files() click to toggle source
# File lib/terraform-wrapper/shared/runner.rb, line 202
def variable_files
  logger.fatal("Cannot generate variable files until Terraform has been initialised!") unless @initialised

  result = Array.new

  @config.variables.files.each do |file|
    result.append("-var-file=\"#{file}\"")
  end

  return result
end
variable_strings() click to toggle source
# File lib/terraform-wrapper/shared/runner.rb, line 216
def variable_strings
  logger.fatal("Cannot generate variable strings until Terraform has been initialised!") unless @initialised

  result = Array.new

  @config.variables.values.each do |key, value|
    result.append("-var=\"#{key.to_s}=#{value}\"")
  end

  return result
end