Class: Terraspace::Compiler::Strategy::Tfvar::Layer
- Inherits:
-
Object
- Object
- Terraspace::Compiler::Strategy::Tfvar::Layer
- Extended by:
- Memoist
- Includes:
- Layering, Plugin::Expander::Friendly
- Defined in:
- lib/terraspace/compiler/strategy/tfvar/layer.rb
Instance Method Summary collapse
- #full_layering ⇒ Object
- #full_paths(tfvars_dir) ⇒ Object
-
#initialize(mod) ⇒ Layer
constructor
A new instance of Layer.
-
#layer_levels(prefix = nil) ⇒ Object
adds prefix and to each layer pair that has base and Terraspace.env.
- #paths ⇒ Object
- #plugins ⇒ Object
- #project_tfvars_dir ⇒ Object
-
#stack_tfvars_dir ⇒ Object
seed dir takes higher precedence than the tfvars folder within the stack module.
Methods included from Plugin::Expander::Friendly
Methods included from Layering
#layers, #main_layers, #post_layers, #pre_layers
Constructor Details
#initialize(mod) ⇒ Layer
Returns a new instance of Layer.
36 37 38 |
# File 'lib/terraspace/compiler/strategy/tfvar/layer.rb', line 36 def initialize(mod) @mod = mod end |
Instance Method Details
#full_layering ⇒ Object
60 61 62 63 64 65 66 |
# 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) ⇒ Object
47 48 49 50 51 52 53 54 55 56 57 58 |
# 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) ⇒ Object
adds prefix and to each layer pair that has base and Terraspace.env. IE:
"#{prefix}/base"
"#{prefix}/#{Terraspace.env}"
73 74 75 76 77 78 79 80 81 82 83 |
# 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 ⇒ Object
40 41 42 43 44 |
# 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 ⇒ Object
85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 |
# 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 ⇒ Object
110 111 112 |
# File 'lib/terraspace/compiler/strategy/tfvar/layer.rb', line 110 def project_tfvars_dir "#{Terraspace.root}/config/terraform/tfvars" end |
#stack_tfvars_dir ⇒ Object
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.
125 126 127 128 129 130 131 |
# 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 |