Class: Puppet::Plugins::DataProviders::PathBasedDataProvider Abstract

Inherits:
Object
  • Object
show all
Includes:
DataProvider
Defined in:
lib/puppet/plugins/data_providers/data_provider.rb

Overview

This class is abstract.

A data provider that is initialized with a set of paths. When performing lookup, each path is search in the order they appear. If a value is found in more than one location it will be merged according to a given (optional) merge strategy.

Since:

  • Puppet 4.0.0

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from DataProvider

#data_key, #lookup, #post_process

Constructor Details

#initialize(name, paths, parent_data_provider = nil) ⇒ PathBasedDataProvider

Returns a new instance of PathBasedDataProvider.

Parameters:

  • name (String)

    The name of the data provider

  • paths (Array<ResolvedPath>)

    Paths used by this provider

  • parent_data_provider (DataProvider) (defaults to: nil)

    The data provider that is the container of this data provider

Since:

  • Puppet 4.0.0



186
187
188
189
190
# File 'lib/puppet/plugins/data_providers/data_provider.rb', line 186

def initialize(name, paths, parent_data_provider = nil)
  @name = name
  @paths = paths
  @parent_data_provider = parent_data_provider
end

Instance Attribute Details

#nameObject (readonly)

Since:

  • Puppet 4.0.0



179
180
181
# File 'lib/puppet/plugins/data_providers/data_provider.rb', line 179

def name
  @name
end

Instance Method Details

#load_data(path, data_key, lookup_invocation) ⇒ Hash

Gets the data from the compiler, or initializes it by calling #initialize_data if not present in the compiler. This means, that data is initialized once per compilation, and the data is cached for as long as the compiler lives (which is for one catalog production). This makes it possible to return data that is tailored for the request.

If data is obtained using the #initialize_data method it will be sent to the #validate_data for validation

Parameters:

  • path (String)

    The path to the data to be loaded (passed to #initialize_data)

  • data_key (String)

    The data key such as the name of a module or the constant ‘environment’

  • lookup_invocation (Puppet::Pops::Lookup::Invocation)

    The current lookup invocation

  • merge (String|Hash<String,Object>|nil)

    Merge strategy or hash with strategy and options

Returns:

  • (Hash)

    The data hash for the given key

Since:

  • Puppet 4.0.0



206
207
208
209
210
# File 'lib/puppet/plugins/data_providers/data_provider.rb', line 206

def load_data(path, data_key, lookup_invocation)
  compiler = lookup_invocation.scope.compiler
  adapter = Puppet::DataProviders::DataAdapter.get(compiler) || Puppet::DataProviders::DataAdapter.adapt(compiler)
  adapter.data[path] ||= validate_data(initialize_data(path, lookup_invocation), data_key)
end

#unchecked_lookup(key, lookup_invocation, merge) ⇒ Object

Performs a lookup by searching all given paths for the given key. A merge will be performed if the value is found in more than one location and merge is not nil.

Parameters:

Since:

  • Puppet 4.0.0



225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
# File 'lib/puppet/plugins/data_providers/data_provider.rb', line 225

def unchecked_lookup(key, lookup_invocation, merge)
  module_name = @parent_data_provider.nil? ? nil : @parent_data_provider.data_key(key, lookup_invocation)
  lookup_invocation.with(:data_provider, self) do
    merge_strategy = Puppet::Pops::MergeStrategy.strategy(merge)
    lookup_invocation.with(:merge, merge_strategy) do
      merged_result = merge_strategy.merge_lookup(@paths) do |path|
        lookup_invocation.with(:path, path) do
          if path.exists?
            hash = load_data(path.path, module_name, lookup_invocation)
            value = hash[key]
            if value || hash.include?(key)
              lookup_invocation.report_found(key, post_process(value, lookup_invocation))
            else
              lookup_invocation.report_not_found(key)
              throw :no_such_key
            end
          else
            lookup_invocation.report_path_not_found
            throw :no_such_key
          end
        end
      end
      lookup_invocation.report_result(merged_result)
    end
  end
end

#validate_data(data, module_name) ⇒ Object

Since:

  • Puppet 4.0.0



213
214
215
# File 'lib/puppet/plugins/data_providers/data_provider.rb', line 213

def validate_data(data, module_name)
  @parent_data_provider.nil? ? data : @parent_data_provider.validate_data(data, module_name)
end