puppetlabs/puppet · error · ArgumentError
Cannot use a Resource[%{type_name}] where a Resource['class'
Error message
Cannot use a Resource[%{type_name}] where a Resource['class', name] is expected What it means
Raised by Scope#assert_class_and_title when a resource reference IS typed but its type is not 'Class' (case-insensitive /^[Cc]lass$/). include/contain operate on classes only; passing e.g. File['/tmp/x'] means the caller asked to include a non-class resource, which the class-name normalization API rejects with the offending type name in the message.
Source
Thrown at lib/puppet/parser/scope.rb:1128
# to aid the user find the problem. The problem is otherwise reported against the source location that
# invoked the function that ultimately called this method.
#
# @return [Object] the result of the called function
# @raise ArgumentError if the function does not exist
def call_function(func_name, args, &block)
Puppet::Pops::Parser::EvaluatingParser.new.evaluator.external_call_function(func_name, args, self, &block)
end
private
def assert_class_and_title(type_name, title)
if type_name.nil? || type_name == ''
# TRANSLATORS "Resource" is a class name and should not be translated
raise ArgumentError, _("Cannot use an unspecific Resource[] where a Resource['class', name] is expected")
end
unless type_name =~ /^[Cc]lass$/
# TRANSLATORS "Resource" is a class name and should not be translated
raise ArgumentError, _("Cannot use a Resource[%{type_name}] where a Resource['class', name] is expected") % { type_name: type_name }
end
if title.nil?
# TRANSLATORS "Resource" is a class name and should not be translated
raise ArgumentError, _("Cannot use an unspecific Resource['class'] where a Resource['class', name] is expected")
end
end
def extend_with_functions_module
root = Puppet.lookup(:root_environment)
extend Puppet::Parser::Functions.environment_module(root)
extend Puppet::Parser::Functions.environment_module(environment) if environment != root
end
end
View on GitHub (pinned to e227c27540)
Solutions
- Declare the resource instead of including it: `file { '/tmp/config': ensure => present }`.
- If you meant a relationship, use the chaining/require syntax: `Class['apache'] -> File['/tmp/x']` or `require => Class['apache']`.
- For classes, reference them as Class['name'] or a bare name: `include Class['apache']`.
Example fix
# before
include File['/etc/app.conf'] # Cannot use a Resource[file] where a Resource['class', name] is expected
# after
file { '/etc/app/conf.ini': ensure => file }
# or, if a dependency was intended:
include app
class { 'app': require => File['/etc/app/conf.ini'] } Defensive patterns
Strategy: validation
Validate before calling
# DSL: include only classes; declare resources directly
include apache # class
file { '/tmp/x': ensure => present } # resource declaration
# Ruby:
raise ArgumentError, 'not a class' unless type_name =~ /^[Cc]lass$/ Type guard
def class_ref?(r) r.is_a?(Puppet::Resource) && r.type.to_s =~ /^[Cc]lass$/ end
Prevention
- Use include/contain exclusively for classes; use resource declarations for resources.
- Express dependencies with chaining arrows or require/before, not include arguments.
- Lint for include followed by a bracketed non-Class resource reference.
When it happens
Trigger: `include File['/tmp/config']`, `contain Service['httpd']`, or `include Resource['file', '/tmp/x']` — any concrete non-class resource reference forwarded to include/contain/realize's class path. Also Ruby: scope.transform_and_assert_classnames([Puppet::Resource.new('file', '/tmp/x')]).
Common situations: Confusing `include` (classes) with resource declaration; code intended to express a dependency (`Class['x'] -> File['/y']`) accidentally used as an include argument; generic loops over mixed resource/class references.
Related errors
- Cannot use an unspecific Resource[] where a Resource['class'
- Cannot use an unspecific Resource['class'] where a Resource[
- Cannot use undef as a class name
- Cannot use empty string as a class name
- Cannot use an unspecific Class[] Type
AI-assisted analysis of puppetlabs/puppet@e227c27540 (2026-08-21).
Data as JSON: /api/errors/ae980d17dd828e5e.
Report an issue: GitHub.