module Puppet::Pops::Evaluator::Runtime3ResourceSupport

@api private

Constants

CLASS_STRING

Public Class Methods

create_resources(file, line, scope, virtual, exported, type_name, resource_titles, evaluated_parameters) click to toggle source
   # File lib/puppet/pops/evaluator/runtime3_resource_support.rb
 9 def self.create_resources(file, line, scope, virtual, exported, type_name, resource_titles, evaluated_parameters)
10 
11   env = scope.environment
12   #    loader = Adapters::LoaderAdapter.loader_for_model_object(o, scope)
13 
14   if type_name.is_a?(String) && type_name.casecmp(CLASS_STRING) == 0
15     # Resolve a 'class' and its titles
16     resource_titles = resource_titles.collect do |a_title|
17       hostclass = env.known_resource_types.find_hostclass(a_title)
18       hostclass ?  hostclass.name : a_title
19     end
20     # resolved type is just the string CLASS
21     resolved_type = CLASS_STRING
22   else
23     # resolve a resource type - pcore based, ruby impl or user defined
24     resolved_type = find_resource_type(scope, type_name)
25   end
26 
27   # TODO: Unknown resource causes creation of Resource to fail with ArgumentError, should give
28   # a proper Issue. Now the result is "Error while evaluating a Resource Statement" with the message
29   # from the raised exception. (It may be good enough).
30   unless resolved_type
31     # TODO: do this the right way
32     raise ArgumentError, _("Unknown resource type: '%{type}'") % { type: type_name }
33   end
34 
35   # Build a resource for each title - use the resolved *type* as opposed to a reference
36   # as this makes the created resource retain the type instance.
37   #
38   resource_titles.map do |resource_title|
39       resource = Puppet::Parser::Resource.new(
40         resolved_type, resource_title,
41         :parameters => evaluated_parameters,
42         :file => file,
43         :line => line,
44         :kind => Puppet::Resource.to_kind(resolved_type),
45         :exported => exported,
46         :virtual => virtual,
47         # WTF is this? Which source is this? The file? The name of the context ?
48         :source => scope.source,
49         :scope => scope,
50         :strict => true
51       )
52 
53       # If this resource type supports inheritance (e.g. 'class') the parent chain must be walked
54       # This impl delegates to the resource type to figure out what is needed.
55       #
56       if resource.resource_type.is_a? Puppet::Resource::Type
57         resource.resource_type.instantiate_resource(scope, resource)
58       end
59 
60       scope.compiler.add_resource(scope, resource)
61 
62       # Classes are evaluated immediately
63       scope.compiler.evaluate_classes([resource_title], scope, false) if resolved_type == CLASS_STRING
64 
65       # Turn the resource into a PTypeType (a reference to a resource type)
66       # weed out nil's
67       resource_to_ptype(resource)
68   end
69 end
find_hostclass(scope, class_name) click to toggle source
   # File lib/puppet/pops/evaluator/runtime3_resource_support.rb
90 def self.find_hostclass(scope, class_name)
91   scope.environment.known_resource_types.find_hostclass(class_name)
92 end
find_main_class(scope) click to toggle source
   # File lib/puppet/pops/evaluator/runtime3_resource_support.rb
85 def self.find_main_class(scope)
86   # Find the main class (known as ''), it does not have to be in the catalog
87   scope.environment.known_resource_types.find_hostclass('')
88 end
find_resource_type(scope, type_name) click to toggle source
   # File lib/puppet/pops/evaluator/runtime3_resource_support.rb
71 def self.find_resource_type(scope, type_name)
72   find_builtin_resource_type(scope, type_name) || find_defined_resource_type(scope, type_name)
73 end
find_resource_type_or_class(scope, name) click to toggle source
   # File lib/puppet/pops/evaluator/runtime3_resource_support.rb
75 def self.find_resource_type_or_class(scope, name)
76   find_builtin_resource_type(scope, name) || find_defined_resource_type(scope, name) || find_hostclass(scope, name)
77 end
resource_to_ptype(resource) click to toggle source
   # File lib/puppet/pops/evaluator/runtime3_resource_support.rb
79 def self.resource_to_ptype(resource)
80   nil if resource.nil?
81   # inference returns the meta type since the 3x Resource is an alternate way to describe a type
82   Puppet::Pops::Types::TypeCalculator.singleton().infer(resource).type
83 end

Private Class Methods

find_builtin_resource_type(scope, type_name) click to toggle source
    # File lib/puppet/pops/evaluator/runtime3_resource_support.rb
 94 def self.find_builtin_resource_type(scope, type_name)
 95   if type_name.include?(':')
 96     # Skip the search for built in types as they are always in global namespace
 97     # (At least for now).
 98     return nil
 99   end
100 
101   loader = scope.compiler.loaders.private_environment_loader
102   loaded = loader.load(:resource_type_pp, type_name)
103   if loaded
104     return loaded
105   end
106 
107   # horrible - should be loaded by a "last loader" in 4.x loaders instead.
108   Puppet::Type.type(type_name)
109 end
find_defined_resource_type(scope, type_name) click to toggle source
    # File lib/puppet/pops/evaluator/runtime3_resource_support.rb
112 def self.find_defined_resource_type(scope, type_name)
113   krt = scope.environment.known_resource_types
114   krt.find_definition(type_name)
115 end