Class: Kitchen::Terraform::Provisioner::Converge

Inherits:
Object
  • Object
show all
Defined in:
lib/kitchen/terraform/provisioner/converge.rb

Overview

A Test Kitchen instance is converged through the following steps.

Selecting the Test Terraform Workspace

The workspace is selected by running a command like the following example:

<span class='rubyid_terraform identifier id'>terraform</span> <span class='rubyid_workspace identifier id'>workspace</span> <span class='rubyid_select identifier id'>select</span> <span class='lt op'><</span><span class='rubyid_name identifier id'>name</span><span class='gt op'>></span>

Updating the Terraform Dependency Modules

The dependency modules are updated by running a command like the following example:

<span class='rubyid_terraform identifier id'>terraform</span> <span class='rubyid_get identifier id'>get</span> <span class='minus op'>-</span><span class='rubyid_update identifier id'>update</span> <span class='lt op'><</span><span class='rubyid_directory identifier id'>directory</span><span class='gt op'>></span>

Validating the Terraform Root Module
Terraform >= 0.15.0

The root module is validated by running a command like the following example:

<span class='rubyid_terraform identifier id'>terraform</span> <span class='rubyid_validate identifier id'>validate</span> \
  <span class='lbrack token'>[</span><span class='minus op'>-</span><span class='rubyid_no identifier id'>no</span><span class='minus op'>-</span><span class='rubyid_color identifier id'>color</span><span class='rbrack token'>]</span> \
  <span class='lt op'><</span><span class='rubyid_directory identifier id'>directory</span><span class='gt op'>></span>

Terraform < 0.15.0

The root module is validated by running a command like the following example:

<span class='rubyid_terraform identifier id'>terraform</span> <span class='rubyid_validate identifier id'>validate</span> \
  <span class='lbrack token'>[</span><span class='minus op'>-</span><span class='rubyid_no identifier id'>no</span><span class='minus op'>-</span><span class='rubyid_color identifier id'>color</span><span class='rbrack token'>]</span> \
  <span class='lbrack token'>[</span><span class='minus op'>-</span><span class='rubyid_var identifier id'>var</span><span class='assign token'>=</span><span class='lt op'><</span><span class='rubyid_variables identifier id'>variables</span><span class='dot token'>.</span><span class='rubyid_first identifier id'>first</span><span class='gt op'>></span><span class='dot3 op'>...</span><span class='rbrack token'>]</span> \
  <span class='lbrack token'>[</span><span class='minus op'>-</span><span class='rubyid_var identifier id'>var</span><span class='minus op'>-</span><span class='rubyid_file identifier id'>file</span><span class='assign token'>=</span><span class='lt op'><</span><span class='rubyid_variable_files identifier id'>variable_files</span><span class='dot token'>.</span><span class='rubyid_first identifier id'>first</span><span class='gt op'>></span><span class='dot3 op'>...</span><span class='rbrack token'>]</span> \
  <span class='lt op'><</span><span class='rubyid_directory identifier id'>directory</span><span class='gt op'>></span>

Applying the Terraform State Changes

The state changes are applied by running a command like the following example:

