Class: RSpec::Terraspace::Project

Inherits:
Object
  • Object
show all
Defined in:
lib/rspec/terraspace/project.rb

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options = {}) ⇒ Project

Returns a new instance of Project.



6
7
8
9
10
11
12
13
14
15
16
# 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

Class Method Details

.tmp_rootObject



163
164
165
# File 'lib/rspec/terraspace/project.rb', line 163

def self.tmp_root
  "#{Terraspace.tmp_root}/test-harnesses"
end

Instance Method Details

#build_configObject



51
52
53
54
55
56
57
58
59
# File 'lib/rspec/terraspace/project.rb', line 51

def build_config
  return unless @config

  config_folder = "#{build_dir}/config"
  FileUtils.rm_rf(config_folder) # wipe current config folder
  FileUtils.mkdir_p(File.dirname(config_folder))
  src = @config
  FileUtils.cp_r(src, config_folder)
end

#build_dirObject



155
156
157
# File 'lib/rspec/terraspace/project.rb', line 155

def build_dir
  "#{tmp_root}/#{@name}"
end

#build_foldersObject

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



32
33
34
35
36
37
38
39
40
# 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_modulesObject



61
62
63
64
# File 'lib/rspec/terraspace/project.rb', line 61

def build_modules
  return unless @modules
  build_type_folder("modules", @modules)
end

#build_projectObject



42
43
44
45
46
47
48
49
# 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_stacksObject



66
67
68
69
# File 'lib/rspec/terraspace/project.rb', line 66

def build_stacks
  return unless @stacks
  build_type_folder("stacks", @stacks)
end

#build_tfvarsObject

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


92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# File 'lib/rspec/terraspace/project.rb', line 92

def build_tfvars
  return unless @tfvars
  @tfvars.each do |stack, src|
    tfvars_folder = "#{build_dir}/app/stacks/#{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) ⇒ Object

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.



125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
# File 'lib/rspec/terraspace/project.rb', line 125

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

#cleanObject



146
147
148
# File 'lib/rspec/terraspace/project.rb', line 146

def clean
  FileUtils.rm_rf(build_dir)
end

#copy(src, dest) ⇒ Object



150
151
152
153
# File 'lib/rspec/terraspace/project.rb', line 150

def copy(src, dest)
  FileUtils.mkdir_p(File.dirname(dest))
  FileUtils.cp_r(src, dest)
end

#createObject



18
19
20
21
22
23
24
25
26
27
28
29
# 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

#remove_test_folder(dest) ⇒ Object



142
143
144
# File 'lib/rspec/terraspace/project.rb', line 142

def remove_test_folder(dest)
  FileUtils.rm_rf("#{dest}/test")
end

#tmp_rootObject



159
160
161
# File 'lib/rspec/terraspace/project.rb', line 159

def tmp_root
  self.class.tmp_root
end