kitchen-terraform 6.1.0 → 7.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of kitchen-terraform might be problematic. Click here for more details.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/README.md +49 -36
- data/lib/kitchen/driver/terraform.rb +71 -31
- data/lib/kitchen/provisioner/terraform.rb +10 -23
- data/lib/kitchen/terraform/config_attribute/client.rb +18 -0
- data/lib/kitchen/terraform/config_attribute/systems.rb +14 -0
- data/lib/kitchen/terraform/config_attribute_type/hash_of_symbols_and_strings.rb +1 -1
- data/lib/kitchen/terraform/config_attribute_type/integer.rb +1 -1
- data/lib/kitchen/terraform/configurable.rb +0 -1
- data/lib/kitchen/terraform/driver/create.rb +12 -27
- data/lib/kitchen/terraform/driver/destroy.rb +15 -41
- data/lib/kitchen/terraform/outputs_reader.rb +13 -19
- data/lib/kitchen/terraform/provisioner/converge.rb +18 -39
- data/lib/kitchen/terraform/transport/connection.rb +74 -0
- data/lib/kitchen/terraform/transport.rb +23 -0
- data/lib/kitchen/terraform/verifier.rb +23 -0
- data/lib/kitchen/terraform/version.rb +1 -1
- data/lib/kitchen/transport/terraform.rb +137 -0
- data/lib/kitchen/verifier/terraform.rb +11 -3
- data.tar.gz.sig +0 -0
- metadata +39 -61
- metadata.gz.sig +0 -0
- data/lib/kitchen/terraform/command_executor.rb +0 -58
- data/lib/kitchen/terraform/shell_out.rb +0 -114
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '06987257a4c260d1b96418960d13dfa4098745d75e175da00abd74b9e79578a2'
|
4
|
+
data.tar.gz: b160ce915cde5c453b646e7afa0bf5f74c9b62dc134cedd4ce275e1078359cfa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2f8fdd9a82a62c2e97d78935b95caee26f51a0e1df52acf511d1354bace0a740c1605fad44fdb7b5a089c7796b973236db980194505662ca2862dc8edbb08690
|
7
|
+
data.tar.gz: 03f6b585277114646e9fffc00e3ee4c562d3f3a8c0ba9185a601d213097114740ab3f4fc1ad7c9c1fe8dc373e4f7152bbb38cd8cf444517b5e5f0c556f999d32
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data/README.md
CHANGED
@@ -6,17 +6,16 @@
|
|
6
6
|
[![Gem downloads version][gem-downloads-version-shield]][kitchen-terraform-gem]
|
7
7
|
[![Gem downloads total][gem-downloads-total-shield]][kitchen-terraform-gem]
|
8
8
|
|
9
|
-
[![
|
10
|
-
[![
|
9
|
+
[![Delivery][delivery-shield]][delivery-workflow]
|
10
|
+
[![Pages Build and Deployment][pages-build-deployment-shield]][pages-build-deployment-workflow]
|
11
11
|
[![Code coverage][code-coverage-shield]][code-coverage]
|
12
12
|
[![Maintainability][maintainability-shield]][maintainability]
|
13
13
|
[![Technical debt][technical-debt-shield]][technical-debt]
|
14
|
-
[![Dependencies][hakiri-shield]][hakiri]
|
15
14
|
|
16
15
|
[![Gitter chat][gitter-shield]][gitter]
|
17
16
|
|
18
|
-
Kitchen-Terraform provides a set of [Kitchen][kitchen] plugins
|
19
|
-
which enable the use of Kitchen to converge a [Terraform][terraform]
|
17
|
+
Kitchen-Terraform provides a set of [Test Kitchen][test-kitchen] plugins
|
18
|
+
which enable the use of Test Kitchen to converge a [Terraform][terraform]
|
20
19
|
configuration and verify the resulting infrastructure systems with
|
21
20
|
[InSpec][inspec] controls.
|
22
21
|
|
@@ -73,20 +72,28 @@ the semantic versioning of the Ruby gem.
|
|
73
72
|
|
74
73
|
> Defining Kitchen-Terraform as a dependency for Bundler in a Gemfile
|
75
74
|
|
75
|
+
---
|
76
|
+
|
76
77
|
```ruby
|
77
78
|
source "https://rubygems.org/" do
|
78
|
-
gem "kitchen-terraform", "~>
|
79
|
+
gem "kitchen-terraform", "~> 7.0"
|
79
80
|
end
|
80
81
|
```
|
81
82
|
|
83
|
+
---
|
84
|
+
|
82
85
|
Second, run the following command.
|
83
86
|
|
84
87
|
> Installing Kitchen-Terraform with Bundler
|
85
88
|
|
89
|
+
---
|
90
|
+
|
86
91
|
```sh
|
87
92
|
bundle install
|
88
93
|
```
|
89
94
|
|
95
|
+
---
|
96
|
+
|
90
97
|
The preceding command will create a `Gemfile.lock` comprising a list
|
91
98
|
of the resolved Ruby gem dependencies.
|
92
99
|
|
@@ -101,10 +108,14 @@ example.
|
|
101
108
|
|
102
109
|
> Installing Kitchen-Terraform with RubyGems
|
103
110
|
|
111
|
+
---
|
112
|
+
|
104
113
|
```sh
|
105
|
-
gem install kitchen-terraform --version
|
114
|
+
gem install kitchen-terraform --version 7.0.0
|
106
115
|
```
|
107
116
|
|
117
|
+
---
|
118
|
+
|
108
119
|
This approach is not recommended as it requires more effort to install
|
109
120
|
the gem in a manner that is reproducible and free of dependency
|
110
121
|
conflicts.
|
@@ -124,25 +135,34 @@ Ed25519-type SSH keys.
|
|
124
135
|
|
125
136
|
## Usage
|
126
137
|
|
138
|
+
A familiarity with [Test Kitchen][test-kitchen] workflows and commands is required to use Kitchen-Terraform.
|
139
|
+
|
127
140
|
### Configuration
|
128
141
|
|
129
|
-
Kitchen-Terraform provides
|
142
|
+
Kitchen-Terraform provides four Test Kitchen plugins which must be
|
130
143
|
configured in a
|
131
|
-
[Kitchen configuration file][kitchen-configuration-file] in
|
144
|
+
[Test Kitchen configuration file][kitchen-configuration-file] in
|
132
145
|
order to successfully test Terraform configuration.
|
133
146
|
|
134
|
-
The [Terraform driver][terraform-driver]
|
135
|
-
Terraform
|
147
|
+
The [Terraform driver][terraform-driver] is the bridge between Test
|
148
|
+
Kitchen and Terraform. It manages the [state][terraform-state] of the
|
149
|
+
Terraform root module under test by shelling out and running Terraform commands.
|
136
150
|
|
137
|
-
The [Terraform provisioner][terraform-provisioner]
|
138
|
-
|
151
|
+
The [Terraform provisioner][terraform-provisioner] applies changes to
|
152
|
+
the Terraform state based on the configuration of the root module.
|
139
153
|
|
140
|
-
The [Terraform
|
141
|
-
Terraform
|
154
|
+
The [Terraform transport][terraform-transport] is responsible for the
|
155
|
+
integration with the Terraform CLI.
|
156
|
+
|
157
|
+
The [Terraform verifier][terraform-verifier] utilizes InSpec to verify
|
158
|
+
the behaviour and state of resources in the Terraform state.
|
142
159
|
|
143
160
|
More information can be found in the
|
144
161
|
[Ruby gem documentation][ruby-gem-documentation].
|
145
162
|
|
163
|
+
The `kitchen doctor` command can be used to validate the system and the
|
164
|
+
configuration file.
|
165
|
+
|
146
166
|
### Caveats
|
147
167
|
|
148
168
|
Versions of Terraform in the 0.11 series may cause `kitchen test` to
|
@@ -159,7 +179,7 @@ Several tutorials are available on the
|
|
159
179
|
|
160
180
|
The integration tests for Kitchen-Terraform can also be viewed as
|
161
181
|
examples of how it works. The
|
162
|
-
[integration test Kitchen configuration file][int-kitchen-config]
|
182
|
+
[integration test Test Kitchen configuration file][int-kitchen-config]
|
163
183
|
and the [integration test directory][test-directory] provide several
|
164
184
|
functional examples which exercise various features of
|
165
185
|
Kitchen-Terraform.
|
@@ -226,9 +246,6 @@ Kitchen-Terraform is distributed under the [Apache License][license].
|
|
226
246
|
|
227
247
|
<!-- Markdown links and image definitions -->
|
228
248
|
|
229
|
-
[appveyor-build-status-shield]: https://ci.appveyor.com/api/projects/status/8d7t014gij5grk5r/branch/master?svg=true
|
230
|
-
[appveyor-build-status]: https://ci.appveyor.com/project/aaron-lane/kitchen-terraform/branch/master
|
231
|
-
[bundler-getting-started]: https://bundler.io/#getting-started
|
232
249
|
[bundler-in-depth]: https://bundler.io/gemfile.html
|
233
250
|
[bundler]: https://bundler.io/index.html#getting-started
|
234
251
|
[changelog]: https://github.com/newcontext-oss/kitchen-terraform/blob/master/CHANGELOG.md
|
@@ -236,37 +253,30 @@ Kitchen-Terraform is distributed under the [Apache License][license].
|
|
236
253
|
[code-coverage]: https://codeclimate.com/github/newcontext-oss/kitchen-terraform/
|
237
254
|
[contributing-document]: https://github.com/newcontext-oss/kitchen-terraform/blob/master/CONTRIBUTING.md
|
238
255
|
[contributors]: https://github.com/newcontext-oss/kitchen-terraform/graphs/contributors
|
239
|
-
[
|
240
|
-
[
|
241
|
-
[
|
256
|
+
[copado-github]: https://github.com/CopadoSolutions
|
257
|
+
[copado-linkedin]: https://www.linkedin.com/company/copado-solutions-s.l
|
258
|
+
[copado-twitter]: https://twitter.com/CopadoSolutions
|
259
|
+
[copado]: https://copado.com/
|
260
|
+
[delivery-shield]: https://github.com/newcontext-oss/kitchen-terraform/actions/workflows/delivery.yml/badge.svg
|
261
|
+
[delivery-workflow]: https://github.com/newcontext-oss/kitchen-terraform/actions/workflows/delivery.yml
|
242
262
|
[gem-downloads-total-shield]: https://img.shields.io/gem/dt/kitchen-terraform.svg
|
243
263
|
[gem-downloads-version-shield]: https://img.shields.io/gem/dtv/kitchen-terraform.svg
|
244
264
|
[gem-version-shield]: https://img.shields.io/gem/v/kitchen-terraform.svg
|
245
265
|
[gitter-shield]: https://img.shields.io/gitter/room/kitchen-terraform/Lobby.svg
|
246
266
|
[gitter]: https://gitter.im/kitchen-terraform/Lobby
|
247
|
-
[
|
248
|
-
[hakiri]: https://hakiri.io/github/newcontext-oss/kitchen-terraform/
|
249
|
-
[inspec]: https://www.inspec.io/
|
267
|
+
[inspec]: https://community.chef.io/tools/chef-inspec
|
250
268
|
[int-kitchen-config]: https://github.com/newcontext-oss/kitchen-terraform/blob/master/kitchen.yml
|
251
|
-
[issue-271]: https://github.com/newcontext-oss/kitchen-terraform/issues/271
|
252
|
-
[kitchen]: http://kitchen.ci/index.html
|
253
269
|
[kitchen-configuration-file]: https://docs.chef.io/config_yml_kitchen.html
|
254
270
|
[kitchen-terraform-gem]: https://rubygems.org/gems/kitchen-terraform
|
255
271
|
[kitchen-terraform-logo]: https://raw.githubusercontent.com/newcontext-oss/kitchen-terraform/master/assets/logo.png
|
256
272
|
[kitchen-terraform-tutorials]: https://newcontext-oss.github.io/kitchen-terraform/tutorials/
|
257
|
-
[kitchen-tests-workflow]: https://github.com/newcontext-oss/kitchen-terraform/actions/workflows/kitchen-tests.yml
|
258
|
-
[kitchen-tests-workflow-shield]: https://github.com/newcontext-oss/kitchen-terraform/actions/workflows/kitchen-tests.yml/badge.svg
|
259
273
|
[license]: https://github.com/newcontext-oss/kitchen-terraform/blob/master/LICENSE
|
260
274
|
[maintainability-shield]: https://img.shields.io/codeclimate/maintainability-percentage/newcontext-oss/kitchen-terraform.svg
|
261
275
|
[maintainability]: https://codeclimate.com/github/newcontext-oss/kitchen-terraform/
|
262
|
-
[
|
263
|
-
[
|
264
|
-
[copado-twitter]: https://twitter.com/CopadoSolutions
|
265
|
-
[copado]: https://copado.com/
|
276
|
+
[pages-build-deployment-shield]: https://github.com/newcontext-oss/kitchen-terraform/actions/workflows/pages/pages-build-deployment/badge.svg
|
277
|
+
[pages-build-deployment-workflow]: https://github.com/newcontext-oss/kitchen-terraform/actions/workflows/pages/pages-build-deployment
|
266
278
|
[rbenv]: https://github.com/rbenv/rbenv
|
267
279
|
[rbnacl-installation]: https://github.com/crypto-rb/rbnacl/tree/v4.0.2#installation
|
268
|
-
[rspec-tests-workflow]: https://github.com/newcontext-oss/kitchen-terraform/actions/workflows/rspec-tests.yml
|
269
|
-
[rspec-tests-workflow-shield]: https://github.com/newcontext-oss/kitchen-terraform/actions/workflows/rspec-tests.yml/badge.svg
|
270
280
|
[ruby-branches]: https://www.ruby-lang.org/en/downloads/branches/
|
271
281
|
[ruby-gem-documentation]: http://www.rubydoc.info/github/newcontext-oss/kitchen-terraform/
|
272
282
|
[ruby-gems-what-is]: http://guides.rubygems.org/ruby-gems-what-is/index.html
|
@@ -275,11 +285,14 @@ Kitchen-Terraform is distributed under the [Apache License][license].
|
|
275
285
|
[rubygems-installing-gems]: http://guides.rubygems.org/rubygems-basics/#rubygems-installing-gems
|
276
286
|
[technical-debt-shield]: https://img.shields.io/codeclimate/tech-debt/newcontext-oss/kitchen-terraform.svg
|
277
287
|
[technical-debt]: https://codeclimate.com/github/newcontext-oss/kitchen-terraform/
|
278
|
-
[terraform-cli]: https://
|
288
|
+
[terraform-cli]: https://developer.hashicorp.com/terraform/cli/commands
|
279
289
|
[terraform-driver]: http://www.rubydoc.info/github/newcontext-oss/kitchen-terraform/Kitchen/Driver/Terraform
|
280
290
|
[terraform-install]: https://www.terraform.io/intro/getting-started/install.html
|
281
291
|
[terraform-provisioner]: http://www.rubydoc.info/github/newcontext-oss/kitchen-terraform/Kitchen/Provisioner/Terraform
|
292
|
+
[terraform-state]: https://developer.hashicorp.com/terraform/language/state
|
293
|
+
[terraform-transport]: http://www.rubydoc.info/github/newcontext-oss/kitchen-terraform/Kitchen/Transport/Terraform
|
282
294
|
[terraform-verifier]: http://www.rubydoc.info/github/newcontext-oss/kitchen-terraform/Kitchen/Verifier/Terraform
|
283
295
|
[terraform]: https://www.terraform.io/
|
284
296
|
[test-directory]: https://github.com/newcontext-oss/kitchen-terraform/tree/master/test
|
297
|
+
[test-kitchen]: http://kitchen.ci/
|
285
298
|
[tfenv]: https://github.com/kamatama41/tfenv
|
@@ -32,6 +32,7 @@ require "kitchen/terraform/configurable"
|
|
32
32
|
require "kitchen/terraform/driver/create"
|
33
33
|
require "kitchen/terraform/driver/destroy"
|
34
34
|
require "kitchen/terraform/version_verifier"
|
35
|
+
require "kitchen/transport/terraform"
|
35
36
|
require "rubygems"
|
36
37
|
require "shellwords"
|
37
38
|
|
@@ -44,9 +45,9 @@ module Kitchen
|
|
44
45
|
# @see http://www.rubydoc.info/gems/test-kitchen/Kitchen/Driver
|
45
46
|
module Driver
|
46
47
|
|
47
|
-
# The driver is the bridge between Test Kitchen and Terraform. It manages the
|
48
|
-
# {https://
|
49
|
-
# Terraform commands.
|
48
|
+
# The Terraform driver is the bridge between Test Kitchen and Terraform. It manages the
|
49
|
+
# {https://developer.hashicorp.com/terraform/language/state state} of the Terraform root module under test by
|
50
|
+
# shelling out and running Terraform commands.
|
50
51
|
#
|
51
52
|
# === Commands
|
52
53
|
#
|
@@ -76,6 +77,8 @@ module Kitchen
|
|
76
77
|
#
|
77
78
|
# ==== client
|
78
79
|
#
|
80
|
+
# driver.client is deprecated; use transport.client instead.
|
81
|
+
#
|
79
82
|
# {include:Kitchen::Terraform::ConfigAttribute::Client}
|
80
83
|
#
|
81
84
|
# ==== color
|
@@ -84,6 +87,8 @@ module Kitchen
|
|
84
87
|
#
|
85
88
|
# ==== command_timeout
|
86
89
|
#
|
90
|
+
# driver.command_timeout is deprecated; use transport.command_timeout instead.
|
91
|
+
#
|
87
92
|
# {include:Kitchen::Terraform::ConfigAttribute::CommandTimeout}
|
88
93
|
#
|
89
94
|
# ==== lock
|
@@ -104,6 +109,8 @@ module Kitchen
|
|
104
109
|
#
|
105
110
|
# ==== root_module_directory
|
106
111
|
#
|
112
|
+
# driver.root_module_directory is deprecated; use transport.root_module_directory instead.
|
113
|
+
#
|
107
114
|
# {include:Kitchen::Terraform::ConfigAttribute::RootModuleDirectory}
|
108
115
|
#
|
109
116
|
# ==== variable_files
|
@@ -135,20 +142,15 @@ module Kitchen
|
|
135
142
|
class Terraform < ::Kitchen::Driver::Base
|
136
143
|
kitchen_driver_api_version 2
|
137
144
|
|
138
|
-
no_parallel_for(
|
139
|
-
:create,
|
140
|
-
:converge,
|
141
|
-
:setup,
|
142
|
-
:destroy
|
143
|
-
)
|
144
|
-
|
145
145
|
include ::Kitchen::Terraform::ConfigAttribute::BackendConfigurations
|
146
146
|
|
147
147
|
include ::Kitchen::Terraform::ConfigAttribute::Client
|
148
|
+
deprecate_config_for :client, "use transport.client instead"
|
148
149
|
|
149
150
|
include ::Kitchen::Terraform::ConfigAttribute::Color
|
150
151
|
|
151
152
|
include ::Kitchen::Terraform::ConfigAttribute::CommandTimeout
|
153
|
+
deprecate_config_for :command_timeout, "use transport.command_timeout instead"
|
152
154
|
|
153
155
|
include ::Kitchen::Terraform::ConfigAttribute::Lock
|
154
156
|
|
@@ -159,6 +161,7 @@ module Kitchen
|
|
159
161
|
include ::Kitchen::Terraform::ConfigAttribute::PluginDirectory
|
160
162
|
|
161
163
|
include ::Kitchen::Terraform::ConfigAttribute::RootModuleDirectory
|
164
|
+
deprecate_config_for :root_module_directory, "use transport.root_module_directory instead"
|
162
165
|
|
163
166
|
include ::Kitchen::Terraform::ConfigAttribute::VariableFiles
|
164
167
|
|
@@ -168,13 +171,21 @@ module Kitchen
|
|
168
171
|
|
169
172
|
include ::Kitchen::Terraform::Configurable
|
170
173
|
|
174
|
+
attr_reader :transport
|
175
|
+
|
171
176
|
# Creates a Test Kitchen instance by initializing the working directory and creating a test workspace.
|
172
177
|
#
|
173
|
-
# @param
|
178
|
+
# @param state [Hash] the mutable instance and driver state.
|
174
179
|
# @raise [Kitchen::ActionFailed] if the result of the action is a failure.
|
175
180
|
# @return [void]
|
176
|
-
def create(
|
177
|
-
|
181
|
+
def create(state)
|
182
|
+
::Kitchen::Terraform::Driver::Create.new(
|
183
|
+
config: config,
|
184
|
+
connection: transport.connection(state),
|
185
|
+
logger: logger,
|
186
|
+
version_requirement: version_requirement,
|
187
|
+
workspace_name: workspace_name,
|
188
|
+
).call
|
178
189
|
rescue => error
|
179
190
|
action_failed.call message: error.message
|
180
191
|
end
|
@@ -182,35 +193,63 @@ module Kitchen
|
|
182
193
|
# Destroys a Test Kitchen instance by initializing the working directory, selecting the test workspace,
|
183
194
|
# deleting the state, selecting the default workspace, and deleting the test workspace.
|
184
195
|
#
|
185
|
-
# @param
|
196
|
+
# @param state [Hash] the mutable instance and driver state.
|
186
197
|
# @raise [Kitchen::ActionFailed] if the result of the action is a failure.
|
187
198
|
# @return [void]
|
188
|
-
def destroy(
|
189
|
-
|
199
|
+
def destroy(state)
|
200
|
+
::Kitchen::Terraform::Driver::Destroy.new(
|
201
|
+
config: config,
|
202
|
+
connection: transport.connection(state.merge(environment: { "TF_WARN_OUTPUT_ERRORS" => "true" })),
|
203
|
+
logger: logger,
|
204
|
+
version_requirement: version_requirement,
|
205
|
+
workspace_name: workspace_name,
|
206
|
+
).call
|
190
207
|
rescue => error
|
191
208
|
action_failed.call message: error.message
|
192
209
|
end
|
193
210
|
|
211
|
+
# doctor checks the system and configuration for common errors.
|
212
|
+
#
|
213
|
+
# @param state [Hash] the mutable Kitchen instance state.
|
214
|
+
# @return [Boolean] +true+ if any errors are found; +false+ if no errors are found.
|
215
|
+
def doctor(state)
|
216
|
+
errors = false
|
217
|
+
|
218
|
+
deprecated_config.each_pair do |attribute, message|
|
219
|
+
errors = true
|
220
|
+
logger.warn "driver.#{attribute} is deprecated: #{message}"
|
221
|
+
end
|
222
|
+
|
223
|
+
methods.each do |method|
|
224
|
+
next if !method.match? /doctor_config_.*/
|
225
|
+
|
226
|
+
config_error = send method
|
227
|
+
errors = errors || config_error
|
228
|
+
end
|
229
|
+
|
230
|
+
transport_errors = transport.doctor state
|
231
|
+
verifier_errors = instance.verifier.doctor state
|
232
|
+
|
233
|
+
errors || transport_errors || verifier_errors
|
234
|
+
end
|
235
|
+
|
194
236
|
# #finalize_config! invokes the super implementation and then initializes the strategies.
|
195
237
|
#
|
196
238
|
# @param instance [Kitchen::Instance] an associated instance.
|
197
239
|
# @raise [Kitchen::ClientError] if the instance is nil.
|
198
240
|
# @return [self]
|
199
|
-
# @see Kitchen::Configurable#finalize_config!
|
200
241
|
def finalize_config!(instance)
|
201
|
-
super
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
workspace_name: workspace_name,
|
213
|
-
)
|
242
|
+
super
|
243
|
+
|
244
|
+
self.deprecated_config ||= {}
|
245
|
+
|
246
|
+
transport = instance.transport
|
247
|
+
|
248
|
+
self.transport = if ::Kitchen::Transport::Terraform == transport.class
|
249
|
+
transport
|
250
|
+
else
|
251
|
+
::Kitchen::Transport::Terraform.new(config).finalize_config! instance
|
252
|
+
end
|
214
253
|
|
215
254
|
self
|
216
255
|
end
|
@@ -226,7 +265,8 @@ module Kitchen
|
|
226
265
|
|
227
266
|
private
|
228
267
|
|
229
|
-
attr_accessor :action_failed, :
|
268
|
+
attr_accessor :action_failed, :deprecated_config
|
269
|
+
attr_writer :transport
|
230
270
|
end
|
231
271
|
end
|
232
272
|
end
|
@@ -24,7 +24,7 @@ module Kitchen
|
|
24
24
|
#
|
25
25
|
# @see http://www.rubydoc.info/gems/test-kitchen/Kitchen/Provisioner
|
26
26
|
module Provisioner
|
27
|
-
# The provisioner applies changes to the Terraform state based on the configuration of the root module.
|
27
|
+
# The Terraform provisioner applies changes to the Terraform state based on the configuration of the root module.
|
28
28
|
#
|
29
29
|
# === Commands
|
30
30
|
#
|
@@ -80,33 +80,20 @@ module Kitchen
|
|
80
80
|
# @param state [Hash] the mutable instance and provisioner state.
|
81
81
|
# @raise [Kitchen::ActionFailed] if the result of the action is a failure.
|
82
82
|
def call(state)
|
83
|
-
|
84
|
-
|
85
|
-
action_failed.call message: error.message
|
86
|
-
end
|
83
|
+
driver = instance.driver
|
84
|
+
transport = driver.transport
|
87
85
|
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
# @return [self]
|
93
|
-
# @see Kitchen::Configurable#finalize_config!
|
94
|
-
def finalize_config!(instance)
|
95
|
-
super instance
|
96
|
-
self.action_failed = ::Kitchen::Terraform::Raise::ActionFailed.new logger: logger
|
97
|
-
self.converge_strategy = ::Kitchen::Terraform::Provisioner::Converge.new(
|
98
|
-
config: instance.driver.send(:config),
|
86
|
+
::Kitchen::Terraform::Provisioner::Converge.new(
|
87
|
+
config: driver.send(:config),
|
88
|
+
connection: transport.connection({}),
|
89
|
+
debug_connection: transport.connection(logger: ::Kitchen::Terraform::DebugLogger.new(logger: logger)),
|
99
90
|
logger: logger,
|
100
91
|
version_requirement: version_requirement,
|
101
92
|
workspace_name: workspace_name,
|
102
|
-
)
|
103
|
-
|
104
|
-
|
93
|
+
).call state: state
|
94
|
+
rescue => error
|
95
|
+
::Kitchen::Terraform::Raise::ActionFailed.new(logger: logger).call message: error.message
|
105
96
|
end
|
106
|
-
|
107
|
-
private
|
108
|
-
|
109
|
-
attr_accessor :action_failed, :converge_strategy
|
110
97
|
end
|
111
98
|
end
|
112
99
|
end
|
@@ -68,6 +68,24 @@ module Kitchen
|
|
68
68
|
def config_client_default_value
|
69
69
|
"terraform"
|
70
70
|
end
|
71
|
+
|
72
|
+
# #doctor_config_client validates the client configuration.
|
73
|
+
#
|
74
|
+
# @return [Boolean] +true+ if any errors are found; +false+ if no errors are found.
|
75
|
+
def doctor_config_client
|
76
|
+
errors = false
|
77
|
+
|
78
|
+
if !::File.exist? config_client
|
79
|
+
errors = true
|
80
|
+
logger.error "client '#{config_client}' does not exist"
|
81
|
+
end
|
82
|
+
if !::File.executable? config_client
|
83
|
+
errors = true
|
84
|
+
logger.error "client '#{config_client}' is not executable"
|
85
|
+
end
|
86
|
+
|
87
|
+
errors
|
88
|
+
end
|
71
89
|
end
|
72
90
|
end
|
73
91
|
end
|
@@ -579,6 +579,20 @@ module Kitchen
|
|
579
579
|
end,
|
580
580
|
schema: ::Kitchen::Terraform::ConfigAttributeContract::Systems.new,
|
581
581
|
).apply config_attribute: self
|
582
|
+
|
583
|
+
# #doctor_config_systems validates the systems configuration.
|
584
|
+
#
|
585
|
+
# @return [Boolean] +true+ if any errors are found; +false+ if no errors are found.
|
586
|
+
def doctor_config_systems
|
587
|
+
errors = false
|
588
|
+
|
589
|
+
if config_systems.empty?
|
590
|
+
errors = true
|
591
|
+
logger.error "systems is empty"
|
592
|
+
end
|
593
|
+
|
594
|
+
errors
|
595
|
+
end
|
582
596
|
end
|
583
597
|
end
|
584
598
|
end
|
@@ -21,7 +21,7 @@ require "kitchen/terraform/config_attribute_contract/hash_of_symbols_and_strings
|
|
21
21
|
module Kitchen
|
22
22
|
module Terraform
|
23
23
|
module ConfigAttributeType
|
24
|
-
# This modules applies the behaviour of a configuration attribute of type hash of symbols and strings to a module
|
24
|
+
# This modules applies the behaviour of a configuration attribute of type hash of symbols and strings to a module
|
25
25
|
# which must be included by a plugin class.
|
26
26
|
#
|
27
27
|
# @see http://dry-rb.org/gems/dry-validation/basics/working-with-schemas/ DRY Validation Working With Schemas
|
@@ -22,7 +22,7 @@ require "kitchen/terraform/config_attribute_type"
|
|
22
22
|
module Kitchen
|
23
23
|
module Terraform
|
24
24
|
module ConfigAttributeType
|
25
|
-
# This module applies the behaviour of a configuration attribute of type integer to a module which must be
|
25
|
+
# This module applies the behaviour of a configuration attribute of type integer to a module which must be
|
26
26
|
# included by a plugin class.
|
27
27
|
#
|
28
28
|
# @see http://dry-rb.org/gems/dry-validation/basics/working-with-schemas/ DRY Validation Working With Schemas
|
@@ -39,7 +39,6 @@ module Kitchen
|
|
39
39
|
# @param instance [Kitchen::Instance] an associated instance.
|
40
40
|
# @raise [Kitchen::ClientError] if the instance is nil.
|
41
41
|
# @return [self]
|
42
|
-
# @see Kitchen::Configurable#finalize_config!
|
43
42
|
def finalize_config!(instance)
|
44
43
|
super instance
|
45
44
|
self.version_requirement = ::Gem::Requirement.new ">= 0.11.4", "< 2.0.0"
|
@@ -15,11 +15,11 @@
|
|
15
15
|
# limitations under the License.
|
16
16
|
|
17
17
|
require "kitchen"
|
18
|
+
require "kitchen/shell_out"
|
18
19
|
require "kitchen/terraform/command/init_factory"
|
19
20
|
require "kitchen/terraform/command/version"
|
20
21
|
require "kitchen/terraform/command/workspace_new"
|
21
22
|
require "kitchen/terraform/command/workspace_select"
|
22
|
-
require "kitchen/terraform/command_executor"
|
23
23
|
require "kitchen/terraform/verify_version"
|
24
24
|
require "rubygems"
|
25
25
|
|
@@ -46,7 +46,7 @@ module Kitchen
|
|
46
46
|
class Create
|
47
47
|
# #call executes the action.
|
48
48
|
#
|
49
|
-
# @raise [Kitchen::
|
49
|
+
# @raise [Kitchen::StandardError] if a command fails.
|
50
50
|
# @return [self]
|
51
51
|
def call
|
52
52
|
read_client_version
|
@@ -60,23 +60,17 @@ module Kitchen
|
|
60
60
|
# #initialize prepares a new instance of the class.
|
61
61
|
#
|
62
62
|
# @param config [Hash] the configuration of the driver.
|
63
|
+
# @param connection [Kitchen::Terraform::Transport::Connection] a Terraform connection.
|
63
64
|
# @param logger [Kitchen::Logger] a logger for logging messages.
|
64
65
|
# @param version_requirement [Gem::VersionRequirement] the required version of the Terraform client.
|
65
66
|
# @param workspace_name [String] the name of the Terraform workspace to select or to create.
|
66
67
|
# @option config [String] :client the pathname of the Terraform client.
|
67
68
|
# @return [Kitchen::Terraform::Driver::Create]
|
68
|
-
def initialize(config:, logger:, version_requirement:, workspace_name:)
|
69
|
+
def initialize(config:, connection:, logger:, version_requirement:, workspace_name:)
|
69
70
|
self.complete_config = config.to_hash.merge upgrade_during_init: true, workspace_name: workspace_name
|
71
|
+
self.connection = connection
|
70
72
|
self.client_version = ::Gem::Version.new "0.0.0"
|
71
|
-
self.command_executor = ::Kitchen::Terraform::CommandExecutor.new(
|
72
|
-
client: complete_config.fetch(:client),
|
73
|
-
logger: logger,
|
74
|
-
)
|
75
73
|
self.logger = logger
|
76
|
-
self.options = {
|
77
|
-
cwd: complete_config.fetch(:root_module_directory),
|
78
|
-
timeout: complete_config.fetch(:command_timeout),
|
79
|
-
}
|
80
74
|
self.workspace_name = workspace_name
|
81
75
|
self.workspace_new = ::Kitchen::Terraform::Command::WorkspaceNew.new config: complete_config
|
82
76
|
self.workspace_select = ::Kitchen::Terraform::Command::WorkspaceSelect.new config: complete_config
|
@@ -92,10 +86,9 @@ module Kitchen
|
|
92
86
|
|
93
87
|
attr_accessor(
|
94
88
|
:client_version,
|
95
|
-
:command_executor,
|
96
89
|
:complete_config,
|
90
|
+
:connection,
|
97
91
|
:logger,
|
98
|
-
:options,
|
99
92
|
:verify_version,
|
100
93
|
:version,
|
101
94
|
:workspace_name,
|
@@ -105,36 +98,28 @@ module Kitchen
|
|
105
98
|
|
106
99
|
def create_or_select_workspace
|
107
100
|
logger.warn "Creating the #{workspace_name} Terraform workspace..."
|
108
|
-
|
109
|
-
end
|
101
|
+
connection.execute workspace_new
|
110
102
|
logger.warn "Finished creating the #{workspace_name} Terraform workspace."
|
111
|
-
rescue ::Kitchen::
|
103
|
+
rescue ::Kitchen::ShellOut::ShellCommandFailed
|
112
104
|
select_workspace
|
113
105
|
end
|
114
106
|
|
115
107
|
def initialize_directory
|
116
108
|
logger.warn "Initializing the Terraform working directory..."
|
117
|
-
|
118
|
-
|
119
|
-
.build(config: complete_config),
|
120
|
-
options: options,
|
121
|
-
) do |standard_output|
|
122
|
-
end
|
109
|
+
connection.execute ::Kitchen::Terraform::Command::InitFactory
|
110
|
+
.new(version: client_version).build(config: complete_config)
|
123
111
|
logger.warn "Finished initializing the Terraform working directory."
|
124
112
|
end
|
125
113
|
|
126
114
|
def read_client_version
|
127
115
|
logger.warn "Reading the Terraform client version..."
|
128
|
-
|
129
|
-
self.client_version = ::Gem::Version.new standard_output.slice /Terraform v(\d+\.\d+\.\d+)/, 1
|
130
|
-
end
|
116
|
+
self.client_version = ::Gem::Version.new connection.execute(version).slice /Terraform v(\d+\.\d+\.\d+)/, 1
|
131
117
|
logger.warn "Finished reading the Terraform client version."
|
132
118
|
end
|
133
119
|
|
134
120
|
def select_workspace
|
135
121
|
logger.warn "Selecting the #{workspace_name} Terraform workspace..."
|
136
|
-
|
137
|
-
end
|
122
|
+
connection.execute workspace_select
|
138
123
|
logger.warn "Finished selecting the #{workspace_name} Terraform workspace."
|
139
124
|
end
|
140
125
|
end
|