kitchen-terraform 0.5.1 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +2 -2
  4. data/README.md +61 -6
  5. data/lib/kitchen/driver/terraform.rb +37 -22
  6. data/lib/kitchen/provisioner/terraform.rb +14 -18
  7. data/lib/kitchen/verifier/terraform.rb +25 -48
  8. data/lib/terraform/apply_command.rb +11 -20
  9. data/lib/terraform/apply_timeout_config.rb +9 -11
  10. data/lib/terraform/cli_config.rb +29 -0
  11. data/lib/terraform/client.rb +57 -52
  12. data/lib/terraform/color_coercer.rb +35 -0
  13. data/lib/terraform/color_config.rb +9 -11
  14. data/lib/terraform/command.rb +16 -30
  15. data/lib/terraform/command_factory.rb +111 -0
  16. data/lib/terraform/command_option.rb +65 -0
  17. data/lib/terraform/command_options.rb +95 -0
  18. data/lib/terraform/configurable.rb +42 -17
  19. data/lib/terraform/{zero_six_output.rb → debug_logger.rb} +10 -7
  20. data/lib/terraform/deprecated_output_parser.rb +41 -0
  21. data/lib/terraform/deprecated_variables_coercer.rb +35 -0
  22. data/lib/terraform/{command_extender.rb → deprecated_version.rb} +10 -7
  23. data/lib/terraform/destructive_plan_command.rb +35 -0
  24. data/lib/terraform/directory_config.rb +10 -5
  25. data/lib/terraform/file_configs.rb +36 -0
  26. data/lib/terraform/get_command.rb +3 -10
  27. data/lib/terraform/group.rb +29 -29
  28. data/lib/terraform/group_attributes.rb +42 -0
  29. data/lib/terraform/group_hostnames.rb +38 -0
  30. data/lib/terraform/groups_coercer.rb +43 -0
  31. data/lib/terraform/groups_config.rb +8 -54
  32. data/lib/terraform/integer_coercer.rb +37 -0
  33. data/lib/terraform/{plan_config.rb → no_output_parser.rb} +8 -7
  34. data/lib/terraform/output_command.rb +3 -39
  35. data/lib/terraform/output_parser.rb +55 -0
  36. data/lib/terraform/parallelism_config.rb +9 -11
  37. data/lib/terraform/pathname_coercer.rb +40 -0
  38. data/lib/terraform/plan_command.rb +7 -41
  39. data/lib/terraform/prepare_input_file.rb +34 -0
  40. data/lib/terraform/{zero_seven_output.rb → prepare_output_file.rb} +11 -9
  41. data/lib/terraform/project_version.rb +19 -0
  42. data/lib/terraform/shell_out.rb +59 -0
  43. data/lib/terraform/show_command.rb +7 -16
  44. data/lib/terraform/simple_coercer.rb +36 -0
  45. data/lib/terraform/{state_config.rb → simple_config.rb} +7 -6
  46. data/lib/terraform/{color_switch.rb → unsupported_version.rb} +6 -8
  47. data/lib/terraform/validate_command.rb +3 -10
  48. data/lib/terraform/variable_files_coercer.rb +40 -0
  49. data/lib/terraform/variable_files_config.rb +9 -10
  50. data/lib/terraform/variables_coercer.rb +49 -0
  51. data/lib/terraform/variables_config.rb +9 -24
  52. data/lib/terraform/version.rb +55 -1
  53. data/lib/terraform/version_command.rb +3 -10
  54. metadata +58 -9
  55. metadata.gz.sig +0 -0
  56. data/lib/terraform/command_executor.rb +0 -41
@@ -0,0 +1,34 @@
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'
18
+
19
+ module Terraform
20
+ # A preparation for a command with an input file
21
+ class PrepareInputFile
22
+ def execute
23
+ file.open {}
24
+ end
25
+
26
+ private
27
+
28
+ attr_accessor :file
29
+
30
+ def initialize(file:)
31
+ self.file = file
32
+ end
33
+ end
34
+ end
@@ -14,21 +14,23 @@
14
14
  # See the License for the specific language governing permissions and
15
15
  # limitations under the License.
16
16
 
17
- require 'json'
17
+ require 'fileutils'
18
18
 
19
19
  module Terraform
