kitchen-terraform 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +1 -3
- data/README.md +31 -28
- data/lib/kitchen/driver/terraform.rb +24 -8
- data/lib/kitchen/provisioner/terraform.rb +20 -144
- data/lib/kitchen/verifier/terraform.rb +32 -19
- data/lib/terraform/apply_command.rb +2 -2
- data/lib/terraform/apply_timeout_config.rb +34 -0
- data/lib/terraform/client.rb +76 -0
- data/lib/terraform/color_config.rb +34 -0
- data/lib/terraform/color_switch.rb +6 -2
- data/lib/terraform/command.rb +22 -27
- data/lib/terraform/command_executor.rb +41 -0
- data/lib/terraform/command_extender.rb +27 -0
- data/lib/terraform/configurable.rb +25 -10
- data/lib/terraform/directory_config.rb +27 -0
- data/lib/terraform/group.rb +26 -63
- data/lib/terraform/groups_config.rb +78 -0
- data/lib/terraform/inspec_runner.rb +5 -15
- data/lib/terraform/output_command.rb +13 -6
- data/lib/terraform/plan_command.rb +3 -4
- data/lib/terraform/plan_config.rb +27 -0
- data/lib/terraform/show_command.rb +39 -0
- data/lib/terraform/state_config.rb +27 -0
- data/lib/terraform/validate_command.rb +4 -0
- data/lib/terraform/variable_files_config.rb +33 -0
- data/lib/terraform/variables_config.rb +47 -0
- data/lib/terraform/version.rb +1 -1
- data/lib/terraform/version_command.rb +4 -0
- data/lib/terraform/zero_seven_output.rb +33 -0
- data/lib/terraform/zero_six_output.rb +30 -0
- metadata +90 -5
- metadata.gz.sig +0 -0
@@ -0,0 +1,78 @@
|
|
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 'group'
|
18
|
+
|
19
|
+
module Terraform
|
20
|
+
# Behaviour for the [:groups] config option
|
21
|
+
module GroupsConfig
|
22
|
+
def self.included(configurable_class)
|
23
|
+
configurable_class.required_config :groups do |_, value, configurable|
|
24
|
+
configurable.coerce_groups value: value
|
25
|
+
end
|
26
|
+
configurable_class.default_config :groups, []
|
27
|
+
end
|
28
|
+
|
29
|
+
def coerce_attributes(group:)
|
30
|
+
group[:attributes] = Hash group[:attributes]
|
31
|
+
rescue TypeError
|
32
|
+
config_error attribute: "groups][#{group}][:attributes",
|
33
|
+
expected: 'a mapping of Inspec attribute names to ' \
|
34
|
+
'Terraform output variable names'
|
35
|
+
end
|
36
|
+
|
37
|
+
def coerce_controls(group:)
|
38
|
+
group[:controls] = Array group[:controls]
|
39
|
+
end
|
40
|
+
|
41
|
+
def coerce_groups(value:)
|
42
|
+
config[:groups] = Array(value).map do |group|
|
43
|
+
Group.new data: coerced_group(value: group)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def coerce_hostnames(group:)
|
48
|
+
group[:hostnames] = String group[:hostnames]
|
49
|
+
end
|
50
|
+
|
51
|
+
def coerce_name(group:)
|
52
|
+
group[:name] = String group[:name]
|
53
|
+
end
|
54
|
+
|
55
|
+
def coerce_port(group:)
|
56
|
+
group[:port] = Integer group.fetch(:port) { transport[:port] }
|
57
|
+
rescue ArgumentError, TypeError
|
58
|
+
config_error attribute: "groups][#{group}][:port", expected: 'an integer'
|
59
|
+
end
|
60
|
+
|
61
|
+
def coerce_username(group:)
|
62
|
+
group[:username] = String group.fetch(:username) { transport[:username] }
|
63
|
+
end
|
64
|
+
|
65
|
+
def coerced_group(value:)
|
66
|
+
Hash(value).tap do |group|
|
67
|
+
coerce_attributes group: group
|
68
|
+
coerce_controls group: group
|
69
|
+
coerce_hostnames group: group
|
70
|
+
coerce_name group: group
|
71
|
+
coerce_port group: group
|
72
|
+
coerce_username group: group
|
73
|
+
end
|
74
|
+
rescue TypeError
|
75
|
+
config_error attribute: "groups][#{value}", expected: 'a group mapping'
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -15,6 +15,7 @@
|
|
15
15
|
# limitations under the License.
|
16
16
|
|
17
17
|
require 'inspec'
|
18
|
+
require 'kitchen'
|
18
19
|
|
19
20
|
module Terraform
|
20
21
|
# Inspec::Runner with convenience methods for use by
|
@@ -22,26 +23,15 @@ module Terraform
|
|
22
23
|
class InspecRunner < Inspec::Runner
|
23
24
|
attr_reader :conf
|
24
25
|
|
25
|
-
def
|
26
|
-
|
27
|
-
|
28
|
-
verifier.populate runner: runner
|
29
|
-
verifier.evaluate exit_code: runner.run
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
def add(target:)
|
34
|
-
add_target target, conf
|
35
|
-
end
|
36
|
-
|
37
|
-
def set_attribute(key:, value:)
|
38
|
-
conf[:attributes].store key.to_s, value
|
26
|
+
def evaluate(verifier:)
|
27
|
+
verifier.add_targets runner: self
|
28
|
+
verifier.verify exit_code: run
|
39
29
|
end
|
40
30
|
|
41
31
|
private
|
42
32
|
|
43
33
|
def initialize(conf = {})
|
44
|
-
conf
|
34
|
+
conf[:attributes] = Kitchen::Util.stringified_hash conf[:attributes]
|
45
35
|
super
|
46
36
|
end
|
47
37
|
end
|
@@ -15,24 +15,31 @@
|
|
15
15
|
# limitations under the License.
|
16
16
|
|
17
17
|
require_relative 'command'
|
18
|
+
require_relative 'command_extender'
|
19
|
+
require_relative 'zero_six_output'
|
20
|
+
require_relative 'zero_seven_output'
|
18
21
|
|
19
22
|
module Terraform
|
20
23
|
# Command to extract values of output variables
|
21
24
|
class OutputCommand < Command
|
25
|
+
include CommandExtender
|
26
|
+
|
22
27
|
def name
|
23
28
|
'output'
|
24
29
|
end
|
25
30
|
|
26
|
-
def options
|
27
|
-
"-state=#{state}"
|
28
|
-
end
|
29
|
-
|
30
31
|
private
|
31
32
|
|
32
|
-
attr_accessor :state
|
33
|
+
attr_accessor :list, :state
|
33
34
|
|
34
|
-
def initialize_attributes(state:)
|
35
|
+
def initialize_attributes(list:, version:, state:)
|
36
|
+
extend_behaviour version: version
|
37
|
+
self.list = list
|
35
38
|
self.state = state
|
36
39
|
end
|
40
|
+
|
41
|
+
def version_behaviours
|
42
|
+
{ /v0.7/ => ZeroSevenOutput, /v0.6/ => ZeroSixOutput }
|
43
|
+
end
|
37
44
|
end
|
38
45
|
end
|
@@ -27,14 +27,13 @@ module Terraform
|
|
27
27
|
end
|
28
28
|
|
29
29
|
def options
|
30
|
-
"-destroy=#{destroy} -input=false -out=#{out} -state=#{state}" \
|
31
|
-
"#{color_switch}"
|
32
|
-
"#{processed_variables}#{processed_variable_files}"
|
30
|
+
"-destroy=#{destroy} -input=false -out=#{out} -state=#{state} " \
|
31
|
+
"#{color_switch}#{processed_variables}#{processed_variable_files}"
|
33
32
|
end
|
34
33
|
|
35
34
|
private
|
36
35
|
|
37
|
-
attr_accessor :
|
36
|
+
attr_accessor :destroy, :out, :state, :variables, :variable_files
|
38
37
|
|
39
38
|
def initialize_attributes(
|
40
39
|
color:, destroy:, out:, state:, variables:, variable_files:
|
@@ -0,0 +1,27 @@
|
|
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
|
+
# Behaviour for the [:plan] config option
|
19
|
+
module PlanConfig
|
20
|
+
def self.included(configurable_class)
|
21
|
+
configurable_class.default_config :plan do |configurable|
|
22
|
+
configurable.instance_pathname filename: 'terraform.tfplan'
|
23
|
+
end
|
24
|
+
configurable_class.expand_path_for :plan
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,39 @@
|
|
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 'command'
|
18
|
+
require_relative 'color_switch'
|
19
|
+
|
20
|
+
module Terraform
|
21
|
+
# Command to show a state or plan
|
22
|
+
class ShowCommand < Command
|
23
|
+
include ColorSwitch
|
24
|
+
|
25
|
+
def name
|
26
|
+
'show'
|
27
|
+
end
|
28
|
+
|
29
|
+
def options
|
30
|
+
color_switch
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def initialize_attributes(color:)
|
36
|
+
self.color = color
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,27 @@
|
|
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
|
+
# Behaviour for the [:state] config option
|
19
|
+
module StateConfig
|
20
|
+
def self.included(configurable_class)
|
21
|
+
configurable_class.default_config :state do |configurable|
|
22
|
+
configurable.instance_pathname filename: 'terraform.tfstate'
|
23
|
+
end
|
24
|
+
configurable_class.expand_path_for :state
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,33 @@
|
|
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
|
+
# Behaviour for the [:variable_files] config option
|
19
|
+
module VariableFilesConfig
|
20
|
+
def self.included(configurable_class)
|
21
|
+
configurable_class
|
22
|
+
.required_config :variable_files do |_, value, configurable|
|
23
|
+
configurable.coerce_variable_files value: value
|
24
|
+
end
|
25
|
+
configurable_class.default_config :variable_files, []
|
26
|
+
configurable_class.expand_path_for :variable_files
|
27
|
+
end
|
28
|
+
|
29
|
+
def coerce_variable_files(value:)
|
30
|
+
config[:variable_files] = Array value
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,47 @@
|
|
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
|
+
# Behaviour for the [:variables] config option
|
19
|
+
module VariablesConfig
|
20
|
+
def self.included(configurable_class)
|
21
|
+
configurable_class.required_config :variables do |_, value, configurable|
|
22
|
+
configurable.coerce_variables value: value
|
23
|
+
end
|
24
|
+
configurable_class.default_config :variables, {}
|
25
|
+
end
|
26
|
+
|
27
|
+
def coerce_variables(value:)
|
28
|
+
config[:variables] =
|
29
|
+
if value.is_a?(Array) || value.is_a?(String)
|
30
|
+
deprecated_variables_format value: value
|
31
|
+
else
|
32
|
+
Hash value
|
33
|
+
end
|
34
|
+
rescue ArgumentError, TypeError
|
35
|
+
config_error attribute: 'variables',
|
36
|
+
expected: 'a mapping of Terraform variable assignments'
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def deprecated_variables_format(value:)
|
42
|
+
config_deprecated attribute: 'variables', remediation: 'Use a mapping',
|
43
|
+
type: 'a list or string', version: '1.0'
|
44
|
+
Hash[Array(value).map { |string| string.split '=' }]
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
data/lib/terraform/version.rb
CHANGED
@@ -0,0 +1,33 @@
|
|
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 'json'
|
18
|
+
|
19
|
+
module Terraform
|
20
|
+
# Behaviour for OutputCommand with Terraform 0.7
|
21
|
+
module ZeroSevenOutput
|
22
|
+
def options
|
23
|
+
"-json=true -state=#{state}"
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def processed_output(raw_output:)
|
29
|
+
JSON.parse(raw_output).fetch('value')
|
30
|
+
.tap { |value| return list ? Array(value) : value }
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,30 @@
|
|
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
|
+
# Behaviour for OutputCommand with Terraform 0.6
|
19
|
+
module ZeroSixOutput
|
20
|
+
def options
|
21
|
+
"-state=#{state}"
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def processed_output(raw_output:)
|
27
|
+
raw_output.chomp.tap { |value| return list ? value.split(',') : value }
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|