<span class='rubyid_terraform identifier id'>terraform</span> <span class='rubyid_apply identifier id'>apply</span>\
  <span class='minus op'>-</span><span class='rubyid_lock identifier id'>lock</span><span class='assign token'>=</span><span class='lt op'><</span><span class='rubyid_lock identifier id'>lock</span><span class='gt op'>></span> \
  <span class='minus op'>-</span><span class='rubyid_lock identifier id'>lock</span><span class='minus op'>-</span><span class='rubyid_timeout identifier id'>timeout</span><span class='assign token'>=</span><span class='lt op'><</span><span class='rubyid_lock_timeout identifier id'>lock_timeout</span><span class='gt op'>></span><span class='rubyid_s identifier id'>s</span> \
  <span class='minus op'>-</span><span class='rubyid_input identifier id'>input</span><span class='assign token'>=</span><span class='rubyid_false false kw'>false</span> \
  <span class='minus op'>-</span><span class='rubyid_auto identifier id'>auto</span><span class='minus op'>-</span><span class='rubyid_approve identifier id'>approve</span><span class='assign token'>=</span><span class='rubyid_true true kw'>true</span> \
  <span class='lbrack token'>[</span><span class='minus op'>-</span><span class='rubyid_no identifier id'>no</span><span class='minus op'>-</span><span class='rubyid_color identifier id'>color</span><span class='rbrack token'>]</span> \
  <span class='minus op'>-</span><span class='rubyid_parallelism identifier id'>parallelism</span><span class='assign token'>=</span><span class='lt op'><</span><span class='rubyid_parallelism identifier id'>parallelism</span><span class='gt op'>></span> \
  <span class='minus op'>-</span><span class='rubyid_refresh identifier id'>refresh</span><span class='assign token'>=</span><span class='rubyid_true true kw'>true</span> \
  <span class='lbrack token'>[</span><span class='minus op'>-</span><span class='rubyid_var identifier id'>var</span><span class='assign token'>=</span><span class='lt op'><</span><span class='rubyid_variables identifier id'>variables</span><span class='dot token'>.</span><span class='rubyid_first identifier id'>first</span><span class='gt op'>></span><span class='dot3 op'>...</span><span class='rbrack token'>]</span> \
  <span class='lbrack token'>[</span><span class='minus op'>-</span><span class='rubyid_var identifier id'>var</span><span class='minus op'>-</span><span class='rubyid_file identifier id'>file</span><span class='assign token'>=</span><span class='lt op'><</span><span class='rubyid_variable_files identifier id'>variable_files</span><span class='dot token'>.</span><span class='rubyid_first identifier id'>first</span><span class='gt op'>></span><span class='dot3 op'>...</span><span class='rbrack token'>]</span> \
  <span class='lt op'><</span><span class='rubyid_directory identifier id'>directory</span><span class='gt op'>></span>

Retrieving the Terraform Output

The outputs are retrieved by running a command like the following example:

<span class='rubyid_terraform identifier id'>terraform</span> <span class='rubyid_output identifier id'>output</span> <span class='minus op'>-</span><span class='rubyid_json identifier id'>json</span>

Instance Method Summary collapse

Constructor Details

#initialize(config:, connection:, debug_connection:, logger:, version_requirement:, workspace_name:) ⇒ Kitchen::Terraform::Driver::Converge

#initialize prepares a new instance of the class.

Parameters:

  • config (Hash)

    the configuration of the driver.

  • connection (Kitchen::Terraform::Transport::Connection)

    a Terraform connection.

  • debug_connection (Kitchen::Terraform::Transport::Connection)

    a Terraform connection that logs at the debug level.

  • logger (Kitchen::Logger)

    a logger for logging messages.

  • version_requirement (Gem::VersionRequirement)

    the required version of the Terraform client.

  • workspace_name (String)

    the name of the Terraform workspace to select or to create.



87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# File 'lib/kitchen/terraform/provisioner/converge.rb', line 87

def initialize(config:, connection:, debug_connection:, logger:, version_requirement:, workspace_name:)
  self.complete_config = config.to_hash.merge workspace_name: workspace_name
  self.client_version = ::Gem::Version.new "0.0.0"
  self.connection = connection
  self.debug_connection = debug_connection
  self.logger = logger
  self.workspace_name = workspace_name
  initialize_commands
  initialize_outputs_handlers
  self.variables = complete_config.fetch :variables
  self.variables_manager = ::Kitchen::Terraform::VariablesManager.new
  self.verify_version = ::Kitchen::Terraform::VerifyVersion.new(
    config: complete_config,
    logger: logger,
    version_requirement: version_requirement,
  )
end

Instance Method Details

#call(state:) ⇒ self

#call executes the action.

Parameters:

  • state (Hash)

    the Kitchen instance state.

Returns:

  • (self)

Raises:

  • (Kitchen::TransientFailure)

    if a command fails.



68
69
70
71
72
73
74
75
# File 'lib/kitchen/terraform/provisioner/converge.rb', line 68

def call(state:)
  read_client_version
  verify_version.call version: client_version
  execute_workflow
  save_variables_and_outputs state: state

  self
end