20
- # Behaviour for OutputCommand with Terraform 0.7
21
- module ZeroSevenOutput
22
- def options
23
- "-json=true -state=#{state}"
20
+ # A preparation for a command with an output file
21
+ class PrepareOutputFile
22
+ def execute
23
+ parent_directory.mkpath
24
+ file.open('a') {}
24
25
  end
25
26
 
26
27
  private
27
28
 
28
- def processed_output(raw_output:)
29
- return raw_output if return_raw
30
- JSON.parse(raw_output).fetch('value')
31
- .tap { |value| return list ? Array(value) : value }
29
+ attr_accessor :file, :parent_directory
30
+
31
+ def initialize(file:)
32
+ self.file = file
33
+ self.parent_directory = file.parent
32
34
  end
33
35
  end
34
36
  end
@@ -0,0 +1,19 @@
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
+ PROJECT_VERSION = '0.6.0'
19
+ end
@@ -0,0 +1,59 @@
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'
18
+ require 'mixlib/shellout'
19
+
20
+ module Terraform
21
+ # Facilitates execution of commands in a shell
22
+ class ShellOut
23
+ def execute(&block)
24
+ block ||= proc {}
25
+
26
+ command.prepare
27
+ run_command
28
+ block.call shell_out.stdout
29
+ end
30
+
31
+ private
32
+
33
+ attr_accessor :command, :shell_out
34
+
35
+ def initialize(
36
+ cli:, command:, logger:, timeout: ::Mixlib::ShellOut::DEFAULT_READ_TIMEOUT
37
+ )
38
+ self.command = command
39
+ self.shell_out = ::Mixlib::ShellOut.new "#{cli} #{command}",
40
+ live_stream: logger,
41
+ timeout: timeout
42
+ end
43
+
44
+ def instance_failures
45
+ [
46
+ ::Errno::EACCES, ::Errno::ENOENT, ::Mixlib::ShellOut::CommandTimeout,
47
+ ::Mixlib::ShellOut::ShellCommandFailed
48
+ ]
49
+ end
50
+
51
+ def run_command
52
+ shell_out.run_command
53
+ shell_out.error!
54
+ rescue *instance_failures => error
55
+ raise ::Kitchen::StandardError,
56
+ %(`#{shell_out.command}` failed: "#{error.message}")
57
+ end
58
+ end
59
+ end
@@ -14,26 +14,17 @@
14
14
  # See the License for the specific language governing permissions and
15
15
  # limitations under the License.
16
16
 
17
- require_relative 'command'
18
- require_relative 'color_switch'
17
+ require 'terraform/command'
18
+ require 'terraform/prepare_input_file'
19
19
 
20
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
-
21
+ # A command to show a state
22
+ class ShowCommand < ::Terraform::Command
33
23
  private
34
24
 
35
- def initialize_attributes(color:)
36
- self.color = color
25
+ def initialize(target: '')
26
+ super
27
+ preparations.push ::Terraform::PrepareInputFile.new file: target
37
28
  end
38
29
  end
39
30
  end
@@ -0,0 +1,36 @@
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
+ # Performs simple coercions
19
+ class SimpleCoercer
20
+ def coerce(attr:, value:)
21
+ configurable[attr] = method.call value
22
+ rescue ArgumentError, TypeError
23
+ configurable.config_error attr: attr, expected: expected
24
+ end
25
+
26
+ private
27
+
28
+ attr_accessor :configurable, :expected, :method
29
+
30
+ def initialize(configurable:, expected:, method:)
31
+ self.configurable = configurable
32
+ self.expected = expected
33
+ self.method = method
34
+ end
35
+ end
36
+ end
@@ -15,13 +15,14 @@
15
15
  # limitations under the License.
16
16
 
17
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'
18
+ # Behaviour for simple config options
19
+ module SimpleConfig
20
+ def configure_required(attr:, coercer_class:, default_value:)
21
+ required_config attr do |_, value, configurable|
22
+ coercer_class
23
+ .new(configurable: configurable).coerce attr: attr, value: value
23
24
  end
24
- configurable_class.expand_path_for :state
25
+ default_config attr, default_value
25
26
  end
26
27
  end
27
28
  end
@@ -14,15 +14,13 @@
14
14
  # See the License for the specific language governing permissions and
