rake-terraform 0.0.8 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/.gitignore +19 -0
- data/.rspec +5 -0
- data/.rubocop.yml +25 -0
- data/.travis.yml +1 -0
- data/README.md +93 -1
- data/Rakefile +22 -3
- data/lib/{rake_terraform.rb → rake-terraform.rb} +1 -0
- data/lib/rake-terraform/apply_task/config.rb +47 -0
- data/lib/rake-terraform/{tasks/applytask.rb → apply_task/task.rb} +21 -33
- data/lib/rake-terraform/applytask.rb +11 -0
- data/lib/rake-terraform/{tasks/basetask.rb → basetask.rb} +2 -1
- data/lib/rake-terraform/default_tasks.rb +5 -2
- data/lib/rake-terraform/dsl.rb +2 -2
- data/lib/rake-terraform/env_process.rb +142 -0
- data/lib/rake-terraform/errors.rb +4 -0
- data/lib/rake-terraform/plan_task/config.rb +61 -0
- data/lib/rake-terraform/plan_task/task.rb +51 -0
- data/lib/rake-terraform/plantask.rb +13 -0
- data/lib/rake-terraform/terraformcmd.rb +56 -0
- data/lib/rake-terraform/version.rb +1 -1
- data/rake-terraform.gemspec +3 -0
- data/spec/fixtures/envprocess_uniq_state_dir_var_invalid.env +3 -0
- data/spec/fixtures/envprocess_uniq_state_dir_var_valid.env +4 -0
- data/spec/fixtures/envprocess_uniq_state_false.env +2 -0
- data/spec/fixtures/envprocess_uniq_state_false_file_valid.env +3 -0
- data/spec/fixtures/envprocess_uniq_state_invalid_state_file_str.env +3 -0
- data/spec/fixtures/envprocess_uniq_state_missing_dir_var.env +4 -0
- data/spec/fixtures/envprocess_uniq_state_true.env +5 -0
- data/spec/fixtures/envprocess_uniq_state_true_both.env +6 -0
- data/spec/fixtures/envprocess_uniq_state_true_file_valid.env +3 -0
- data/spec/fixtures/set_all_variables_nil.env +8 -0
- data/spec/spec_helper.rb +86 -0
- data/spec/unit/applytask_spec.rb +112 -0
- data/spec/unit/basetask_spec.rb +10 -0
- data/spec/unit/envprocess_spec.rb +263 -0
- data/spec/unit/plantask_spec.rb +118 -0
- data/spec/unit/terraformcmd_spec.rb +174 -0
- metadata +90 -7
- data/lib/rake-terraform/tasks/plantask.rb +0 -87
@@ -0,0 +1,263 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'rake-terraform/env_process'
|
3
|
+
|
4
|
+
module RakeTerraform
|
5
|
+
# envprocess unit tests
|
6
|
+
module EnvProcess
|
7
|
+
describe 'EnvProcess' do
|
8
|
+
before(:all) do
|
9
|
+
Dotenv.overload(
|
10
|
+
'spec/fixtures/set_all_variables_nil.env'
|
11
|
+
)
|
12
|
+
end
|
13
|
+
# load the environment into instance variables
|
14
|
+
describe 'initialize' do
|
15
|
+
# wrapper class for envprocess methods
|
16
|
+
let(:test_class) do
|
17
|
+
Class.new do
|
18
|
+
include RakeTerraform::EnvProcess
|
19
|
+
def initialize
|
20
|
+
super
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
# instance of test class
|
25
|
+
let(:test_class_inst) { test_class.new }
|
26
|
+
context 'When an instance var is set through an environment var' do
|
27
|
+
it 'should not change if the environment variable changes' do
|
28
|
+
Dotenv.overload(
|
29
|
+
'spec/fixtures/envprocess_uniq_state_false_file_valid.env'
|
30
|
+
) do
|
31
|
+
expect(test_class_inst.unique_state).to eq(false)
|
32
|
+
end
|
33
|
+
Dotenv.overload(
|
34
|
+
'spec/fixtures/envprocess_uniq_state_true_file_valid.env'
|
35
|
+
) do
|
36
|
+
expect(test_class_inst.unique_state).to eq(false)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
context 'When unique state and TERRAFORM_STATE_FILE are provided ' \
|
41
|
+
'and valid' do
|
42
|
+
let(:state_file_str) { '/tmp/some_state.tfstate' }
|
43
|
+
Dotenv.overload(
|
44
|
+
'spec/fixtures/envprocess_uniq_state_true_file_valid.env'
|
45
|
+
) do
|
46
|
+
it 'should set state_file to the expected string' do
|
47
|
+
expect(test_class_inst.state_file).to eq(state_file_str)
|
48
|
+
end
|
49
|
+
it 'should set state_dir_var to nil' do
|
50
|
+
expect(test_class_inst.state_dir_var).to eq(nil)
|
51
|
+
end
|
52
|
+
it 'should set state_dir to nil' do
|
53
|
+
expect(test_class_inst.state_dir).to eq(nil)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
context 'When unique state and TERRAFORM_STATE_DIR_VAR are provided ' \
|
59
|
+
'and valid' do
|
60
|
+
let(:tf_state_dir_value) { 'terraform/state/staging' }
|
61
|
+
let(:tf_state_dir_var) { 'SOMETHING' }
|
62
|
+
let(:tf_state_file_path) do
|
63
|
+
"#{PROJECT_ROOT}/terraform/#{tf_state_dir_value}/terraform.tfstate"
|
64
|
+
end
|
65
|
+
Dotenv.overload(
|
66
|
+
'spec/fixtures/envprocess_uniq_state_dir_var_valid.env'
|
67
|
+
) do
|
68
|
+
it 'should set state_file to the expected string' do
|
69
|
+
expect(test_class_inst.state_file).to eq(tf_state_file_path)
|
70
|
+
end
|
71
|
+
it 'should set state_dir_var to "SOMETHING"' do
|
72
|
+
expect(test_class_inst.state_dir_var).to eq(tf_state_dir_var)
|
73
|
+
end
|
74
|
+
it 'should set state_dir to state/staging' do
|
75
|
+
expect(test_class_inst.state_dir).to eq(tf_state_dir_value)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
# this parent method calls a bunch of the other ones - certain amount of
|
82
|
+
# coverage from those methods contained here
|
83
|
+
describe 'tf_unique_state' do
|
84
|
+
# wrapper class for envprocess methods
|
85
|
+
let(:test_class) { Class.new { include RakeTerraform::EnvProcess } }
|
86
|
+
# instance of test class
|
87
|
+
let(:test_class_inst) { test_class.new }
|
88
|
+
context 'when TERRAFORM_UNIQUE_STATE var is false' do
|
89
|
+
it 'should return false' do
|
90
|
+
Dotenv.overload('spec/fixtures/envprocess_uniq_state_false.env')
|
91
|
+
expect(test_class_inst.tf_unique_state).to eq(false)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
context 'when TERRAFORM_UNIQUE_STATE is true but dependent ' \
|
95
|
+
'variables are missing' do
|
96
|
+
it 'should raise ArgumentError when no other variables are given' do
|
97
|
+
Dotenv.overload('spec/fixtures/envprocess_uniq_state_true.env')
|
98
|
+
expect { test_class_inst.tf_unique_state }
|
99
|
+
.to raise_error(
|
100
|
+
ArgumentError,
|
101
|
+
/^Both or neither of TERRAFORM_STATE_FILE/
|
102
|
+
)
|
103
|
+
end
|
104
|
+
it 'should return an ArgumentError where the target for ' \
|
105
|
+
'TERRAFORM_STATE_DIR_VAR is missing' do
|
106
|
+
Dotenv.overload(
|
107
|
+
'spec/fixtures/envprocess_uniq_state_missing_dir_var.env'
|
108
|
+
)
|
109
|
+
expect { test_class_inst.tf_unique_state }
|
110
|
+
.to raise_error(
|
111
|
+
ArgumentError,
|
112
|
+
/^Both or neither of TERRAFORM_STATE_FILE/
|
113
|
+
)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
context 'when TERRAFORM_UNIQUE_STATE is true but more than one' \
|
117
|
+
'optional variable is given' do
|
118
|
+
it 'should return an ArgumentError' do
|
119
|
+
Dotenv.overload('spec/fixtures/envprocess_uniq_state_true_both.env')
|
120
|
+
expect { test_class_inst.tf_unique_state }
|
121
|
+
.to raise_error(
|
122
|
+
ArgumentError,
|
123
|
+
/^Both or neither of TERRAFORM_STATE_FILE/
|
124
|
+
)
|
125
|
+
end
|
126
|
+
end
|
127
|
+
context 'when TERRAFORM_UNIQUE_STATE is true but dependent ' \
|
128
|
+
'variables are missing' do
|
129
|
+
it 'should return an ArgumentError' do
|
130
|
+
Dotenv.load('spec/fixtures/envprocess_uniq_state_true.env')
|
131
|
+
expect { test_class_inst.tf_unique_state }
|
132
|
+
.to raise_error(
|
133
|
+
ArgumentError,
|
134
|
+
/^Both or neither of TERRAFORM_STATE_FILE/
|
135
|
+
)
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
describe 'tf_state_file' do
|
141
|
+
# wrapper class for envprocess methods
|
142
|
+
let(:test_class) { Class.new { include RakeTerraform::EnvProcess } }
|
143
|
+
# instance of test class
|
144
|
+
let(:test_class_inst) { test_class.new }
|
145
|
+
let(:state_file_str) { '/tmp/some_state.tfstate' }
|
146
|
+
context 'when TERRAFORM_UNIQUE_STATE var is false but ' \
|
147
|
+
'TERRAFORM_STATE_FILE is given' do
|
148
|
+
it 'should still return the content of a valid var' do
|
149
|
+
Dotenv.overload(
|
150
|
+
'spec/fixtures/envprocess_uniq_state_false_file_valid.env'
|
151
|
+
)
|
152
|
+
expect(test_class_inst.tf_unique_state).to eq(false)
|
153
|
+
expect(test_class_inst.tf_state_file).to eq(state_file_str)
|
154
|
+
end
|
155
|
+
end
|
156
|
+
context 'when TERRAFORM_UNIQUE_STATE var is true and ' \
|
157
|
+
'TERRAFORM_STATE_FILE is given' do
|
158
|
+
it 'should return the content of a valid var' do
|
159
|
+
Dotenv.overload(
|
160
|
+
'spec/fixtures/envprocess_uniq_state_true_file_valid.env'
|
161
|
+
)
|
162
|
+
expect(test_class_inst.tf_unique_state).to eq(true)
|
163
|
+
expect(test_class_inst.tf_state_file).to eq(state_file_str)
|
164
|
+
end
|
165
|
+
end
|
166
|
+
context 'when TERRAFORM_STATE_FILE is _not_ given but ' \
|
167
|
+
'TERRAFORM_STATE_DIR_VAR and target variable are valid' do
|
168
|
+
let(:tf_state_dir_value) { 'terraform/state/staging' }
|
169
|
+
let(:tf_state_file_path) do
|
170
|
+
"#{PROJECT_ROOT}/#{tf_state_dir_value}/terraform.tfstate"
|
171
|
+
end
|
172
|
+
it 'should return the full path to the calculated state file' do
|
173
|
+
Dotenv.overload(
|
174
|
+
'spec/fixtures/envprocess_uniq_state_dir_var_valid.env'
|
175
|
+
)
|
176
|
+
expect(test_class_inst.tf_state_file).to eq(tf_state_file_path)
|
177
|
+
end
|
178
|
+
end
|
179
|
+
context 'when TERRAFORM_STATE_FILE is an invalid string' do
|
180
|
+
it 'should raise an ArgumentError' do
|
181
|
+
Dotenv.overload(
|
182
|
+
'spec/fixtures/envprocess_uniq_state_invalid_state_file_str.env'
|
183
|
+
)
|
184
|
+
expect { test_class_inst.tf_state_file }
|
185
|
+
.to raise_error(
|
186
|
+
ArgumentError,
|
187
|
+
/^Argument for TERRAFORM_STATE_FILE is invalid/
|
188
|
+
)
|
189
|
+
end
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
193
|
+
# see also: tf_state_dir for the content of the target var
|
194
|
+
describe 'tf_state_dir_var' do
|
195
|
+
# wrapper class for envprocess methods
|
196
|
+
let(:test_class) { Class.new { include RakeTerraform::EnvProcess } }
|
197
|
+
# instance of test class
|
198
|
+
let(:test_class_inst) { test_class.new }
|
199
|
+
context 'when TERRAFORM_STATE_DIR_VAR is an invalid string' do
|
200
|
+
it 'should raise an ArgumentError' do
|
201
|
+
Dotenv.overload(
|
202
|
+
'spec/fixtures/envprocess_uniq_state_dir_var_invalid.env'
|
203
|
+
)
|
204
|
+
expect { test_class_inst.tf_state_dir_var }
|
205
|
+
.to raise_error(
|
206
|
+
ArgumentError,
|
207
|
+
/^Argument for TERRAFORM_STATE_DIR_VAR is invalid/
|
208
|
+
)
|
209
|
+
end
|
210
|
+
end
|
211
|
+
end
|
212
|
+
|
213
|
+
describe 'tf_state_dir' do
|
214
|
+
# wrapper class for envprocess methods
|
215
|
+
let(:test_class) { Class.new { include RakeTerraform::EnvProcess } }
|
216
|
+
# instance of test class
|
217
|
+
let(:test_class_inst) { test_class.new }
|
218
|
+
let(:tf_state_dir_value) { 'terraform/state/staging' }
|
219
|
+
context 'when TERRAFORM_STATE_DIR_VAR points to a valid value' do
|
220
|
+
it 'should return the value ' do
|
221
|
+
Dotenv.overload(
|
222
|
+
'spec/fixtures/envprocess_uniq_state_dir_var_valid.env'
|
223
|
+
)
|
224
|
+
expect(test_class_inst.tf_state_dir).to eq(tf_state_dir_value)
|
225
|
+
end
|
226
|
+
end
|
227
|
+
end
|
228
|
+
|
229
|
+
describe 'state_dir_full_path' do
|
230
|
+
# wrapper class for envprocess methods
|
231
|
+
let(:test_class) { Class.new { prepend RakeTerraform::EnvProcess } }
|
232
|
+
let(:test_class_inst) { test_class.new }
|
233
|
+
# instance of test class
|
234
|
+
let(:tf_environment) { 'terraform/eu-west-1' }
|
235
|
+
let(:tf_state_dir_value) { 'state/staging' }
|
236
|
+
let(:tf_state_file_path) do
|
237
|
+
"#{PROJECT_ROOT}/terraform/#{tf_state_dir_value}/terraform.tfstate"
|
238
|
+
end
|
239
|
+
context 'when tf_environment is "state/staging"' do
|
240
|
+
it 'should return the full path to the state file' do
|
241
|
+
Dotenv.overload(
|
242
|
+
'spec/fixtures/envprocess_uniq_state_dir_var_valid.env'
|
243
|
+
)
|
244
|
+
expect(test_class_inst.state_dir_full_path)
|
245
|
+
.to eq(tf_state_file_path)
|
246
|
+
end
|
247
|
+
end
|
248
|
+
end
|
249
|
+
|
250
|
+
describe 'default_state_file_name' do
|
251
|
+
# wrapper class for envprocess methods
|
252
|
+
let(:test_class) { Class.new { include RakeTerraform::EnvProcess } }
|
253
|
+
# instance of test class
|
254
|
+
let(:test_class_inst) { test_class.new }
|
255
|
+
let(:default_state_file_name) { 'terraform.tfstate' }
|
256
|
+
it 'should return the value of the default state file name' do
|
257
|
+
expect(test_class_inst.default_state_file_name)
|
258
|
+
.to eq(default_state_file_name)
|
259
|
+
end
|
260
|
+
end
|
261
|
+
end
|
262
|
+
end
|
263
|
+
end
|
@@ -0,0 +1,118 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'rake-terraform/plantask'
|
3
|
+
|
4
|
+
module RakeTerraform
|
5
|
+
module PlanTask
|
6
|
+
describe Config do
|
7
|
+
before(:all) do
|
8
|
+
Dotenv.overload(
|
9
|
+
'spec/fixtures/set_all_variables_nil.env'
|
10
|
+
)
|
11
|
+
end
|
12
|
+
let(:non_existent_input_dir) { "#{PROJECT_ROOT}/non/existent/input/dir" }
|
13
|
+
let(:non_existent_output_file) do
|
14
|
+
"#{PROJECT_ROOT}/non/existent/output/file.tf"
|
15
|
+
end
|
16
|
+
let(:default_input_dir_str) { "#{PROJECT_ROOT}/terraform" }
|
17
|
+
let(:default_aws_project_str) { 'default' }
|
18
|
+
let(:default_output_file_str) do
|
19
|
+
"#{PROJECT_ROOT}/output/terraform/plan.tf"
|
20
|
+
end
|
21
|
+
let(:default_credentials_str) { File.expand_path('~/.aws/credentials') }
|
22
|
+
let(:default_opts_hash) do
|
23
|
+
{
|
24
|
+
input_dir: default_input_dir_str,
|
25
|
+
output_file: default_output_file_str,
|
26
|
+
credentials: default_credentials_str,
|
27
|
+
aws_project: default_aws_project_str,
|
28
|
+
unique_state: false,
|
29
|
+
state_file: nil
|
30
|
+
}
|
31
|
+
end
|
32
|
+
|
33
|
+
before(:each) do
|
34
|
+
# reset default config object before each test
|
35
|
+
@default_config = RakeTerraform::PlanTask::Config.new
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'should initialize successfully with no arguments' do
|
39
|
+
expect { RakeTerraform::PlanTask::Config.new }.to_not raise_error
|
40
|
+
end
|
41
|
+
|
42
|
+
describe 'opts' do
|
43
|
+
Dotenv.overload(
|
44
|
+
'spec/fixtures/set_all_variables_nil.env'
|
45
|
+
) do
|
46
|
+
context 'with a default config object' do
|
47
|
+
it 'should return the expected default keys and values' do
|
48
|
+
default_opts_hash.keys.each do |key|
|
49
|
+
expect(@default_config.opts).to have_key(key)
|
50
|
+
expect(@default_config.opts[key]).to eq(default_opts_hash[key])
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'should reflect new values when the config object is updated' do
|
55
|
+
@default_config.input_dir = non_existent_input_dir
|
56
|
+
@default_config.output_file = non_existent_output_file
|
57
|
+
expect(@default_config.opts[:input_dir])
|
58
|
+
.to eq(non_existent_input_dir)
|
59
|
+
expect(@default_config.opts[:output_file])
|
60
|
+
.to eq(non_existent_output_file)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
describe 'input_dir' do
|
67
|
+
after(:all) do
|
68
|
+
Dotenv.overload(
|
69
|
+
'spec/fixtures/set_all_variables_nil.env'
|
70
|
+
)
|
71
|
+
end
|
72
|
+
let(:tf_environment) { 'terraform/eu-west-1' }
|
73
|
+
let(:tf_state_dir_value) { "#{tf_environment}/state/staging" }
|
74
|
+
let(:tf_state_file_path) do
|
75
|
+
"#{PROJECT_ROOT}/#{tf_state_dir_value}/terraform.tfstate"
|
76
|
+
end
|
77
|
+
context 'with a default config object' do
|
78
|
+
it 'should set the input_dir to PROJECT_ROOT/terraform' do
|
79
|
+
expect(@default_config.input_dir).to eq(default_input_dir_str)
|
80
|
+
expect(@default_config.tf_environment).to eq(nil)
|
81
|
+
expect(@default_config.state_file).to eq(nil)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
context 'when I set the input_dir to something else and state_dir ' \
|
85
|
+
'is true' do
|
86
|
+
Dotenv.overload(
|
87
|
+
'spec/fixtures/envprocess_uniq_state_dir_var_valid.env'
|
88
|
+
) do
|
89
|
+
it 'should update input_dir, tf_environment and state_file' do
|
90
|
+
@default_config.input_dir = tf_environment
|
91
|
+
expect(@default_config.tf_environment).to eq(tf_environment)
|
92
|
+
expect(@default_config.state_file).to eq(tf_state_file_path)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
context 'when I set the input_dir to something else and state_dir ' \
|
97
|
+
'is false' do
|
98
|
+
Dotenv.overload(
|
99
|
+
'spec/fixtures/envprocess_uniq_state_true_file_valid.env'
|
100
|
+
) do
|
101
|
+
it 'should update input_dir, tf_environment but _not_ state_file' do
|
102
|
+
@default_config.input_dir = tf_environment
|
103
|
+
expect(@default_config.tf_environment).to eq(tf_environment)
|
104
|
+
expect(@default_config.state_file).to eq(nil)
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
describe Task do
|
112
|
+
it 'should raise an ArgumentError with no arguments' do
|
113
|
+
expect { RakeTerraform::PlanTask::Task.new }
|
114
|
+
.to raise_error(ArgumentError)
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
@@ -0,0 +1,174 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'rake-terraform/terraformcmd'
|
3
|
+
|
4
|
+
module RakeTerraform
|
5
|
+
# mock kernel calls to terraform binary
|
6
|
+
module TerraformCmd
|
7
|
+
describe 'TerraformCmd' do
|
8
|
+
# wrapper class for terraformcmd methods
|
9
|
+
let(:test_class) { Class.new { include RakeTerraform::TerraformCmd } }
|
10
|
+
# instance of test class
|
11
|
+
let(:test_class_inst) { test_class.new }
|
12
|
+
before(:all) do
|
13
|
+
Dotenv.overload(
|
14
|
+
'spec/fixtures/set_all_variables_nil.env'
|
15
|
+
)
|
16
|
+
end
|
17
|
+
|
18
|
+
describe 'tf_get' do
|
19
|
+
let(:get_cmd) { 'terraform get' }
|
20
|
+
let(:get_up_cmd) { 'terraform get -update' }
|
21
|
+
context 'with no arguments' do
|
22
|
+
it 'should call terraform get' do
|
23
|
+
expect(test_class_inst).to receive(:system)
|
24
|
+
.with(get_cmd)
|
25
|
+
test_class_inst.tf_get
|
26
|
+
end
|
27
|
+
end
|
28
|
+
context 'with update=true' do
|
29
|
+
it 'should call terraform get -update' do
|
30
|
+
expect(test_class_inst).to receive(:system)
|
31
|
+
.with(get_up_cmd)
|
32
|
+
test_class_inst.tf_get(true)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe 'tf_plan' do
|
38
|
+
let(:default_plan_cmd) { 'terraform plan -module-depth 2' }
|
39
|
+
let(:default_output_file) { "#{PROJECT_ROOT}/output/terraform/plan.tf" }
|
40
|
+
let(:cred_plan_cmd) do
|
41
|
+
"terraform plan -module-depth 2 -var access_key=\"#{access_key}\"" \
|
42
|
+
" -var secret_key=\"#{secret_key}\""
|
43
|
+
end
|
44
|
+
let(:output_plan_cmd) do
|
45
|
+
"terraform plan -module-depth 2 -out #{default_output_file}"
|
46
|
+
end
|
47
|
+
let(:module_arg_cmd) { 'terraform plan -module-depth 56' }
|
48
|
+
let(:module_arg) { 56 }
|
49
|
+
let(:access_key) { 'BISFITPONHYWERBENTEIN' }
|
50
|
+
let(:secret_key) { 'trujRepGidjurivGomAyctyeOpVuWiuvafeeshjuo' }
|
51
|
+
let(:state_file) do
|
52
|
+
"#{PROJECT_ROOT}/terraform/test_env/state_1.tfstate"
|
53
|
+
end
|
54
|
+
let(:state_file_cmd) do
|
55
|
+
"terraform plan -module-depth 2 -state #{state_file}"
|
56
|
+
end
|
57
|
+
context 'with no arguments' do
|
58
|
+
it 'should call terraform plan' do
|
59
|
+
expect(test_class_inst).to receive(:system)
|
60
|
+
.with(default_plan_cmd)
|
61
|
+
test_class_inst.tf_plan
|
62
|
+
end
|
63
|
+
end
|
64
|
+
context 'with just an access_key' do
|
65
|
+
it 'should raise an ArgumentError' do
|
66
|
+
expect { test_class_inst.tf_plan(access_key) }
|
67
|
+
.to raise_error(ArgumentError,
|
68
|
+
'Only one of access_key or secret_key given')
|
69
|
+
end
|
70
|
+
end
|
71
|
+
context 'with just a secret_key' do
|
72
|
+
it 'should raise an ArgumentError' do
|
73
|
+
expect { test_class_inst.tf_plan(nil, secret_key) }
|
74
|
+
.to raise_error(ArgumentError,
|
75
|
+
'Only one of access_key or secret_key given')
|
76
|
+
end
|
77
|
+
end
|
78
|
+
context 'with both an access_key and a secret_key' do
|
79
|
+
it 'should call terraform plan with those vars configured' do
|
80
|
+
expect(test_class_inst).to receive(:system)
|
81
|
+
.with(cred_plan_cmd)
|
82
|
+
test_class_inst.tf_plan(access_key, secret_key)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
context 'with an output file' do
|
86
|
+
it 'should call terraform plan with an output file' do
|
87
|
+
expect(test_class_inst).to receive(:system)
|
88
|
+
.with(output_plan_cmd)
|
89
|
+
test_class_inst.tf_plan(nil, nil, default_output_file)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
context 'with an state file' do
|
93
|
+
it 'should call terraform plan with a state file' do
|
94
|
+
expect(test_class_inst).to receive(:system)
|
95
|
+
.with(state_file_cmd)
|
96
|
+
test_class_inst.tf_plan(nil, nil, nil, state_file)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
context 'where module_depth is given as an argument' do
|
100
|
+
it 'should call terraform plan with updated module-depth argument' do
|
101
|
+
expect(test_class_inst).to receive(:system)
|
102
|
+
.with(module_arg_cmd)
|
103
|
+
test_class_inst.tf_plan(nil, nil, nil, nil, module_arg)
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
describe 'tf_show' do
|
109
|
+
let(:default_plan_file) { "#{PROJECT_ROOT}/output/terraform/plan.tf" }
|
110
|
+
let(:default_show_cmd) do
|
111
|
+
"terraform show -module-depth 2 #{default_plan_file}"
|
112
|
+
end
|
113
|
+
let(:module_arg_cmd) do
|
114
|
+
"terraform show -module-depth 56 #{default_plan_file}"
|
115
|
+
end
|
116
|
+
let(:module_arg) { 56 }
|
117
|
+
context 'with no arguments' do
|
118
|
+
it 'should raise an ArgumentError' do
|
119
|
+
expect { test_class_inst.tf_show }
|
120
|
+
.to raise_error(ArgumentError)
|
121
|
+
end
|
122
|
+
end
|
123
|
+
context 'with a plan file argument' do
|
124
|
+
it 'should call terraform show with the plan file' do
|
125
|
+
expect(test_class_inst).to receive(:system)
|
126
|
+
.with(default_show_cmd)
|
127
|
+
test_class_inst.tf_show(default_plan_file)
|
128
|
+
end
|
129
|
+
end
|
130
|
+
context 'where module_depth is given as an argument' do
|
131
|
+
it 'should call terraform show with updated module-depth argument' do
|
132
|
+
expect(test_class_inst).to receive(:system)
|
133
|
+
.with(module_arg_cmd)
|
134
|
+
test_class_inst.tf_show(default_plan_file, module_arg)
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
describe 'tf_apply' do
|
140
|
+
let(:default_plan_file) { "#{PROJECT_ROOT}/output/terraform/plan.tf" }
|
141
|
+
let(:default_apply_cmd) do
|
142
|
+
"terraform apply #{default_plan_file}"
|
143
|
+
end
|
144
|
+
let(:state_file) do
|
145
|
+
"#{PROJECT_ROOT}/terraform/test_env/state_1.tfstate"
|
146
|
+
end
|
147
|
+
let(:state_file_cmd) do
|
148
|
+
'terraform apply -state ' \
|
149
|
+
"#{state_file} #{default_plan_file}"
|
150
|
+
end
|
151
|
+
context 'with no arguments' do
|
152
|
+
it 'should raise an ArgumentError' do
|
153
|
+
expect { test_class_inst.tf_apply }
|
154
|
+
.to raise_error(ArgumentError)
|
155
|
+
end
|
156
|
+
end
|
157
|
+
context 'with a plan file argument' do
|
158
|
+
it 'should call terraform apply with the plan file' do
|
159
|
+
expect(test_class_inst).to receive(:system)
|
160
|
+
.with(default_apply_cmd)
|
161
|
+
test_class_inst.tf_apply(default_plan_file)
|
162
|
+
end
|
163
|
+
end
|
164
|
+
context 'where state file is given as an argument' do
|
165
|
+
it 'should call terraform apply with a state file argument' do
|
166
|
+
expect(test_class_inst).to receive(:system)
|
167
|
+
.with(state_file_cmd)
|
168
|
+
test_class_inst.tf_apply(default_plan_file, state_file)
|
169
|
+
end
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|