boltops-tools / terraspace

Terraspace: The Terraform Framework
https://terraspace.cloud
Apache License 2.0
674 stars 46 forks source link

pre_layers first entry is removed by terraspace 2.X #286

Open akamoto opened 1 year ago

akamoto commented 1 year ago

Calling full_layering with "remove_first: true" breaks the first pre_layers definition if you are looking for entry1.tfvars: https://github.com/boltops-tools/terraspace/blob/master/lib/terraspace/compiler/strategy/tfvar/layer.rb#L53

Adding a nonsense entry as first or moving the definition to post_layers suddenly finds entry1.tfvars:

Terraspace::Layering.module_eval do
  def pre_layers
    [
      "entry1",
      "entry2"
      "#{ENV['TS_ENV']}/#{ENV['INSTANCE']}",
    ]
  end

Dump lists of to-be-considered layers to stdout:

      def full_layering(tfvars_dir, remove_first: false)
      # layers defined in Terraspace::Layering module
      all = layers.map { |layer| layer.sub(/\/$/,'') } # strip trailing slash
      all = all.inject([]) do |sum, layer|
        sum += layer_levels(layer) unless layer.nil?
        sum
      end
      all = all.reject { |layer| layer.ends_with?('-') }
      all.map! do |layer|
        layer = layer.blank? ? layer : "/#{layer}"
        [
          "#{tfvars_dir}#{layer}.tfvars",
          "#{tfvars_dir}#{layer}.rb",
        ]
      end.flatten!
      puts "HERE Terraspace::Compiler::Strategy::Tfvar - all before remove_first #{all}"
      all.shift if remove_first # IE: app/stacks/demo/tfvars.tfvars
      puts "HERE Terraspace::Compiler::Strategy::Tfvar - all after #{all}"
      all
    end

Output:

TS_LAYERING_SHOW=true TS_LAYERING_SHOW_ALL=1 TS_ENV=dev INSTANCE=mga terraspace init demo
Building .terraspace-cache/eu-central-1/dev/stacks/demo
Created .terraspace-cache/eu-central-1/dev/stacks/demo/backend.tf
Created .terraspace-cache/eu-central-1/dev/stacks/demo/locals.tf
(..)
HERE Terraspace::Compiler::Strategy::Tfvar - all before remove_first [
 "/path/config/terraform/tfvars/entry1.tfvars",
 "/path/config/terraform/tfvars/entry1.rb",
 "/path/config/terraform/tfvars/entry1/base.tfvars",
(..)
]

HERE Terraspace::Compiler::Strategy::Tfvar - all after [
 "/path/config/terraform/tfvars/entry1.rb",
 "/path/config/terraform/tfvars/entry1/base.tfvars",
 "/path/config/terraform/tfvars/entry1/base.rb",
(..)
]

HERE Terraspace::Compiler::Strategy::Tfvar - all before remove_first [
 "/path/app/stacks/demo/tfvars/entry1.tfvars",
 "/path/app/stacks/demo/tfvars/entry1.rb",
(..)
]

HERE Terraspace::Compiler::Strategy::Tfvar - all after [
 "/path/app/stacks/demo/tfvars/entry1.rb",
 "/path/app/stacks/demo/tfvars/entry1/base.tfvars",
(..)
]

Layers for demo:
    config/terraform/tfvars/entry1/base.tfvars
    config/terraform/tfvars/entry1/dev.tfvars
    config/terraform/tfvars/entry2.tfvars
    config/terraform/tfvars/entry2/base.tfvars
    config/terraform/tfvars/entry2/dev.tfvars
(..)
    config/terraform/tfvars/eu-central-1/dev.tfvars
    app/stacks/demo/tfvars/entry1/base.tfvars
    app/stacks/demo/tfvars/entry1/dev.tfvars
    app/stacks/demo/tfvars/entry2.tfvars
    app/stacks/demo/tfvars/entry2/base.tfvars
    app/stacks/demo/tfvars/entry2/dev.tfvars
    app/stacks/demo/tfvars/dev/mga.tfvars (found)
    app/stacks/demo/tfvars/dev/mga/base.tfvars
    app/stacks/demo/tfvars/dev/mga/dev.tfvars
(..)

Unfortuntly I was looking for entry1.tfvars ( app/stacks/demo/tfvars/dev/mga.tfvars ) which broke after updating from terraspace 1.7 to 2.2.