kitchen-terraform 0.1.2 → 0.2.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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +3 -1
- data.tar.gz.sig +3 -3
- data/README.md +50 -21
- data/lib/kitchen/driver/terraform.rb +7 -19
- data/lib/kitchen/provisioner/terraform.rb +140 -17
- data/lib/kitchen/verifier/terraform.rb +19 -64
- data/lib/terraform/apply_command.rb +16 -6
- data/lib/terraform/{output_not_found.rb → color_switch.rb} +5 -4
- data/lib/terraform/command.rb +28 -19
- data/lib/terraform/{command_options.rb → configurable.rb} +19 -19
- data/lib/terraform/get_command.rb +6 -8
- data/lib/terraform/group.rb +94 -0
- data/lib/terraform/inspec_runner.rb +11 -7
- data/lib/terraform/output_command.rb +10 -10
- data/lib/terraform/plan_command.rb +36 -9
- data/lib/terraform/validate_command.rb +3 -9
- data/lib/terraform/version.rb +1 -1
- data/lib/terraform/version_command.rb +3 -9
- metadata +20 -9
- metadata.gz.sig +0 -0
- data/lib/terraform/client.rb +0 -102
- data/lib/terraform/client_holder.rb +0 -26
- data/lib/terraform/error.rb +0 -20
- data/lib/terraform/invalid_version.rb +0 -34
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 125efdc0ccfadc12dbc06c1f2d19f94337b7e514
|
4
|
+
data.tar.gz: f63a2992bfcdb73ecf9a60b0d68752b6d1dcc543
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 680b4c300b78faeb2992aa52b7d915dfa5ec573c77f2fa57e6dbc8d3c44f80ef831d17ee30a377ec4c870246936971e7c6192753c3a472b3bfdf5f6d3c3bf0b0
|
7
|
+
data.tar.gz: ade3ff2a56a9ba6febb281de8257006462680d16540c156804128c8b842b669d9cbf772f057f5bd8cb37334f743aede63ed45f292ed937150cfd7b69dda45ce4
|
checksums.yaml.gz.sig
CHANGED
@@ -1 +1,3 @@
|
|
1
|
-
|
1
|
+
@�K��R�-�Q��G4�w[�6�Lo���1�Ίiy����;>�U�>��x�p|M������5����F�)���,l��ѵ,+��3��ޖ�Ml�"�56
|
2
|
+
�_,��*��߇�N����rɌ�pX���G�
|
3
|
+
@���L�72��َ��8�j�������V[�{Uoc0�G��h)�����Z�ZK�O��d��r���öل�+�
|
data.tar.gz.sig
CHANGED
@@ -1,3 +1,3 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
�
|
1
|
+
<z� nZCZ������-0�~�>a*﹈�e8o� v櫘M���h�1�=DԬ��'��X��ø�z�Iu��ZҪ�廂1K{Cˉ�y0�����M@9�W�P:�Z��8s��+6�w�4���{E�u�YrX�75ؓ
|
2
|
+
I����I����N,��'�]�=��
|
3
|
+
��&�l�4��u���?3���:�#��z��J��^�Ӄ�w�& @���9�?Ȏ���z'�PLAdR�c�8?��<�}�-j�p�v�s8
|
data/README.md
CHANGED
@@ -36,7 +36,8 @@ source 'https://rubygems.org'
|
|
36
36
|
gem 'kitchen-terraform', '~> 0.1'
|
37
37
|
```
|
38
38
|
|
39
|
-
Before running `bundle`, the author's public key must be added as a
|
39
|
+
Before running `bundle`, the author's public key must be added as a
|
40
|
+
trusted certificate:
|
40
41
|
|
41
42
|
```sh
|
42
43
|
gem cert --add <(curl --location --silent \
|
@@ -95,9 +96,7 @@ provisioner.
|
|
95
96
|
|
96
97
|
There are no configuration options for the driver.
|
97
98
|
|
98
|
-
##### Example
|
99
|
-
|
100
|
-
*.kitchen.yml*
|
99
|
+
##### Example .kitchen.yml
|
101
100
|
|
102
101
|
```yaml
|
103
102
|
---
|
@@ -120,6 +119,41 @@ Terraform state based on the provided Terraform configuration.
|
|
120
119
|
|
121
120
|
#### Configuration
|
122
121
|
|
122
|
+
##### apply_timeout
|
123
|
+
|
124
|
+
The number of seconds to wait for the Terraform `apply` command to be
|
125
|
+
successful before raising an error.
|
126
|
+
|
127
|
+
###### Example .kitchen.yml
|
128
|
+
|
129
|
+
```yaml
|
130
|
+
---
|
131
|
+
provisioner:
|
132
|
+
name: terraform
|
133
|
+
apply_timeout: 1000
|
134
|
+
```
|
135
|
+
|
136
|
+
###### Default
|
137
|
+
|
138
|
+
The default `apply_timeout` is 600 seconds.
|
139
|
+
|
140
|
+
##### color
|
141
|
+
|
142
|
+
Enable or disable colored output from the Terraform command.
|
143
|
+
|
144
|
+
###### Example .kitchen.yml
|
145
|
+
|
146
|
+
```yaml
|
147
|
+
---
|
148
|
+
provisioner:
|
149
|
+
name: terraform
|
150
|
+
color: false
|
151
|
+
```
|
152
|
+
|
153
|
+
###### Default
|
154
|
+
|
155
|
+
The default value for `color` is true.
|
156
|
+
|
123
157
|
##### directory
|
124
158
|
|
125
159
|
The pathname of the directory containing the Terraform configuration
|
@@ -128,9 +162,7 @@ Terraform commands.
|
|
128
162
|
|
129
163
|
[directory specified]: https://www.terraform.io/docs/configuration/load.html
|
130
164
|
|
131
|
-
###### Example
|
132
|
-
|
133
|
-
*.kitchen.yml*
|
165
|
+
###### Example .kitchen.yml
|
134
166
|
|
135
167
|
```yaml
|
136
168
|
---
|
@@ -150,9 +182,7 @@ for the configuration.
|
|
150
182
|
|
151
183
|
[Terraform variable files]: https://www.terraform.io/docs/configuration/variables.html#variable-files
|
152
184
|
|
153
|
-
######
|
154
|
-
|
155
|
-
*.kitchen.yml*
|
185
|
+
###### Example .kitchen.yml
|
156
186
|
|
157
187
|
```yaml
|
158
188
|
---
|
@@ -173,26 +203,27 @@ The default `variable_files` collection is empty.
|
|
173
203
|
|
174
204
|
##### variables
|
175
205
|
|
176
|
-
A
|
177
|
-
the syntax matches that of [assigning variables] with command-line
|
178
|
-
flags.
|
206
|
+
A mapping of [Terraform variables] to be set in the configuration.
|
179
207
|
|
180
208
|
[Terraform variables]: https://www.terraform.io/docs/configuration/variables.html
|
181
209
|
|
182
|
-
|
183
|
-
|
184
|
-
###### Examples
|
185
|
-
|
186
|
-
*.kitchen.yml*
|
210
|
+
###### Example .kitchen.yml
|
187
211
|
|
188
212
|
```yaml
|
189
213
|
---
|
214
|
+
provisioner:
|
215
|
+
name: terraform
|
216
|
+
variables:
|
217
|
+
foo: bar
|
218
|
+
# deprecated
|
219
|
+
---
|
190
220
|
provisioner:
|
191
221
|
name: terraform
|
192
222
|
variables:
|
193
223
|
- foo=bar
|
194
224
|
- biz=baz
|
195
225
|
---
|
226
|
+
# deprecated
|
196
227
|
provisioner:
|
197
228
|
name: terraform
|
198
229
|
variables: foo=bar
|
@@ -250,9 +281,7 @@ Each group consists of:
|
|
250
281
|
|
251
282
|
- the username to use when connecting to the group's hosts
|
252
283
|
|
253
|
-
###### Example
|
254
|
-
|
255
|
-
*.kitchen.yml*
|
284
|
+
###### Example .kitchen.yml
|
256
285
|
|
257
286
|
```yaml
|
258
287
|
---
|
@@ -15,15 +15,14 @@
|
|
15
15
|
# limitations under the License.
|
16
16
|
|
17
17
|
require 'kitchen'
|
18
|
-
require 'terraform/
|
19
|
-
require 'terraform/invalid_version'
|
18
|
+
require 'terraform/configurable'
|
20
19
|
require 'terraform/version'
|
21
20
|
|
22
21
|
module Kitchen
|
23
22
|
module Driver
|
24
23
|
# Terraform state lifecycle activities manager
|
25
24
|
class Terraform < Base
|
26
|
-
include ::Terraform::
|
25
|
+
include ::Terraform::Configurable
|
27
26
|
|
28
27
|
kitchen_driver_api_version 2
|
29
28
|
|
@@ -32,25 +31,14 @@ module Kitchen
|
|
32
31
|
no_parallel_for
|
33
32
|
|
34
33
|
def create(_state = nil)
|
35
|
-
|
36
|
-
raise ::Terraform::InvalidVersion, supported_version, caller unless
|
37
|
-
output.match supported_version
|
38
|
-
end
|
39
|
-
rescue => error
|
40
|
-
raise Kitchen::ActionFailed, error.message, error.backtrace
|
34
|
+
provisioner.validate_version
|
41
35
|
end
|
42
36
|
|
43
37
|
def destroy(_state = nil)
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
rescue => error
|
49
|
-
raise Kitchen::ActionFailed, error.message, error.backtrace
|
50
|
-
end
|
51
|
-
|
52
|
-
def supported_version
|
53
|
-
'v0.6'
|
38
|
+
provisioner.validate_configuration_files
|
39
|
+
provisioner.download_modules
|
40
|
+
provisioner.plan_destructive_execution
|
41
|
+
provisioner.apply_execution_plan
|
54
42
|
end
|
55
43
|
end
|
56
44
|
end
|
@@ -15,43 +15,166 @@
|
|
15
15
|
# limitations under the License.
|
16
16
|
|
17
17
|
require 'kitchen'
|
18
|
-
require '
|
19
|
-
require 'terraform/
|
18
|
+
require 'terraform/apply_command'
|
19
|
+
require 'terraform/configurable'
|
20
|
+
require 'terraform/get_command'
|
21
|
+
require 'terraform/group'
|
22
|
+
require 'terraform/output_command'
|
23
|
+
require 'terraform/plan_command'
|
24
|
+
require 'terraform/validate_command'
|
20
25
|
require 'terraform/version'
|
26
|
+
require 'terraform/version_command'
|
21
27
|
|
22
28
|
module Kitchen
|
23
29
|
module Provisioner
|
24
30
|
# Terraform configuration applier
|
25
31
|
class Terraform < Base
|
26
|
-
|
32
|
+
SUPPORTED_VERSION = /v0.6/
|
33
|
+
|
34
|
+
include ::Terraform::Configurable
|
27
35
|
|
28
36
|
kitchen_provisioner_api_version 2
|
29
37
|
|
30
38
|
plugin_version ::Terraform::VERSION
|
31
39
|
|
40
|
+
required_config :apply_timeout do |_, value, provisioner|
|
41
|
+
provisioner.coerce_apply_timeout value: value
|
42
|
+
end
|
43
|
+
|
44
|
+
default_config :apply_timeout, 600
|
45
|
+
|
46
|
+
default_config :color, true
|
47
|
+
|
48
|
+
required_config :color do |_, value, provisioner|
|
49
|
+
provisioner.coerce_color value: value
|
50
|
+
end
|
51
|
+
|
52
|
+
default_config(:directory) { |provisioner| provisioner[:kitchen_root] }
|
53
|
+
|
54
|
+
expand_path_for :directory
|
55
|
+
|
56
|
+
default_config :plan do |provisioner|
|
57
|
+
provisioner.instance_pathname filename: 'terraform.tfplan'
|
58
|
+
end
|
59
|
+
|
60
|
+
expand_path_for :plan
|
61
|
+
|
62
|
+
default_config :state do |provisioner|
|
63
|
+
provisioner.instance_pathname filename: 'terraform.tfstate'
|
64
|
+
end
|
65
|
+
|
66
|
+
expand_path_for :state
|
67
|
+
|
68
|
+
required_config :variable_files do |_, value, provisioner|
|
69
|
+
provisioner.coerce_variable_files value: value
|
70
|
+
end
|
71
|
+
|
72
|
+
default_config :variable_files, []
|
73
|
+
|
74
|
+
expand_path_for :variable_files
|
75
|
+
|
76
|
+
required_config :variables do |_, value, provisioner|
|
77
|
+
provisioner.coerce_variables value: value
|
78
|
+
end
|
79
|
+
|
80
|
+
default_config :variables, {}
|
81
|
+
|
82
|
+
def apply_execution_plan
|
83
|
+
::Terraform::ApplyCommand.execute \
|
84
|
+
logger: logger, state: config[:state], target: config[:plan],
|
85
|
+
color: config[:color], timeout: config[:apply_timeout]
|
86
|
+
end
|
87
|
+
|
32
88
|
def call(_state = nil)
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
89
|
+
validate_configuration_files
|
90
|
+
download_modules
|
91
|
+
plan_constructive_execution
|
92
|
+
apply_execution_plan
|
93
|
+
end
|
94
|
+
|
95
|
+
def coerce_apply_timeout(value:)
|
96
|
+
config[:apply_timeout] = Integer value
|
97
|
+
rescue ArgumentError, TypeError
|
98
|
+
config_error attribute: 'apply_timeout', expected: 'an integer'
|
99
|
+
end
|
100
|
+
|
101
|
+
def coerce_color(value:)
|
102
|
+
raise TypeError unless [TrueClass, FalseClass].include?(value.class)
|
103
|
+
config[:color] = value
|
104
|
+
rescue TypeError
|
105
|
+
config_error attribute: 'color', expected: 'a boolean'
|
39
106
|
end
|
40
107
|
|
41
|
-
def
|
42
|
-
config
|
108
|
+
def coerce_variable_files(value:)
|
109
|
+
config[:variable_files] = Array value
|
43
110
|
end
|
44
111
|
|
45
|
-
def
|
46
|
-
|
112
|
+
def coerce_variables(value:)
|
113
|
+
config[:variables] =
|
114
|
+
if value.is_a?(Array) || value.is_a?(String)
|
115
|
+
deprecated_variables_format value: value
|
116
|
+
else
|
117
|
+
Hash value
|
118
|
+
end
|
119
|
+
rescue ArgumentError, TypeError
|
120
|
+
config_error attribute: 'variables',
|
121
|
+
expected: 'a mapping of Terraform variable assignments'
|
47
122
|
end
|
48
123
|
|
49
|
-
def
|
50
|
-
|
124
|
+
def download_modules
|
125
|
+
::Terraform::GetCommand.execute logger: logger,
|
126
|
+
target: config[:directory]
|
51
127
|
end
|
52
128
|
|
53
|
-
def
|
54
|
-
|
129
|
+
def each_list_output(name:, &block)
|
130
|
+
output(name: name).split(',').each(&block)
|
131
|
+
end
|
132
|
+
|
133
|
+
def instance_pathname(filename:)
|
134
|
+
File.join config[:kitchen_root], '.kitchen', 'kitchen-terraform',
|
135
|
+
instance.name, filename
|
136
|
+
end
|
137
|
+
|
138
|
+
def output(name:)
|
139
|
+
::Terraform::OutputCommand
|
140
|
+
.execute logger: logger, state: config[:state], target: name, &:chomp
|
141
|
+
end
|
142
|
+
|
143
|
+
def plan_constructive_execution
|
144
|
+
::Terraform::PlanCommand
|
145
|
+
.execute destroy: false, logger: logger, out: config[:plan],
|
146
|
+
state: config[:state], target: config[:directory],
|
147
|
+
variables: config[:variables], color: config[:color],
|
148
|
+
variable_files: config[:variable_files]
|
149
|
+
end
|
150
|
+
|
151
|
+
def plan_destructive_execution
|
152
|
+
::Terraform::PlanCommand
|
153
|
+
.execute destroy: true, logger: logger, out: config[:plan],
|
154
|
+
state: config[:state], target: config[:directory],
|
155
|
+
variables: config[:variables], color: config[:color],
|
156
|
+
variable_files: config[:variable_files]
|
157
|
+
end
|
158
|
+
|
159
|
+
def validate_configuration_files
|
160
|
+
::Terraform::ValidateCommand.execute logger: logger,
|
161
|
+
target: config[:directory]
|
162
|
+
end
|
163
|
+
|
164
|
+
def validate_version
|
165
|
+
::Terraform::VersionCommand.execute logger: logger do |output|
|
166
|
+
raise UserError,
|
167
|
+
"Terraform version must match #{SUPPORTED_VERSION}" unless
|
168
|
+
SUPPORTED_VERSION.match output
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
private
|
173
|
+
|
174
|
+
def deprecated_variables_format(value:)
|
175
|
+
config_deprecated attribute: 'variables',
|
176
|
+
expected: 'a mapping rather than a list or string'
|
177
|
+
Hash[Array(value).map { |string| string.split '=' }]
|
55
178
|
end
|
56
179
|
end
|
57
180
|
end
|
@@ -16,8 +16,7 @@
|
|
16
16
|
|
17
17
|
require 'kitchen'
|
18
18
|
require 'kitchen/verifier/inspec'
|
19
|
-
require 'terraform/
|
20
|
-
require 'terraform/inspec_runner'
|
19
|
+
require 'terraform/configurable'
|
21
20
|
require 'terraform/version'
|
22
21
|
|
23
22
|
module Kitchen
|
@@ -25,84 +24,40 @@ module Kitchen
|
|
25
24
|
# Runs tests post-converge to confirm that instances in the Terraform state
|
26
25
|
# are in an expected state
|
27
26
|
class Terraform < Inspec
|
28
|
-
include ::Terraform::
|
27
|
+
include ::Terraform::Configurable
|
29
28
|
|
30
29
|
kitchen_verifier_api_version 2
|
31
30
|
|
32
31
|
plugin_version ::Terraform::VERSION
|
33
32
|
|
34
|
-
|
35
|
-
|
33
|
+
required_config :groups do |_, value, verifier|
|
34
|
+
verifier.coerce_groups value: value
|
36
35
|
end
|
37
36
|
|
38
|
-
|
39
|
-
groups.each do |group|
|
40
|
-
client.extract_list_output name: group.fetch(:hostnames) do |output|
|
41
|
-
verify group: group, hostnames: output, state: state
|
42
|
-
end
|
43
|
-
end
|
44
|
-
rescue => error
|
45
|
-
raise ActionFailed, error.message, error.backtrace
|
46
|
-
end
|
47
|
-
|
48
|
-
def controls(group:)
|
49
|
-
group.fetch(:controls) { [] }
|
50
|
-
end
|
51
|
-
|
52
|
-
def evaluate(exit_code:)
|
53
|
-
raise "Inspec Runner returns #{exit_code}" unless exit_code.zero?
|
54
|
-
end
|
55
|
-
|
56
|
-
def groups
|
57
|
-
config.fetch(:groups) { [] }
|
58
|
-
end
|
37
|
+
default_config :groups, []
|
59
38
|
|
60
|
-
def
|
61
|
-
|
62
|
-
.
|
63
|
-
state: state do |runner|
|
64
|
-
resolve_attributes group: group do |name, value|
|
65
|
-
runner.define_attribute name: name, value: value
|
66
|
-
end
|
67
|
-
runner.add targets: collect_tests
|
68
|
-
yield runner
|
39
|
+
def call(state)
|
40
|
+
config[:groups].each do |group|
|
41
|
+
group.verify_each_host options: runner_options(transport, state)
|
69
42
|
end
|
70
43
|
end
|
71
44
|
|
72
|
-
def
|
73
|
-
|
74
|
-
|
75
|
-
end
|
76
|
-
|
77
|
-
def resolve_attributes(group:)
|
78
|
-
attributes(group: group).each_pair do |method_name, variable_name|
|
79
|
-
client.extract_output name: variable_name do |output|
|
80
|
-
yield method_name, output
|
81
|
-
end
|
45
|
+
def coerce_groups(value:)
|
46
|
+
config[:groups] = Array(value).map do |raw_group|
|
47
|
+
::Terraform::Group.new value: raw_group, verifier: self
|
82
48
|
end
|
49
|
+
rescue UserError
|
50
|
+
config_error attribute: 'groups',
|
51
|
+
expected: 'a collection of group mappings'
|
83
52
|
end
|
84
53
|
|
85
|
-
def
|
86
|
-
|
87
|
-
.
|
88
|
-
port: port(group: group), user: username(group: group)
|
89
|
-
end
|
90
|
-
|
91
|
-
def username(group:)
|
92
|
-
# FIXME: apply the principle of least knowledge
|
93
|
-
group.fetch :username do
|
94
|
-
instance.transport.send(:config).fetch :username
|
95
|
-
end
|
54
|
+
def evaluate(exit_code:)
|
55
|
+
raise InstanceFailure, "Inspec Runner returns #{exit_code}" unless
|
56
|
+
exit_code.zero?
|
96
57
|
end
|
97
58
|
|
98
|
-
def
|
99
|
-
|
100
|
-
info "Verifying group: #{group.fetch :name}; hostname #{hostname}\n"
|
101
|
-
initialize_runner group: group, hostname: hostname,
|
102
|
-
state: state do |runner|
|
103
|
-
runner.verify_run verifier: self
|
104
|
-
end
|
105
|
-
end
|
59
|
+
def populate(runner:)
|
60
|
+
collect_tests.each { |test| runner.add target: test }
|
106
61
|
end
|
107
62
|
end
|
108
63
|
end
|
@@ -15,18 +15,28 @@
|
|
15
15
|
# limitations under the License.
|
16
16
|
|
17
17
|
require_relative 'command'
|
18
|
+
require_relative 'color_switch'
|
18
19
|
|
19
20
|
module Terraform
|
20
21
|
# Command to apply an execution plan
|
21
|
-
class ApplyCommand
|
22
|
-
include
|
22
|
+
class ApplyCommand < Command
|
23
|
+
include ColorSwitch
|
24
|
+
|
25
|
+
def name
|
26
|
+
'apply'
|
27
|
+
end
|
28
|
+
|
29
|
+
def options
|
30
|
+
"-input=false -state=#{state}#{color_switch}"
|
31
|
+
end
|
23
32
|
|
24
33
|
private
|
25
34
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
self.
|
35
|
+
attr_accessor :color, :state
|
36
|
+
|
37
|
+
def initialize_attributes(color:, state:)
|
38
|
+
self.color = color
|
39
|
+
self.state = state
|
30
40
|
end
|
31
41
|
end
|
32
42
|
end
|
@@ -14,10 +14,11 @@
|
|
14
14
|
# See the License for the specific language governing permissions and
|
15
15
|
# limitations under the License.
|
16
16
|
|
17
|
-
require_relative 'error'
|
18
|
-
|
19
17
|
module Terraform
|
20
|
-
#
|
21
|
-
|
18
|
+
# Shared color switche for Terraform
|
19
|
+
module ColorSwitch
|
20
|
+
def color_switch
|
21
|
+
color ? '' : ' -no-color'
|
22
|
+
end
|
22
23
|
end
|
23
24
|
end
|
data/lib/terraform/command.rb
CHANGED
@@ -14,45 +14,54 @@
|
|
14
14
|
# See the License for the specific language governing permissions and
|
15
15
|
# limitations under the License.
|
16
16
|
|
17
|
+
require 'kitchen'
|
17
18
|
require 'mixlib/shellout'
|
18
|
-
require 'pathname'
|
19
|
-
require_relative 'command_options'
|
20
|
-
require_relative 'error'
|
21
19
|
|
22
20
|
module Terraform
|
23
|
-
#
|
24
|
-
|
25
|
-
|
21
|
+
# Interface to the Terraform command line client
|
22
|
+
class Command
|
23
|
+
def self.execute(**keyword_arguments, &block)
|
24
|
+
new(**keyword_arguments).execute(&block)
|
25
|
+
end
|
26
26
|
|
27
27
|
def execute
|
28
|
-
# TODO: use the live output stream
|
29
28
|
shell_out.run_command
|
30
29
|
shell_out.error!
|
31
30
|
yield shell_out.stdout if block_given?
|
32
|
-
rescue => error
|
33
|
-
|
34
|
-
|
31
|
+
rescue Errno::EACCES, Errno::ENOENT => error
|
32
|
+
command_error error: error, type: Kitchen::InstanceFailure
|
33
|
+
rescue Mixlib::ShellOut::CommandTimeout,
|
34
|
+
Mixlib::ShellOut::ShellCommandFailed => error
|
35
|
+
command_error error: error, type: Kitchen::TransientFailure
|
35
36
|
end
|
36
37
|
|
37
|
-
def
|
38
|
+
def name
|
39
|
+
''
|
38
40
|
end
|
39
41
|
|
40
|
-
def
|
41
|
-
|
42
|
-
return "terraform #{name} #{command_options} #{target}"
|
43
|
-
end
|
42
|
+
def options
|
43
|
+
'--help'
|
44
44
|
end
|
45
45
|
|
46
46
|
private
|
47
47
|
|
48
48
|
attr_accessor :shell_out
|
49
49
|
|
50
|
-
|
50
|
+
def command_error(error:, type:)
|
51
|
+
raise type, %(`#{shell_out.command}` failed: "#{error}")
|
52
|
+
end
|
51
53
|
|
52
|
-
def initialize(
|
54
|
+
def initialize(
|
55
|
+
logger:, target: '', timeout: Mixlib::ShellOut::DEFAULT_READ_TIMEOUT,
|
56
|
+
**keyword_arguments
|
57
|
+
)
|
53
58
|
initialize_attributes(**keyword_arguments)
|
54
|
-
self.shell_out = Mixlib::ShellOut
|
55
|
-
|
59
|
+
self.shell_out = Mixlib::ShellOut
|
60
|
+
.new "terraform #{name} #{options} #{target}",
|
61
|
+
live_stream: logger, returns: 0, timeout: timeout
|
62
|
+
end
|
63
|
+
|
64
|
+
def initialize_attributes(**_keyword_arguments)
|
56
65
|
end
|
57
66
|
end
|
58
67
|
end
|
@@ -14,32 +14,32 @@
|
|
14
14
|
# See the License for the specific language governing permissions and
|
15
15
|
# limitations under the License.
|
16
16
|
|
17
|
-
|
18
|
-
|
19
|
-
class CommandOptions
|
20
|
-
def to_s
|
21
|
-
key_flags.each_with_object String.new('') do |(flag, values), string|
|
22
|
-
values.each { |value| string.concat "#{flag}=#{value} " }
|
23
|
-
end.chomp ' '
|
24
|
-
end
|
17
|
+
require 'forwardable'
|
18
|
+
require 'kitchen'
|
25
19
|
|
26
|
-
|
20
|
+
module Terraform
|
21
|
+
# Common logic for classes that include Kitchen::Configurable
|
22
|
+
module Configurable
|
23
|
+
extend Forwardable
|
27
24
|
|
28
|
-
|
25
|
+
def_delegators :instance, :provisioner, :transport
|
29
26
|
|
30
|
-
def
|
31
|
-
|
32
|
-
|
27
|
+
def config_deprecated(attribute:, expected:)
|
28
|
+
logger.warn 'DEPRECATION NOTICE'
|
29
|
+
logger.warn formatted attribute: attribute,
|
30
|
+
message: "should be #{expected}"
|
33
31
|
end
|
34
32
|
|
35
|
-
def
|
36
|
-
|
37
|
-
|
38
|
-
|
33
|
+
def config_error(attribute:, expected:)
|
34
|
+
raise Kitchen::UserError, formatted(
|
35
|
+
attribute: attribute, message: "must be interpretable as #{expected}"
|
36
|
+
)
|
39
37
|
end
|
40
38
|
|
41
|
-
|
42
|
-
|
39
|
+
private
|
40
|
+
|
41
|
+
def formatted(attribute:, message:)
|
42
|
+
"#{self.class}#{instance.to_str}#config[:#{attribute}] #{message}"
|
43
43
|
end
|
44
44
|
end
|
45
45
|
end
|
@@ -18,15 +18,13 @@ require_relative 'command'
|
|
18
18
|
|
19
19
|
module Terraform
|
20
20
|
# Command to get modules
|
21
|
-
class GetCommand
|
22
|
-
|
23
|
-
|
24
|
-
|
21
|
+
class GetCommand < Command
|
22
|
+
def name
|
23
|
+
'get'
|
24
|
+
end
|
25
25
|
|
26
|
-
def
|
27
|
-
|
28
|
-
self.options = { update: true }
|
29
|
-
self.target = dir
|
26
|
+
def options
|
27
|
+
'-update=true'
|
30
28
|
end
|
31
29
|
end
|
32
30
|
end
|
@@ -0,0 +1,94 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright 2016 New Context Services, Inc.
|
4
|
+
#
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
# See the License for the specific language governing permissions and
|
15
|
+
# limitations under the License.
|
16
|
+
|
17
|
+
require 'delegate'
|
18
|
+
|
19
|
+
module Terraform
|
20
|
+
# Group to be verified
|
21
|
+
class Group < DelegateClass Hash
|
22
|
+
def populate(runner:)
|
23
|
+
dig(:attributes).each_pair do |key, output_name|
|
24
|
+
runner.set_attribute key: key,
|
25
|
+
value: provisioner.output(name: output_name)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def verify_each_host(options:)
|
30
|
+
require 'terraform/inspec_runner'
|
31
|
+
provisioner.each_list_output name: dig(:hostnames) do |hostname|
|
32
|
+
store :host, hostname
|
33
|
+
verifier.info "Verifying group: #{dig :name}; current host #{hostname}"
|
34
|
+
InspecRunner.run_and_verify group: self, options: options.merge(self),
|
35
|
+
verifier: verifier
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
attr_accessor :provisioner, :transport, :verifier
|
42
|
+
|
43
|
+
def coerce_attributes
|
44
|
+
store :attributes, Hash(dig(:attributes))
|
45
|
+
rescue ArgumentError, TypeError
|
46
|
+
verifier.config_error attribute: "groups][#{self}][:attributes",
|
47
|
+
expected: 'a mapping of Inspec attribute names ' \
|
48
|
+
'to Terraform output variable names'
|
49
|
+
end
|
50
|
+
|
51
|
+
def coerce_controls
|
52
|
+
store :controls, Array(dig(:controls))
|
53
|
+
end
|
54
|
+
|
55
|
+
def coerce_hostnames
|
56
|
+
store :hostnames, String(dig(:hostnames))
|
57
|
+
end
|
58
|
+
|
59
|
+
def coerce_name
|
60
|
+
store :name, String(dig(:name))
|
61
|
+
end
|
62
|
+
|
63
|
+
def coerce_parameters
|
64
|
+
coerce_attributes
|
65
|
+
coerce_controls
|
66
|
+
coerce_hostnames
|
67
|
+
coerce_name
|
68
|
+
coerce_port
|
69
|
+
coerce_username
|
70
|
+
end
|
71
|
+
|
72
|
+
def coerce_port
|
73
|
+
store :port, Integer(dig(:port) || transport[:port])
|
74
|
+
rescue ArgumentError, TypeError
|
75
|
+
verifier.config_error attribute: "groups][#{self}][:port",
|
76
|
+
expected: 'an integer'
|
77
|
+
end
|
78
|
+
|
79
|
+
def coerce_username
|
80
|
+
store :user, String(dig(:username) || transport[:username])
|
81
|
+
end
|
82
|
+
|
83
|
+
def initialize(value:, verifier:)
|
84
|
+
super Hash value
|
85
|
+
self.provisioner = verifier.provisioner
|
86
|
+
self.transport = verifier.transport
|
87
|
+
self.verifier = verifier
|
88
|
+
coerce_parameters
|
89
|
+
rescue ArgumentError, TypeError
|
90
|
+
verifier.config_error attribute: "groups][#{self}",
|
91
|
+
expected: 'a group mapping'
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
@@ -22,23 +22,27 @@ module Terraform
|
|
22
22
|
class InspecRunner < Inspec::Runner
|
23
23
|
attr_reader :conf
|
24
24
|
|
25
|
-
def
|
26
|
-
|
25
|
+
def self.run_and_verify(group:, options:, verifier:)
|
26
|
+
new(options).tap do |runner|
|
27
|
+
group.populate runner: runner
|
28
|
+
verifier.populate runner: runner
|
29
|
+
verifier.evaluate exit_code: runner.run
|
30
|
+
end
|
27
31
|
end
|
28
32
|
|
29
|
-
def
|
30
|
-
|
33
|
+
def add(target:)
|
34
|
+
add_target target, conf
|
31
35
|
end
|
32
36
|
|
33
|
-
def
|
34
|
-
|
37
|
+
def set_attribute(key:, value:)
|
38
|
+
conf[:attributes].store key.to_s, value
|
35
39
|
end
|
36
40
|
|
37
41
|
private
|
38
42
|
|
39
43
|
def initialize(conf = {})
|
44
|
+
conf.store :attributes, conf.fetch(:attributes, {}).clone
|
40
45
|
super
|
41
|
-
yield self if block_given?
|
42
46
|
end
|
43
47
|
end
|
44
48
|
end
|
@@ -15,24 +15,24 @@
|
|
15
15
|
# limitations under the License.
|
16
16
|
|
17
17
|
require_relative 'command'
|
18
|
-
require_relative 'output_not_found'
|
19
18
|
|
20
19
|
module Terraform
|
21
20
|
# Command to extract values of output variables
|
22
|
-
class OutputCommand
|
23
|
-
|
21
|
+
class OutputCommand < Command
|
22
|
+
def name
|
23
|
+
'output'
|
24
|
+
end
|
24
25
|
|
25
|
-
def
|
26
|
-
|
27
|
-
error.message =~ /no(?:thing to)? output/
|
26
|
+
def options
|
27
|
+
"-state=#{state}"
|
28
28
|
end
|
29
29
|
|
30
30
|
private
|
31
31
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
self.
|
32
|
+
attr_accessor :state
|
33
|
+
|
34
|
+
def initialize_attributes(state:)
|
35
|
+
self.state = state
|
36
36
|
end
|
37
37
|
end
|
38
38
|
end
|
@@ -15,21 +15,48 @@
|
|
15
15
|
# limitations under the License.
|
16
16
|
|
17
17
|
require_relative 'command'
|
18
|
+
require_relative 'color_switch'
|
18
19
|
|
19
20
|
module Terraform
|
20
21
|
# Command to plan an execution
|
21
|
-
class PlanCommand
|
22
|
-
include
|
22
|
+
class PlanCommand < Command
|
23
|
+
include ColorSwitch
|
24
|
+
|
25
|
+
def name
|
26
|
+
'plan'
|
27
|
+
end
|
28
|
+
|
29
|
+
def options
|
30
|
+
"-destroy=#{destroy} -input=false -out=#{out} -state=#{state}" \
|
31
|
+
"#{color_switch}" \
|
32
|
+
"#{processed_variables}#{processed_variable_files}"
|
33
|
+
end
|
23
34
|
|
24
35
|
private
|
25
36
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
self.
|
37
|
+
attr_accessor :color, :destroy, :out, :state, :variables, :variable_files
|
38
|
+
|
39
|
+
def initialize_attributes(
|
40
|
+
color:, destroy:, out:, state:, variables:, variable_files:
|
41
|
+
)
|
42
|
+
self.color = color
|
43
|
+
self.destroy = destroy
|
44
|
+
self.out = out
|
45
|
+
self.state = state
|
46
|
+
self.variables = variables
|
47
|
+
self.variable_files = variable_files
|
48
|
+
end
|
49
|
+
|
50
|
+
def processed_variable_files
|
51
|
+
variable_files.each_with_object String.new do |pathname, string|
|
52
|
+
string.concat " -var-file=#{pathname}"
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def processed_variables
|
57
|
+
variables.each_with_object String.new do |(key, value), string|
|
58
|
+
string.concat " -var='#{key}=#{value}'"
|
59
|
+
end
|
33
60
|
end
|
34
61
|
end
|
35
62
|
end
|
@@ -18,15 +18,9 @@ require_relative 'command'
|
|
18
18
|
|
19
19
|
module Terraform
|
20
20
|
# Command to valdidate configuration files
|
21
|
-
class ValidateCommand
|
22
|
-
|
23
|
-
|
24
|
-
private
|
25
|
-
|
26
|
-
def initialize_attributes(dir:)
|
27
|
-
self.name = 'validate'
|
28
|
-
self.options = {}
|
29
|
-
self.target = dir
|
21
|
+
class ValidateCommand < Command
|
22
|
+
def name
|
23
|
+
'validate'
|
30
24
|
end
|
31
25
|
end
|
32
26
|
end
|
data/lib/terraform/version.rb
CHANGED
@@ -18,15 +18,9 @@ require_relative 'command'
|
|
18
18
|
|
19
19
|
module Terraform
|
20
20
|
# Command to obtain the version
|
21
|
-
class VersionCommand
|
22
|
-
|
23
|
-
|
24
|
-
private
|
25
|
-
|
26
|
-
def initialize_attributes(**_)
|
27
|
-
self.name = 'version'
|
28
|
-
self.options = {}
|
29
|
-
self.target = ''
|
21
|
+
class VersionCommand < Command
|
22
|
+
def name
|
23
|
+
'version'
|
30
24
|
end
|
31
25
|
end
|
32
26
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kitchen-terraform
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Aaron Lane
|
@@ -32,7 +32,7 @@ cert_chain:
|
|
32
32
|
KucGZX3OeACVUSpmCOCQyma6sDHYWQZM/IgWi7tbLtG5b2GslkauPm4S3wadHi6W
|
33
33
|
LOU=
|
34
34
|
-----END CERTIFICATE-----
|
35
|
-
date: 2016-
|
35
|
+
date: 2016-09-12 00:00:00.000000000 Z
|
36
36
|
dependencies:
|
37
37
|
- !ruby/object:Gem::Dependency
|
38
38
|
name: bundler-audit
|
@@ -194,6 +194,20 @@ dependencies:
|
|
194
194
|
- - ">="
|
195
195
|
- !ruby/object:Gem::Version
|
196
196
|
version: 0.11.2
|
197
|
+
- !ruby/object:Gem::Dependency
|
198
|
+
name: inspec
|
199
|
+
requirement: !ruby/object:Gem::Requirement
|
200
|
+
requirements:
|
201
|
+
- - "~>"
|
202
|
+
- !ruby/object:Gem::Version
|
203
|
+
version: 0.33.2
|
204
|
+
type: :runtime
|
205
|
+
prerelease: false
|
206
|
+
version_requirements: !ruby/object:Gem::Requirement
|
207
|
+
requirements:
|
208
|
+
- - "~>"
|
209
|
+
- !ruby/object:Gem::Version
|
210
|
+
version: 0.33.2
|
197
211
|
- !ruby/object:Gem::Dependency
|
198
212
|
name: kitchen-inspec
|
199
213
|
requirement: !ruby/object:Gem::Requirement
|
@@ -255,7 +269,7 @@ dependencies:
|
|
255
269
|
- !ruby/object:Gem::Version
|
256
270
|
version: 1.10.0
|
257
271
|
description:
|
258
|
-
email:
|
272
|
+
email: kitchen-terraform@newcontext.com
|
259
273
|
executables: []
|
260
274
|
extensions: []
|
261
275
|
extra_rdoc_files: []
|
@@ -266,16 +280,13 @@ files:
|
|
266
280
|
- lib/kitchen/provisioner/terraform.rb
|
267
281
|
- lib/kitchen/verifier/terraform.rb
|
268
282
|
- lib/terraform/apply_command.rb
|
269
|
-
- lib/terraform/
|
270
|
-
- lib/terraform/client_holder.rb
|
283
|
+
- lib/terraform/color_switch.rb
|
271
284
|
- lib/terraform/command.rb
|
272
|
-
- lib/terraform/
|
273
|
-
- lib/terraform/error.rb
|
285
|
+
- lib/terraform/configurable.rb
|
274
286
|
- lib/terraform/get_command.rb
|
287
|
+
- lib/terraform/group.rb
|
275
288
|
- lib/terraform/inspec_runner.rb
|
276
|
-
- lib/terraform/invalid_version.rb
|
277
289
|
- lib/terraform/output_command.rb
|
278
|
-
- lib/terraform/output_not_found.rb
|
279
290
|
- lib/terraform/plan_command.rb
|
280
291
|
- lib/terraform/validate_command.rb
|
281
292
|
- lib/terraform/version.rb
|
metadata.gz.sig
CHANGED
Binary file
|
data/lib/terraform/client.rb
DELETED
@@ -1,102 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# Copyright 2016 New Context Services, Inc.
|
4
|
-
#
|
5
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
-
# you may not use this file except in compliance with the License.
|
7
|
-
# You may obtain a copy of the License at
|
8
|
-
#
|
9
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
-
#
|
11
|
-
# Unless required by applicable law or agreed to in writing, software
|
12
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
-
# See the License for the specific language governing permissions and
|
15
|
-
# limitations under the License.
|
16
|
-
|
17
|
-
require_relative 'apply_command'
|
18
|
-
require_relative 'get_command'
|
19
|
-
require_relative 'output_command'
|
20
|
-
require_relative 'plan_command'
|
21
|
-
require_relative 'validate_command'
|
22
|
-
require_relative 'version_command'
|
23
|
-
|
24
|
-
module Terraform
|
25
|
-
# Runs Mixlib Terraform Command instances
|
26
|
-
class Client
|
27
|
-
extend Forwardable
|
28
|
-
|
29
|
-
def_delegators :provisioner, :directory, :info, :kitchen_root,
|
30
|
-
:variable_files, :variables
|
31
|
-
|
32
|
-
def apply_execution_plan
|
33
|
-
run command_class: ApplyCommand, state: state_pathname,
|
34
|
-
plan: plan_pathname
|
35
|
-
end
|
36
|
-
|
37
|
-
def download_modules
|
38
|
-
run command_class: GetCommand, dir: directory
|
39
|
-
end
|
40
|
-
|
41
|
-
def extract_list_output(name:)
|
42
|
-
extract_output(name: name) { |output| yield output.split ',' }
|
43
|
-
end
|
44
|
-
|
45
|
-
def extract_output(name:)
|
46
|
-
run(
|
47
|
-
command_class: OutputCommand, state: state_pathname, name: name
|
48
|
-
) { |output| yield output.chomp }
|
49
|
-
end
|
50
|
-
|
51
|
-
def fetch_version
|
52
|
-
run(command_class: VersionCommand) { |output| yield output }
|
53
|
-
end
|
54
|
-
|
55
|
-
def instance_directory
|
56
|
-
kitchen_root.join '.kitchen', 'kitchen-terraform', instance_name
|
57
|
-
end
|
58
|
-
|
59
|
-
def plan_destructive_execution
|
60
|
-
run command_class: PlanCommand, destroy: true, out: plan_pathname,
|
61
|
-
state: state_pathname, var: variables, var_file: variable_files,
|
62
|
-
dir: directory
|
63
|
-
end
|
64
|
-
|
65
|
-
def plan_execution
|
66
|
-
run command_class: PlanCommand, destroy: false, out: plan_pathname,
|
67
|
-
state: state_pathname, var: variables, var_file: variable_files,
|
68
|
-
dir: directory
|
69
|
-
end
|
70
|
-
|
71
|
-
def plan_pathname
|
72
|
-
instance_directory.join 'terraform.tfplan'
|
73
|
-
end
|
74
|
-
|
75
|
-
def run(command_class:, **parameters)
|
76
|
-
command_class.new(**parameters) do |command|
|
77
|
-
info command
|
78
|
-
command.execute do |output|
|
79
|
-
info output
|
80
|
-
yield output if block_given?
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
def state_pathname
|
86
|
-
instance_directory.join 'terraform.tfstate'
|
87
|
-
end
|
88
|
-
|
89
|
-
def validate_configuration_files
|
90
|
-
run command_class: ValidateCommand, dir: directory
|
91
|
-
end
|
92
|
-
|
93
|
-
private
|
94
|
-
|
95
|
-
attr_accessor :instance_name, :provisioner
|
96
|
-
|
97
|
-
def initialize(instance:)
|
98
|
-
self.instance_name = instance.name
|
99
|
-
self.provisioner = instance.provisioner
|
100
|
-
end
|
101
|
-
end
|
102
|
-
end
|
@@ -1,26 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# Copyright 2016 New Context Services, Inc.
|
4
|
-
#
|
5
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
-
# you may not use this file except in compliance with the License.
|
7
|
-
# You may obtain a copy of the License at
|
8
|
-
#
|
9
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
-
#
|
11
|
-
# Unless required by applicable law or agreed to in writing, software
|
12
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
-
# See the License for the specific language governing permissions and
|
15
|
-
# limitations under the License.
|
16
|
-
|
17
|
-
require_relative 'client'
|
18
|
-
|
19
|
-
module Terraform
|
20
|
-
# Logic to provide a lazily initialized Client instance
|
21
|
-
module ClientHolder
|
22
|
-
def client
|
23
|
-
@client ||= Client.new instance: instance
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
data/lib/terraform/error.rb
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# Copyright 2016 New Context Services, Inc.
|
4
|
-
#
|
5
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
-
# you may not use this file except in compliance with the License.
|
7
|
-
# You may obtain a copy of the License at
|
8
|
-
#
|
9
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
-
#
|
11
|
-
# Unless required by applicable law or agreed to in writing, software
|
12
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
-
# See the License for the specific language governing permissions and
|
15
|
-
# limitations under the License.
|
16
|
-
|
17
|
-
module Terraform
|
18
|
-
class Error < StandardError
|
19
|
-
end
|
20
|
-
end
|
@@ -1,34 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# Copyright 2016 New Context Services, Inc.
|
4
|
-
#
|
5
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
-
# you may not use this file except in compliance with the License.
|
7
|
-
# You may obtain a copy of the License at
|
8
|
-
#
|
9
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
-
#
|
11
|
-
# Unless required by applicable law or agreed to in writing, software
|
12
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
-
# See the License for the specific language governing permissions and
|
15
|
-
# limitations under the License.
|
16
|
-
|
17
|
-
require_relative 'error'
|
18
|
-
|
19
|
-
module Terraform
|
20
|
-
# Error of an invalid Terraform version
|
21
|
-
class InvalidVersion < Error
|
22
|
-
def message
|
23
|
-
"Terraform version must match #{supported_version}"
|
24
|
-
end
|
25
|
-
|
26
|
-
private
|
27
|
-
|
28
|
-
attr_accessor :supported_version
|
29
|
-
|
30
|
-
def initialize(supported_version)
|
31
|
-
self.supported_version = supported_version
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|