class R10K::Source::Hash

This class implements an environment source based on recieving a hash of environments

@since 3.4.0

DESCRIPTION

This class implements environments defined by a hash having the following schema:

---
type: object
additionalProperties:
  type: object
  properties:
    type:
      type: string
    basedir:
      type: string
    modules:
      type: object
      additionalProperties:
        type: object
    moduledir:
      type: string
  additionalProperties:
    type: string

The top-level keys in the hash are environment names. Keys in individual environments should be the same as those which would be given to define a single source in r10k.yaml. Additionally, the “modules” key (and moduledir) can be used to designate module content for the environment, independent of the base source parameters.

Example:

---
production:
  type: git
  remote: 'https://github.com/reidmv/control-repo.git'
  ref: '1.0.0'
  modules:
    geoffwilliams-r_profile: '1.1.0'
    geoffwilliams-r_role: '2.0.0'

development:
  type: git
  remote: 'https://github.com/reidmv/control-repo.git'
  ref: 'master'
  modules:
    geoffwilliams-r_profile: '1.1.0'
    geoffwilliams-r_role: '2.0.0'

USAGE

The following is an example implementation class showing how to use the R10K::Source::Hash abstract base class. Assume an r10k.yaml file such as:

---
sources:
  proof-of-concept:
    type: demo
    basedir: '/etc/puppetlabs/code/environments'

Class implementation:

class R10K::Source::Demo < R10K::Source::Hash
  R10K::Source.register(:demo, self)

  def initialize(name, basedir, options = {})
    # This is just a demo class, so we hard-code an example :environments
    # hash here. In a real class, we might do something here such as
    # perform an API call to retrieve an :environments hash.
    options[:environments] = {
      'production' => {
        'remote'  => 'https://git.example.com/puppet/control-repo.git',
        'ref'     => 'release-141',
        'modules' => {
          'puppetlabs-stdlib' => '6.1.0',
          'puppetlabs-ntp' => '8.1.0',
          'example-myapp1' => {
            'git' => 'https://git.example.com/puppet/example-myapp1.git',
            'ref' => 'v1.3.0',
          },
        },
      },
      'development' => {
        'remote'  => 'https://git.example.com/puppet/control-repo.git',
        'ref'     => 'master',
        'modules' => {
          'puppetlabs-stdlib' => '6.1.0',
          'puppetlabs-ntp' => '8.1.0',
          'example-myapp1' => {
            'git' => 'https://git.example.com/puppet/example-myapp1.git',
            'ref' => 'v1.3.1',
          },
        },
      },
    }

    # All we need to do is supply options with the :environments hash.
    # The R10K::Source::Hash parent class takes care of the rest.
    super(name, basedir, options)
  end
end

Example output:

[root@master:~] % r10k deploy environment production -pv
INFO     -> Using Puppetfile '/etc/puppetlabs/code/environments/production/Puppetfile'
INFO     -> Using Puppetfile '/etc/puppetlabs/code/environments/development/Puppetfile'
INFO     -> Deploying environment /etc/puppetlabs/code/environments/production
INFO     -> Environment production is now at 74ea2e05bba796918e4ff1803018c526337ef5f3
INFO     -> Deploying Environment content /etc/puppetlabs/code/environments/production/modules/stdlib
INFO     -> Deploying Environment content /etc/puppetlabs/code/environments/production/modules/ntp
INFO     -> Deploying Environment content /etc/puppetlabs/code/environments/production/modules/myapp1
INFO     -> Deploying Puppetfile content /etc/puppetlabs/code/environments/production/modules/ruby_task_helper
INFO     -> Deploying Puppetfile content /etc/puppetlabs/code/environments/production/modules/bolt_shim
INFO     -> Deploying Puppetfile content /etc/puppetlabs/code/environments/production/modules/apply_helpers

Public Class Methods

new(name, basedir, options = {}) click to toggle source

@param name [String] The identifier for this source. @param basedir [String] The base directory where the generated environments will be created. @param options [Hash] An additional set of options for this source. The

semantics of this hash may depend on the source implementation.

@option options [Boolean, String] :prefix If a String this becomes the prefix.

If true, will use the source name as the prefix. All sources should respect this option.
Defaults to false for no environment prefix.

@option options [Hash] :environments The hash definition of environments

Calls superclass method R10K::Source::Base::new
# File lib/r10k/source/hash.rb, line 140
def initialize(name, basedir, options = {})
  super(name, basedir, options)
end
valid_environments_hash?(hash) click to toggle source

@param hash [Hash] A hash to validate. @return [Boolean] False if the hash is obviously invalid. A true return

means _maybe_ it's valid.
# File lib/r10k/source/hash.rb, line 126
def self.valid_environments_hash?(hash)
  # TODO: more robust schema valiation
  hash.is_a?(Hash)
end

Public Instance Methods

desired_contents() click to toggle source

List all environments that should exist in the basedir for this source @note This is required by {R10K::Util::Basedir} @return [Array<String>]

# File lib/r10k/source/hash.rb, line 178
def desired_contents
  environments.map {|env| env.dirname }
end
environments() click to toggle source
# File lib/r10k/source/hash.rb, line 169
def environments
  @environments ||= environments_hash.map do |name, hash|
    R10K::Environment.from_hash(name, hash.merge({overrides: @options[:overrides]}))
  end
end
environments_hash() click to toggle source

Return the sanitized environments hash for this source. The environments hash should contain objects formatted for use with R10K::Environment#from_hash. If the hash does not exist it will be built based on @options.

# File lib/r10k/source/hash.rb, line 165
def environments_hash
  @environments_hash ||= set_environments_hash(@options.fetch(:environments, {}))
end
set_environments_hash(hash) click to toggle source

Set the environment hash for the source. The environment hash is what the source uses to generate enviroments. @param hash [Hash] The hash to sanitize and use as the source's environments.

Should be formatted for use with R10K::Environment#from_hash.
# File lib/r10k/source/hash.rb, line 148
def set_environments_hash(hash)
  @environments_hash = hash.reduce({}) do |memo,(name,opts)|
    R10K::Util::SymbolizeKeys.symbolize_keys!(opts)
    memo.merge({ 
      name => opts.merge({
        basedir: @basedir,
        dirname: R10K::Environment::Name.new(name, {prefix: @prefix,
                                                    source: @name,
                                                    strip_component: @strip_component}).dirname
      })
    })
  end
end