class RSpec::Terraspace::Project

Public Class Methods

new(options={}) click to toggle source
# File lib/rspec/terraspace/project.rb, line 6
def initialize(options={})
  @options = options
  @name    = options[:name]
  @config  = options[:config]
  @modules = options[:modules]
  @stacks  = options[:stacks]
  @tfvars  = options[:tfvars]
  @folders = options[:folders]

  @remove_test_folder = options[:remove_test_folder].nil? ? true : options[:remove_test_folder]
end
tmp_root() click to toggle source
# File lib/rspec/terraspace/project.rb, line 171
def self.tmp_root
  "#{Terraspace.tmp_root}/test-harnesses"
end

Public Instance Methods

build_config() click to toggle source
# File lib/rspec/terraspace/project.rb, line 51
def build_config
  return unless @config

  config_folder = "#{build_dir}/config"
  FileUtils.mkdir_p(File.dirname(config_folder))
  Dir.glob("#{@config}/*").each do |src|
    FileUtils.cp_r(src, config_folder)
  end
end
build_dir() click to toggle source
# File lib/rspec/terraspace/project.rb, line 163
def build_dir
  "#{tmp_root}/#{@name}"
end
build_folders() click to toggle source

folders at any-level, including top-level can be copied with the folders option

# File lib/rspec/terraspace/project.rb, line 32
def build_folders
  return unless @folders

  @folders.each do |folder|
    dest = "#{build_dir}/#{folder}"
    FileUtils.mkdir_p(File.dirname(dest))
    FileUtils.cp_r(folder, dest)
  end
end
build_modules() click to toggle source
# File lib/rspec/terraspace/project.rb, line 61
def build_modules
  return unless @modules
  build_type_folder("modules", @modules)
end
build_project() click to toggle source
# File lib/rspec/terraspace/project.rb, line 42
def build_project
  parent_dir = File.dirname(build_dir)
  FileUtils.mkdir_p(parent_dir)
  Dir.chdir(parent_dir) do
    project_name = File.basename(build_dir)
    ::Terraspace::CLI::New::Project.start([project_name, "--no-config", "--quiet"])
  end
end
build_stacks() click to toggle source
# File lib/rspec/terraspace/project.rb, line 66
def build_stacks
  return unless @stacks
  build_type_folder("stacks", @stacks)
end
build_tfvars() click to toggle source

If a file has been supplied, then it gets copied over.

# File
terraspace.build_test_harness(
  tfvars: {demo: "spec/fixtures/tfvars/demo.tfvars"},
end

# Results in:
app/stacks/#{stack}/tfvars/test.tfvars

If a directory has been supplied, then the folder fully gets copied over.

# Directory
terraspace.build_test_harness(
  tfvars: {demo: "spec/fixtures/tfvars/demo"},
end

# Results in (whatever is in the folder):
app/stacks/#{stack}/tfvars/base.tfvars
app/stacks/#{stack}/tfvars/test.tfvars
# File lib/rspec/terraspace/project.rb, line 92
def build_tfvars
  return unless @tfvars
  @tfvars.each do |stack, src|
    type = detected_type
    tfvars_folder = "#{build_dir}/app/#{type}/#{stack}/tfvars"
    FileUtils.rm_rf(tfvars_folder) # wipe current tfvars folder. dont use any of the live values

    if File.directory?(src)
      FileUtils.mkdir_p(File.dirname(tfvars_folder))
      FileUtils.cp_r(src, tfvars_folder)
    else # if only a single file, then generate a test.tfvars since this runs under TS_ENV=test
      dest = "#{tfvars_folder}/test.tfvars"
      FileUtils.mkdir_p(File.dirname(dest))
      FileUtils.cp(src, dest)
    end
  end
end
build_type_folder(type_dir, list) click to toggle source

Inputs:

list:     options[:modules] or options[:stacks]
type_dir: modules or stacks

The list argument can support a Hash or String value.

If provided a Hahs, it should be structured like so:

{vm: "app/modules/vm", network: "app/modules/network"}

This allows for finer-control to specify what modules and stacks to build

If provide a String, it should be a path to folder containing all modules or stacks. This provides less fine-grain control but is easier to use and shorter.

# File lib/rspec/terraspace/project.rb, line 133
def build_type_folder(type_dir, list)
  case list
  when Hash
    list.each do |name, src|
      dest = "#{build_dir}/app/#{type_dir}/#{name}"
      copy(src, dest)
      remove_test_folder(dest) if @remove_test_folder
    end
  when String
    dest = "#{build_dir}/app/#{type_dir}"
    FileUtils.rm_rf(dest)
    FileUtils.cp_r(list, dest)
  else
    raise "modules option must be a Hash or String"
  end
end
clean() click to toggle source
# File lib/rspec/terraspace/project.rb, line 154
def clean
  FileUtils.rm_rf(build_dir)
end
copy(src, dest) click to toggle source
# File lib/rspec/terraspace/project.rb, line 158
def copy(src, dest)
  FileUtils.mkdir_p(File.dirname(dest))
  FileUtils.cp_r(src, dest)
end
create() click to toggle source
# File lib/rspec/terraspace/project.rb, line 18
def create
  puts "Building test harness at: #{build_dir}"
  clean
  build_project
  build_config
  build_modules
  build_stacks
  build_tfvars
  build_folders
  puts "Test harness built."
  build_dir
end
detected_type() click to toggle source

Returns: modules or stacks

# File lib/rspec/terraspace/project.rb, line 111
def detected_type
  dir = Dir.pwd
  md = dir.match(%r{app/(stacks|modules)/(.*)?/})
  md[1]
end
remove_test_folder(dest) click to toggle source
# File lib/rspec/terraspace/project.rb, line 150
def remove_test_folder(dest)
  FileUtils.rm_rf("#{dest}/test")
end
tmp_root() click to toggle source
# File lib/rspec/terraspace/project.rb, line 167
def tmp_root
  self.class.tmp_root
end