kitchen-terraform 0.7.0 → 1.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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +3 -1
- data/README.md +33 -359
- data/lib/kitchen/driver/terraform.rb +273 -57
- data/lib/kitchen/driver/terraform/verify_client_version.rb +44 -0
- data/lib/kitchen/driver/terraform/workflow.rb +90 -0
- data/lib/kitchen/provisioner/terraform.rb +31 -37
- data/lib/{terraform/get_command.rb → kitchen/terraform.rb} +3 -5
- data/lib/{terraform/deprecated_version.rb → kitchen/terraform/client.rb} +5 -12
- data/lib/kitchen/terraform/client/apply.rb +38 -0
- data/lib/kitchen/terraform/client/execute_command.rb +56 -0
- data/lib/kitchen/terraform/client/get.rb +35 -0
- data/lib/kitchen/terraform/client/output.rb +50 -0
- data/lib/kitchen/terraform/client/plan.rb +42 -0
- data/lib/kitchen/terraform/client/process_options.rb +87 -0
- data/lib/kitchen/terraform/client/validate.rb +35 -0
- data/lib/kitchen/terraform/client/version.rb +48 -0
- data/lib/{terraform/apply_timeout_config.rb → kitchen/terraform/create_directories.rb} +18 -11
- data/lib/kitchen/terraform/define_config_attribute.rb +39 -0
- data/lib/kitchen/terraform/define_integer_config_attribute.rb +43 -0
- data/lib/kitchen/terraform/define_string_config_attribute.rb +43 -0
- data/lib/kitchen/verifier/terraform.rb +186 -38
- data/lib/kitchen/verifier/terraform/configure_inspec_runner_attributes.rb +93 -0
- data/lib/kitchen/verifier/terraform/configure_inspec_runner_backend.rb +32 -0
- data/lib/kitchen/verifier/terraform/configure_inspec_runner_controls.rb +39 -0
- data/lib/{terraform/apply_command.rb → kitchen/verifier/terraform/configure_inspec_runner_host.rb} +11 -15
- data/lib/{terraform/deprecated_output_parser.rb → kitchen/verifier/terraform/configure_inspec_runner_port.rb} +16 -20
- data/lib/{terraform/deprecated_variables_coercer.rb → kitchen/verifier/terraform/configure_inspec_runner_user.rb} +16 -14
- data/lib/kitchen/verifier/terraform/enumerate_groups_and_hostnames.rb +67 -0
- data/lib/{terraform/version_command.rb → terraform.rb} +1 -5
- data/lib/terraform/configurable.rb +18 -61
- data/lib/terraform/debug_logger.rb +12 -12
- data/lib/terraform/project_version.rb +1 -1
- metadata +72 -135
- metadata.gz.sig +0 -0
- data/lib/terraform/cli_config.rb +0 -29
- data/lib/terraform/client.rb +0 -96
- data/lib/terraform/color_coercer.rb +0 -35
- data/lib/terraform/color_config.rb +0 -32
- data/lib/terraform/command.rb +0 -53
- data/lib/terraform/command_factory.rb +0 -111
- data/lib/terraform/command_option.rb +0 -65
- data/lib/terraform/command_options.rb +0 -103
- data/lib/terraform/destructive_plan_command.rb +0 -35
- data/lib/terraform/directory_config.rb +0 -32
- data/lib/terraform/file_configs.rb +0 -36
- data/lib/terraform/group.rb +0 -61
- data/lib/terraform/group_attributes.rb +0 -42
- data/lib/terraform/group_hostnames.rb +0 -38
- data/lib/terraform/groups_coercer.rb +0 -43
- data/lib/terraform/groups_config.rb +0 -32
- data/lib/terraform/integer_coercer.rb +0 -37
- data/lib/terraform/no_output_parser.rb +0 -28
- data/lib/terraform/output_command.rb +0 -23
- data/lib/terraform/output_parser.rb +0 -55
- data/lib/terraform/parallelism_config.rb +0 -32
- data/lib/terraform/pathname_coercer.rb +0 -40
- data/lib/terraform/plan_command.rb +0 -30
- data/lib/terraform/prepare_input_file.rb +0 -34
- data/lib/terraform/prepare_output_file.rb +0 -36
- data/lib/terraform/shell_out.rb +0 -59
- data/lib/terraform/show_command.rb +0 -30
- data/lib/terraform/simple_coercer.rb +0 -36
- data/lib/terraform/simple_config.rb +0 -28
- data/lib/terraform/unsupported_version.rb +0 -26
- data/lib/terraform/validate_command.rb +0 -23
- data/lib/terraform/variable_files_coercer.rb +0 -40
- data/lib/terraform/variable_files_config.rb +0 -32
- data/lib/terraform/variables_coercer.rb +0 -49
- data/lib/terraform/variables_config.rb +0 -32
- data/lib/terraform/version.rb +0 -73
@@ -0,0 +1,44 @@
|
|
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 "dry/monads"
|
18
|
+
require "kitchen/driver/terraform"
|
19
|
+
|
20
|
+
# Verifies that the provided Terraform Client version is supported.
|
21
|
+
#
|
22
|
+
# Supported:: Terraform version 0.9.
|
23
|
+
#
|
24
|
+
# Deprecated:: Terraform versions 0.7 and 0.8.
|
25
|
+
#
|
26
|
+
# Not Supported:: Terraform versions 0.6 and older.
|
27
|
+
module ::Kitchen::Driver::Terraform::VerifyClientVersion
|
28
|
+
extend ::Dry::Monads::Either::Mixin
|
29
|
+
|
30
|
+
# Invokes the function.
|
31
|
+
#
|
32
|
+
# @param version [::Float] the Terraform Client version.
|
33
|
+
# @return [::Dry::Monads::Either] the result of the function.
|
34
|
+
def self.call(version:)
|
35
|
+
if version == 0.9
|
36
|
+
Right "Terraform version #{version} is supported"
|
37
|
+
elsif (0.7..0.8).cover? version
|
38
|
+
Right "Terraform version #{version} is deprecated and will not be supported by kitchen-terraform version " \
|
39
|
+
"2.0; upgrade to Terraform version 0.9 to remain supported"
|
40
|
+
else
|
41
|
+
Left "Terraform version #{version} is not supported; supported Terraform versions are 0.7 through 0.9"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,90 @@
|
|
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 "dry/monads"
|
18
|
+
require "kitchen/driver/terraform"
|
19
|
+
require "kitchen/terraform/client/apply"
|
20
|
+
require "kitchen/terraform/client/get"
|
21
|
+
require "kitchen/terraform/client/validate"
|
22
|
+
require "kitchen/terraform/create_directories"
|
23
|
+
|
24
|
+
# Creates the directories to contain the root Terraform module, the Terraform execution plan, and the Terraform state,
|
25
|
+
# then validates the Terraform configuration, updates any Terraform dependencies, and applies a constructive or
|
26
|
+
# destructive Terraform execution plan to the Terraform state.
|
27
|
+
module ::Kitchen::Driver::Terraform::Workflow
|
28
|
+
extend ::Dry::Monads::Either::Mixin
|
29
|
+
|
30
|
+
# Invokes the function.
|
31
|
+
#
|
32
|
+
# @param config [::Kitchen::Config] the configuration of the kitchen-terraform driver.
|
33
|
+
# @param destroy [::TrueClass, ::FalseClass] the flag that controls constructive or destructive planning.
|
34
|
+
# @param logger [#<<] a logger to receive the execution output of the Terraform Client functions.
|
35
|
+
# @return [::Dry::Monads::Either] the result of the function.
|
36
|
+
# @see ::Kitchen::Terraform::Client::Apply
|
37
|
+
# @see ::Kitchen::Terraform::Client::Get
|
38
|
+
# @see ::Kitchen::Terraform::Client::Plan
|
39
|
+
# @see ::Kitchen::Terraform::Client::Validate
|
40
|
+
# @see ::Kitchen::Terraform::CreateDirectories
|
41
|
+
def self.call(config:, destroy: false, logger:)
|
42
|
+
::Kitchen::Terraform::CreateDirectories.call(
|
43
|
+
directories: [
|
44
|
+
config.fetch(:directory),
|
45
|
+
::File.dirname(config.fetch(:plan)),
|
46
|
+
::File.dirname(config.fetch(:state))
|
47
|
+
]
|
48
|
+
).fmap do |created_directories|
|
49
|
+
logger.debug created_directories
|
50
|
+
end.bind do
|
51
|
+
::Kitchen::Terraform::Client::Validate.call cli: config.fetch(:cli),
|
52
|
+
directory: config.fetch(:directory),
|
53
|
+
logger: logger,
|
54
|
+
timeout: config.fetch(:command_timeout)
|
55
|
+
end.bind do
|
56
|
+
::Kitchen::Terraform::Client::Get.call cli: config.fetch(:cli),
|
57
|
+
logger: logger,
|
58
|
+
root_module: config.fetch(:directory),
|
59
|
+
timeout: config.fetch(:command_timeout)
|
60
|
+
end.bind do
|
61
|
+
::Kitchen::Terraform::Client::Plan.call cli: config.fetch(:cli),
|
62
|
+
logger: logger,
|
63
|
+
options: {
|
64
|
+
color: config.fetch(:color),
|
65
|
+
destroy: destroy,
|
66
|
+
out: config.fetch(:plan),
|
67
|
+
parallelism: config.fetch(:parallelism),
|
68
|
+
state: config.fetch(:state),
|
69
|
+
var: config.fetch(:variables),
|
70
|
+
var_file: config.fetch(:variable_files)
|
71
|
+
},
|
72
|
+
root_module: config.fetch(:directory),
|
73
|
+
timeout: config.fetch(:command_timeout)
|
74
|
+
end.bind do
|
75
|
+
::Kitchen::Terraform::Client::Apply.call cli: config.fetch(:cli),
|
76
|
+
logger: logger,
|
77
|
+
options: {
|
78
|
+
color: config.fetch(:color),
|
79
|
+
parallelism: config.fetch(:parallelism),
|
80
|
+
state_out: config.fetch(:state)
|
81
|
+
},
|
82
|
+
plan: config.fetch(:plan),
|
83
|
+
timeout: config.fetch(:command_timeout)
|
84
|
+
end.fmap do
|
85
|
+
"driver workflow was a success"
|
86
|
+
end.or do |error|
|
87
|
+
Left "driver workflow was a failure\n#{error}"
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
@@ -14,43 +14,37 @@
|
|
14
14
|
# See the License for the specific language governing permissions and
|
15
15
|
# limitations under the License.
|
16
16
|
|
17
|
-
require
|
18
|
-
require
|
19
|
-
require 'terraform/color_config'
|
20
|
-
require 'terraform/configurable'
|
21
|
-
require 'terraform/directory_config'
|
22
|
-
require 'terraform/file_configs'
|
23
|
-
require 'terraform/parallelism_config'
|
24
|
-
require 'terraform/variable_files_config'
|
25
|
-
require 'terraform/variables_config'
|
17
|
+
require "kitchen"
|
18
|
+
require "terraform/configurable"
|
26
19
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
20
|
+
# The design of the provisioner is unconventional compared to other Test Kitchen provisioner plugins. Since Terraform
|
21
|
+
# creates and provisions resources when applying an execution plan, managed by the driver, the provisioner simply
|
22
|
+
# proxies the driver's create action to apply any changes to the existing Terraform state.
|
23
|
+
#
|
24
|
+
# === Configuration
|
25
|
+
#
|
26
|
+
# ==== Example .kitchen.yml snippet
|
27
|
+
#
|
28
|
+
# provisioner:
|
29
|
+
# name: terraform
|
30
|
+
#
|
31
|
+
# @see ::Kitchen::Driver::Terraform
|
32
|
+
# @see https://www.terraform.io/docs/commands/plan.html Terraform execution plan
|
33
|
+
# @see https://www.terraform.io/docs/state/index.html Terraform state
|
34
|
+
# @version 2
|
35
|
+
class ::Kitchen::Provisioner::Terraform < ::Kitchen::Provisioner::Base
|
36
|
+
kitchen_provisioner_api_version 2
|
37
|
+
|
38
|
+
include ::Terraform::Configurable
|
39
|
+
|
40
|
+
# Proxies the driver's create action.
|
41
|
+
#
|
42
|
+
# @example
|
43
|
+
# `kitchen converge suite-name`
|
44
|
+
# @param state [::Hash] the mutable instance and provisioner state.
|
45
|
+
# @raise [::Kitchen::ActionFailed] if the result of the action is a failure.
|
46
|
+
# @return [::Dry::Monads::Either] the result of the action.
|
47
|
+
def call(state)
|
48
|
+
instance.driver.create state
|
55
49
|
end
|
56
50
|
end
|
@@ -14,10 +14,8 @@
|
|
14
14
|
# See the License for the specific language governing permissions and
|
15
15
|
# limitations under the License.
|
16
16
|
|
17
|
-
require
|
17
|
+
require "kitchen"
|
18
18
|
|
19
|
-
|
20
|
-
|
21
|
-
class GetCommand < ::Terraform::Command
|
22
|
-
end
|
19
|
+
# The namespace for kitchen-terraform.
|
20
|
+
module ::Kitchen::Terraform
|
23
21
|
end
|
@@ -14,17 +14,10 @@
|
|
14
14
|
# See the License for the specific language governing permissions and
|
15
15
|
# limitations under the License.
|
16
16
|
|
17
|
-
require
|
17
|
+
require "kitchen/terraform"
|
18
18
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
yield
|
24
|
-
end
|
25
|
-
|
26
|
-
def if_json_not_supported
|
27
|
-
yield
|
28
|
-
end
|
29
|
-
end
|
19
|
+
# The namespace for functions that wrap the Terraform command-line interface (CLI) commands.
|
20
|
+
#
|
21
|
+
# @see https://www.terraform.io/docs/commands/index.html Terraform CLI
|
22
|
+
module ::Kitchen::Terraform::Client
|
30
23
|
end
|
@@ -0,0 +1,38 @@
|
|
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 "kitchen/terraform/client"
|
18
|
+
require "kitchen/terraform/client/execute_command"
|
19
|
+
|
20
|
+
# Applies the the pre-determined set of actions generated by a Terraform execution plan.
|
21
|
+
#
|
22
|
+
# @see https://www.terraform.io/docs/commands/apply.html Terraform apply command
|
23
|
+
# @see https://www.terraform.io/docs/commands/plan.html Terraform plan command
|
24
|
+
module ::Kitchen::Terraform::Client::Apply
|
25
|
+
# Invokes the function.
|
26
|
+
#
|
27
|
+
# @param cli [::String] the path of the Terraform CLI to use to execute the apply command.
|
28
|
+
# @param logger [#<<] a logger to receive the stdout and stderr of the apply command.
|
29
|
+
# @param options [::Hash] the options for the apply command.
|
30
|
+
# @param plan [::String] the path of the Terraform execution plan to apply.
|
31
|
+
# @param timeout [::Integer] the maximum execution time in seconds for the apply command.
|
32
|
+
# @return [::Dry::Monads::Either] the result of the function.
|
33
|
+
def self.call(cli:, logger:, options:, plan:, timeout:)
|
34
|
+
::Kitchen::Terraform::Client::ExecuteCommand.call cli: cli, command: "apply", logger: logger,
|
35
|
+
options: options.merge(input: false), target: plan,
|
36
|
+
timeout: timeout
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,56 @@
|
|
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 "dry/monads"
|
18
|
+
require "kitchen/terraform/client"
|
19
|
+
require "kitchen/terraform/client/process_options"
|
20
|
+
require "mixlib/shellout"
|
21
|
+
|
22
|
+
# Executes Terraform commands.
|
23
|
+
#
|
24
|
+
# @see https://www.terraform.io/docs/commands/index.html Terraform commands
|
25
|
+
module ::Kitchen::Terraform::Client::ExecuteCommand
|
26
|
+
extend ::Dry::Monads::Either::Mixin
|
27
|
+
|
28
|
+
extend ::Dry::Monads::Try::Mixin
|
29
|
+
|
30
|
+
# Invokes the function.
|
31
|
+
#
|
32
|
+
# @param cli [::String] the path of the Terraform CLI to use for command execution.
|
33
|
+
# @param command [::String] the name of the command to execute.
|
34
|
+
# @param logger [#<<] a logger to receive the stdout and stderr of the command.
|
35
|
+
# @param options [::Hash] the options for the command.
|
36
|
+
# @param target [::String] the target of the command.
|
37
|
+
# @param timeout [::Integer] the maximum execution time in seconds for the command.
|
38
|
+
# @return [::Dry::Monads::Either] the result of the function.
|
39
|
+
def self.call(cli:, command:, logger:, options: {}, target: "", timeout:)
|
40
|
+
::Kitchen::Terraform::Client::ProcessOptions.call(unprocessed_options: options).fmap do |processed_options|
|
41
|
+
::Mixlib::ShellOut.new [cli, command, *processed_options, target].join(" ").strip,
|
42
|
+
live_stream: logger, timeout: timeout
|
43
|
+
end.bind do |shell_out|
|
44
|
+
Try ::Errno::EACCES, ::Errno::ENOENT, ::Mixlib::ShellOut::CommandTimeout do
|
45
|
+
shell_out.run_command
|
46
|
+
end
|
47
|
+
end.bind do |shell_out|
|
48
|
+
Try ::Mixlib::ShellOut::ShellCommandFailed do
|
49
|
+
shell_out.error!
|
50
|
+
shell_out
|
51
|
+
end
|
52
|
+
end.to_either.fmap(&:stdout).or do |error|
|
53
|
+
Left "`#{cli} #{command} #{target}` failed: '#{error}'"
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,35 @@
|
|
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 "kitchen/terraform/client"
|
18
|
+
require "kitchen/terraform/client/execute_command"
|
19
|
+
|
20
|
+
# Downloads and updates modules mentioned in the root Terraform module.
|
21
|
+
#
|
22
|
+
# @see https://www.terraform.io/docs/commands/get.html Terraform get command
|
23
|
+
module ::Kitchen::Terraform::Client::Get
|
24
|
+
# Invokes the function.
|
25
|
+
#
|
26
|
+
# @param cli [::String] the path of the Terraform CLI to use to execute the get command.
|
27
|
+
# @param logger [#<<] a logger to receive the stdour and stderr of the get command.
|
28
|
+
# @param root_module [::String] the path of the root module.
|
29
|
+
# @param timeout [::Integer] the maximum execution time in seconds for the get command.
|
30
|
+
# @return [::Dry::Monads::Either] the result of the function.
|
31
|
+
def self.call(cli:, logger:, root_module:, timeout:)
|
32
|
+
::Kitchen::Terraform::Client::ExecuteCommand.call cli: cli, command: "get", logger: logger, options: {update: true},
|
33
|
+
target: root_module, timeout: timeout
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,50 @@
|
|
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 "dry/monads"
|
18
|
+
require "json"
|
19
|
+
require "kitchen/terraform/client"
|
20
|
+
require "kitchen/terraform/client/execute_command"
|
21
|
+
|
22
|
+
# Extracts the values of Terraform output variables from a Terraform state.
|
23
|
+
#
|
24
|
+
# @see https://www.terraform.io/docs/commands/output.html Terraform output command
|
25
|
+
# @see https://www.terraform.io/docs/configuration/outputs.html Terraform output variables
|
26
|
+
# @see https://www.terraform.io/docs/state/index.html Terraform state
|
27
|
+
module ::Kitchen::Terraform::Client::Output
|
28
|
+
extend ::Dry::Monads::Either::Mixin
|
29
|
+
|
30
|
+
extend ::Dry::Monads::Try::Mixin
|
31
|
+
|
32
|
+
# Invokes the function.
|
33
|
+
#
|
34
|
+
# @param cli [::String] the path of the Terraform CLI to use to execute the output command.
|
35
|
+
# @param logger [#<<] a logger to receive the stdout and stderr of the output command.
|
36
|
+
# @param options [::Hash] the options for the output command.
|
37
|
+
# @param timeout [::Integer] the maximum execution time in seconds for the output command.
|
38
|
+
# @return [::Dry::Monads::Either] the result of the function.
|
39
|
+
def self.call(cli:, logger:, options:, timeout:)
|
40
|
+
::Kitchen::Terraform::Client::ExecuteCommand
|
41
|
+
.call(cli: cli, command: "output", logger: logger, options: options.merge(json: true), timeout: timeout)
|
42
|
+
.bind do |output|
|
43
|
+
Try ::JSON::ParserError do
|
44
|
+
::JSON.parse output
|
45
|
+
end
|
46
|
+
end.to_either.or do |error|
|
47
|
+
Left "parsing Terraform client output as JSON failed\n#{error}"
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,42 @@
|
|
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 "kitchen/terraform/client"
|
18
|
+
require "kitchen/terraform/client/execute_command"
|
19
|
+
|
20
|
+
# Creates a Terraform execution plan.
|
21
|
+
#
|
22
|
+
# @see https://www.terraform.io/docs/commands/plan.html Terraform plan command
|
23
|
+
module ::Kitchen::Terraform::Client::Plan
|
24
|
+
# Invokes the function.
|
25
|
+
#
|
26
|
+
# @param cli [::String] the path of the Terraform CLI to use to execute the plan command.
|
27
|
+
# @param logger [#<<] a logger to receive the stdout and stderr of the plan command.
|
28
|
+
# @param options [::Hash] the options for the plan command.
|
29
|
+
# @param root_module [::String] the path of the root Terraform module.
|
30
|
+
# @param timeout [::Integer] the maximum execution time in seconds for the plan command.
|
31
|
+
# @return [::Dry::Monads::Either] the result of the function.
|
32
|
+
def self.call(cli:, logger:, options:, root_module:, timeout:)
|
33
|
+
::Kitchen::Terraform::Client::ExecuteCommand.call cli: cli,
|
34
|
+
command: "plan",
|
35
|
+
logger: logger,
|
36
|
+
options: options.merge(
|
37
|
+
input: false
|
38
|
+
),
|
39
|
+
target: root_module,
|
40
|
+
timeout: timeout
|
41
|
+
end
|
42
|
+
end
|