{"record":{"id":"625abb6415204ea0","repo":"puppetlabs/puppet","slug":"could-not-find-class-name-for-node","errorCode":null,"errorMessage":"Could not find class %{name} for %{node}","messagePattern":"Could not find class %(.+?) for %(.+?)","errorType":"exception","errorClass":"Puppet::Error","httpStatus":null,"severity":"error","filePath":"lib/puppet/parser/compiler.rb","lineNumber":249,"sourceCode":"\n  # Evaluates each specified class in turn. If there are any classes that\n  # can't be found, an error is raised. This method really just creates resource objects\n  # that point back to the classes, and then the resources are themselves\n  # evaluated later in the process.\n  #\n  def evaluate_classes(classes, scope, lazy_evaluate = true)\n    raise Puppet::DevError, _(\"No source for scope passed to evaluate_classes\") unless scope.source\n\n    class_parameters = nil\n    # if we are a param class, save the classes hash\n    # and transform classes to be the keys\n    if classes.instance_of?(Hash)\n      class_parameters = classes\n      classes = classes.keys\n    end\n\n    hostclasses = classes.collect do |name|\n      environment.known_resource_types.find_hostclass(name) or raise Puppet::Error, _(\"Could not find class %{name} for %{node}\") % { name: name, node: node.name }\n    end\n\n    if class_parameters\n      resources = ensure_classes_with_parameters(scope, hostclasses, class_parameters)\n      unless lazy_evaluate\n        resources.each(&:evaluate)\n      end\n\n      resources\n    else\n      already_included, newly_included = ensure_classes_without_parameters(scope, hostclasses)\n      unless lazy_evaluate\n        newly_included.each(&:evaluate)\n      end\n\n      already_included + newly_included\n    end\n  end","sourceCodeStart":231,"sourceCodeEnd":267,"githubUrl":"https://github.com/puppetlabs/puppet/blob/e227c27540975c25aa22d533a52424a9d2fc886a/lib/puppet/parser/compiler.rb#L231-L267","documentation":"evaluate_classes resolves each requested class name through environment.known_resource_types.find_hostclass (the Puppet 3.x/autoloader path); a miss raises Puppet::Error 'Could not find class X for node'. Resolution happens before instantiation, so the class must already be loadable from the environment's modulepath.","triggerScenarios":"include profile::web when the profile module is not in the environment's modulepath; foo::bar expected in foo/manifests/bar.pp but the file is named differently; class name casing mismatch; wrong environment (module exists in production, node compiles in test).","commonSituations":"Module not installed or renamed; environment mismatch between agent and code; Puppet 4+ strict module layout violations; typos in class names; rspec-puppet tests without module fixture metadata.","solutions":["Check the module is present in the compiling environment's modulepath (puppet module list / puppet config print modulepath)","Verify autoloader layout: foo::bar must live in foo/manifests/bar.pp and define foo::bar","Fix class name spelling and casing to match the declared name exactly","Confirm the node resolves to the environment that actually contains the module"],"exampleFix":"// before: roles/manifests/web_server.pp defines roles::web_server\ninclude roles::webserver\n\n// after\ninclude roles::web_server","handlingStrategy":"try-catch","validationCode":"# API-level pre-check: does the environment resolve the class?\nenv.known_resource_types.find_hostclass(class_name) or raise LoadError, \"class #{class_name} not loadable\"","typeGuard":null,"tryCatchPattern":"begin\n  compiler.compile\nrescue Puppet::Error => e\n  if (m = e.message.match(/Could not find class (\\S+) for /))\n    missing << m[1]\n  end\n  raise\nend","preventionTips":["Assert required modules exist in the environment before compiling (puppet module list)","Follow the autoloader layout strictly: <mod>/manifests/<name>.pp defines <mod>::<name>","Run rspec-puppet compile tests for every profile/role so missing classes fail in CI"],"tags":["puppet","module","autoloader","class-resolution","dsl"],"backgroundTag":"class-not-found","analyzedSha":"e227c27540975c25aa22d533a52424a9d2fc886a","analyzedAt":"2026-08-21T20:49:46.650Z","schemaVersion":2},"datasetVersion":"2026-08-21T23:17:16.201Z"}