Module: Kitchen::Configurable

Included in:
Driver::Base, Provisioner::Base
Defined in:
lib/kitchen/configurable.rb

Overview

A mixin for providing configuration-related behavior such as default config (static, computed, inherited), required config, local path expansion, etc.

Author:

Defined Under Namespace

Modules: ClassMethods

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#instanceKitchen::Instance (readonly)

Returns the associated instance.

Returns:



37
38
39
# File 'lib/kitchen/configurable.rb', line 37

def instance
  @instance
end

Class Method Details

.included(base) ⇒ Object



32
33
34
# File 'lib/kitchen/configurable.rb', line 32

def self.included(base)
  base.extend(ClassMethods)
end

Instance Method Details

#[](attr) ⇒ Object

Provides hash-like access to configuration keys.

Parameters:

  • attr (Object)

    configuration key

Returns:

  • (Object)

    value at configuration key



64
65
66
# File 'lib/kitchen/configurable.rb', line 64

def [](attr)
  config[attr]
end

#calculate_path(path, opts = {}) ⇒ String

Find an appropriate path to a file or directory, based on graceful fallback rules or returns nil if path cannot be determined.

Given an instance with suite named "server", a test_base_path of "/a/b", and a path segement of "roles" then following will be tried in order (first match that exists wins):

  1. /a/b/server/roles
  2. /a/b/roles
  3. $PWD/roles

Parameters:

  • path (String)

    the base path segment to search for

  • opts (Hash) (defaults to: {})

    options

Options Hash (opts):

  • :type (Symbol)

    either :file or :directory (default)

  • :base_path (Symbol)

    a custom base path to search under, default uses value from config[:test_base_path]

Returns:

  • (String)

    path to the existing file or directory, or nil if file or directory was not found

Raises:

  • (UserError)

    if config[:test_base_path] is used and is not set



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

def calculate_path(path, opts = {})
  type = opts.fetch(:type, :directory)
  base = opts.fetch(:base_path) do
    config.fetch(:test_base_path) do |key|
      raise UserError, "#{key} is not found in #{self}"
    end
  end

  [
    File.join(base, instance.suite.name, path),
    File.join(base, path),
    File.join(Dir.pwd, path)
  ].find do |candidate|
    type == :directory ? File.directory?(candidate) : File.file?(candidate)
  end
end

#config_keysArray

Returns an array of configuration keys.

Returns:

  • (Array)

    array of configuration keys



107
108
109
# File 'lib/kitchen/configurable.rb', line 107

def config_keys
  config.keys
end

#diagnoseHash

Returns a Hash of configuration and other useful diagnostic information.

Returns:

  • (Hash)

    a diagnostic hash



114
115
116
117
118
# File 'lib/kitchen/configurable.rb', line 114

def diagnose
  result = Hash.new
  config_keys.sort.each { |k| result[k] = config[k] }
  result
end

#finalize_config!(instance) ⇒ self

A lifecycle method that should be invoked when the object is about ready to be used. A reference to an Instance is required as configuration dependant data may be access through an Instance. This also acts as a hook point where the object may wish to perform other last minute checks, validations, or configuration expansions.

Parameters:

  • instance (Instance)

    an associated instance

Returns:

  • (self)

    itself, for use in chaining

Raises:



48
49
50
51
52
53
54
55
56
57
58
# File 'lib/kitchen/configurable.rb', line 48

def finalize_config!(instance)
  if instance.nil?
    raise ClientError, "Instance must be provided to #{self}"
  end

  @instance = instance
  expand_paths!
  validate_config!

  self
end