class Terraspace::Compiler::Strategy::Tfvar::Layer

Public Class Methods

new(mod) click to toggle source
# File lib/terraspace/compiler/strategy/tfvar/layer.rb, line 36
def initialize(mod)
  @mod = mod
end

Public Instance Methods

full_layering() click to toggle source
# File lib/terraspace/compiler/strategy/tfvar/layer.rb, line 60
def full_layering
  # layers is defined in Terraspace::Layering module
  layers.inject([]) do |sum, layer|
    sum += layer_levels(layer) unless layer.nil?
    sum
  end
end
full_paths(tfvars_dir) click to toggle source
# File lib/terraspace/compiler/strategy/tfvar/layer.rb, line 47
def full_paths(tfvars_dir)
  layer_paths = full_layering.map do |layer|
    [
      "#{tfvars_dir}/#{layer}.tfvars",
      "#{tfvars_dir}/#{layer}.rb",
    ]
  end.flatten

  layer_paths.select do |path|
    File.exist?(path)
  end
end
layer_levels(prefix=nil) click to toggle source

adds prefix and to each layer pair that has base and Terraspace.env. IE:

"#{prefix}/base"
"#{prefix}/#{Terraspace.env}"
# File lib/terraspace/compiler/strategy/tfvar/layer.rb, line 73
def layer_levels(prefix=nil)
  levels = ["base", Terraspace.env, @mod.instance].reject(&:blank?) # layer levels. @mod.instance can be nil
  env_levels = levels.map { |l| "#{Terraspace.env}/#{l}" } # env folder also
  levels = levels + env_levels
  levels.map! do |i|
    # base layer has prefix of '', reject with blank so it doesnt produce '//'
    [prefix, i].reject(&:blank?).join('/')
  end
  levels.unshift(prefix) unless prefix.blank? # IE: tfvars/us-west-2.tfvars
  levels
end
paths() click to toggle source
# File lib/terraspace/compiler/strategy/tfvar/layer.rb, line 40
def paths
  project_paths = full_paths(project_tfvars_dir)
  stack_paths   = full_paths(stack_tfvars_dir)
  project_paths + stack_paths
end
plugins() click to toggle source
# File lib/terraspace/compiler/strategy/tfvar/layer.rb, line 85
def plugins
  layers = []
  Terraspace::Plugin.layer_classes.each do |klass|
    layer = klass.new

    # region is high up because its simpler and the more common case is a single provider
    layers << layer.region

    namespace = friendly_name(layer.namespace)

    # namespace is a simple way keep different tfvars between different engineers on different accounts
    layers << namespace
    layers << "#{namespace}/#{layer.region}"

    # in case using multiple providers and one region
    layers << layer.provider
    layers << "#{layer.provider}/#{layer.region}" # also in case another provider has colliding regions

    # Most general layering
    layers << "#{layer.provider}/#{namespace}"
    layers << "#{layer.provider}/#{namespace}/#{layer.region}"
  end
  layers
end
project_tfvars_dir() click to toggle source
# File lib/terraspace/compiler/strategy/tfvar/layer.rb, line 110
def project_tfvars_dir
  "#{Terraspace.root}/config/terraform/tfvars"
end
stack_tfvars_dir() click to toggle source

seed dir takes higher precedence than the tfvars folder within the stack module. Example:

seed/tfvars/stacks/demo (folder must have *.tfvars or *.rb files)
app/stacks/demo/tfvars

This allows user to take over the tfvars embedded in the stack if they need to. Generally, putting tfvars in within the app/stacks/MOD/tfvars folder seems cleaner and easier to follow.

Will also consider app/modules/demo/tfvars. Though modules to be reuseable and stacks is where business logic should go.

# File lib/terraspace/compiler/strategy/tfvar/layer.rb, line 125
def stack_tfvars_dir
  seed_dir = "#{Terraspace.root}/seed/tfvars/#{@mod.build_dir(disable_instance: true)}"
  mod_dir = "#{@mod.root}/tfvars"

  empty = Dir.glob("#{seed_dir}/*").empty?
  empty ? mod_dir : seed_dir
end