15
15
  # limitations under the License.
16
16
 
17
+ require 'delegate'
18
+
17
19
  module Terraform
18
- # Shared color switch for Terraform
19
- module ColorSwitch
20
- def color_switch
21
- color ? '' : '-no-color'
20
+ # An unsupported version of Terraform
21
+ class UnsupportedVersion < ::SimpleDelegator
22
+ def if_not_supported
23
+ yield
22
24
  end
23
-
24
- private
25
-
26
- attr_accessor :color
27
25
  end
28
26
  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_relative 'command'
17
+ require 'terraform/command'
18
18
 
19
19
  module Terraform
20
- # Command to valdidate configuration files
21
- class ValidateCommand < Command
22
- def name
23
- 'validate'
24
- end
25
-
26
- def options
27
- ''
28
- end
20
+ # A command to valdidate configuration files
21
+ class ValidateCommand < ::Terraform::Command
29
22
  end
30
23
  end
@@ -0,0 +1,40 @@
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 'terraform/pathname_coercer'
18
+
19
+ module Terraform
20
+ # A coercer for the [:variable_files] config option
21
+ class VariableFilesCoercer
22
+ def coerce(attr:, value:)
23
+ configurable[attr] = Array(value).map do |pathname|
24
+ coercer.coerce attr: attr, value: pathname
25
+
26
+ configurable[attr]
27
+ end
28
+ end
29
+
30
+ private
31
+
32
+ attr_accessor :coercer, :configurable
33
+
34
+ def initialize(configurable:)
35
+ self.coercer =
36
+ ::Terraform::PathnameCoercer.new configurable: configurable
37
+ self.configurable = configurable
38
+ end
39
+ end
40
+ end
@@ -14,20 +14,19 @@
14
14
  # See the License for the specific language governing permissions and
15
15
  # limitations under the License.
16
16
 
17
+ require_relative 'simple_config'
18
+ require_relative 'variable_files_coercer'
19
+
17
20
  module Terraform
18
21
  # Behaviour for the [:variable_files] config option
19
22
  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
23
+ include ::Terraform::SimpleConfig
28
24
 
29
- def coerce_variable_files(value:)
30
- config[:variable_files] = Array value
25
+ def self.extended(configurable_class)
26
+ configurable_class
27
+ .configure_required attr: :variable_files,
28
+ coercer_class: ::Terraform::VariableFilesCoercer,
29
+ default_value: []
31
30
  end
32
31
  end
33
32
  end
@@ -0,0 +1,49 @@
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 'deprecated_variables_coercer'
18
+ require_relative 'simple_coercer'
19
+
20
+ module Terraform
21
+ # A coercer for values of [:variables]
22
+ class VariablesCoercer
23
+ def coerce(attr:, value:)
24
+ coercer(value: value).coerce attr: attr, value: value
25
+ end
26
+
27
+ private
28
+
29
+ attr_accessor :configurable
30
+
31
+ def coercer(value:)
32
+ [::Array, ::String]
33
+ .find proc { return simple_coercer }, &value.method(:is_a?)
34
+
35
+ ::Terraform::DeprecatedVariablesCoercer.new configurable: configurable
36
+ end
37
+
38
+ def simple_coercer
39
+ ::Terraform::SimpleCoercer
40
+ .new configurable: configurable,
41
+ expected: 'a mapping of Terraform variable assignments',
42
+ method: method(:Hash)
43
+ end
44
+
45
+ def initialize(configurable:)
46
+ self.configurable = configurable
47
+ end
48
+ end
49
+ end
@@ -14,34 +14,19 @@
14
14
  # See the License for the specific language governing permissions and
15
15
  # limitations under the License.
16
16
 
17
+ require_relative 'simple_config'
18
+ require_relative 'variables_coercer'
19
+
17
20
  module Terraform
18
21
  # Behaviour for the [:variables] config option
19
22
  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
23
+ include ::Terraform::SimpleConfig
40
24
 
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 '=' }]
25
+ def self.extended(configurable_class)
26
+ configurable_class
27
+ .configure_required attr: :variables,
28
+ coercer_class: ::Terraform::VariablesCoercer,
29
+ default_value: {}
45
30
  end
46
31
  end
47
32
  end