{"record":{"id":"efd497943b3a3c33","repo":"puppetlabs/puppet","slug":"invalid-resource-provider-provider-class","errorCode":null,"errorMessage":"Invalid %{resource} provider '%{provider_class}'","messagePattern":"Invalid %(.+?) provider '%(.+?)'","errorType":"exception","errorClass":"ArgumentError","httpStatus":null,"severity":"error","filePath":"lib/puppet/type.rb","lineNumber":1875,"sourceCode":"        # provider's doc string, since markdown_definitionlist sanitizes its inputs.\n        scrub(@doc) + \"Available providers are:\\n\\n\" + parenttype.providers.sort_by(&:to_s).collect { |i|\n          markdown_definitionlist(i, scrub(parenttype().provider(i).doc))\n        }.join\n      end\n\n      # For each resource, the provider param defaults to\n      # the type's default provider\n      defaultto {\n        prov = @resource.class.defaultprovider\n        prov.name if prov\n      }\n\n      validate do |provider_class|\n        provider_class = provider_class[0] if provider_class.is_a? Array\n        provider_class = provider_class.class.name if provider_class.is_a?(Puppet::Provider)\n\n        unless @resource.class.provider(provider_class)\n          raise ArgumentError, _(\"Invalid %{resource} provider '%{provider_class}'\") % { resource: @resource.class.name, provider_class: provider_class }\n        end\n      end\n\n      munge do |provider|\n        provider = provider[0] if provider.is_a? Array\n        provider = provider.intern if provider.is_a? String\n        @resource.provider = provider\n\n        if provider.is_a?(Puppet::Provider)\n          provider.class.name\n        else\n          provider\n        end\n      end\n    end\n    param.parenttype = self\n  end\n","sourceCodeStart":1857,"sourceCodeEnd":1893,"githubUrl":"https://github.com/puppetlabs/puppet/blob/e227c27540975c25aa22d533a52424a9d2fc886a/lib/puppet/type.rb#L1857-L1893","documentation":"Every resource type gets a provider parameter whose validate block resolves the given name through @resource.class.provider(provider_class). That lookup only returns providers that are confined/suitable on this node and actually declared; nil means the provider is unknown here, and ArgumentError 'Invalid <type> provider <name>' aborts the resource. The message also fires when the value is a Puppet::Provider instance of the wrong class or an Array.","triggerScenarios":"package { 'x': provider => 'aptitude' } where aptitude is not installed or the node is not Debian-family (suitability filtering removes it); a typo like provider => 'yum' spelled 'yuum'; exec's provider => 'shell' vs 'powershell' on the wrong platform; using a provider whose gem/dep (e.g., ruby-shadow for user) failed to load, dropping it from the registry.","commonSituations":"Porting manifests between OS families (apt vs yum vs dnf vs zypper); module code hardcoding a provider that the node's package set lacks; missing provider dependencies (aptitude, yum-utils, ruby libraries) after a minimal install or major OS upgrade.","solutions":["List what the type actually offers on this node: puppet describe -p <type> | head, or `ruby -e \"puts Puppet::Type.type(:package).suitable_provider_names\"` style introspection","Drop the explicit provider and let Puppet pick the default suitable provider — the most portable fix","If the provider is required, install its dependency (apt-get install aptitude) and ensure its confine matches the node facts","Fix typos/casing: provider names are downcased symbols ('zypper', not 'Zypper')"],"exampleFix":"# before\npackage { 'htop': ensure => installed, provider => 'aptitude' } # fails where aptitude absent\n\n# after\npackage { 'htop': ensure => installed } # default provider auto-selected per platform","handlingStrategy":"validation","validationCode":"type = Puppet::Type.type(:package)\nname = provider_value.to_s if provider_value.respond_to?(:to_s)\nunless type.provider(name)\n  Puppet.warning \"provider #{name} unsuitable on this node; using default\"\n  provider_value = nil # let defaultto choose\nend","typeGuard":null,"tryCatchPattern":"begin\n  resource[:provider] = 'aptitude'\nrescue ArgumentError => e\n  raise unless e.message =~ /Invalid .* provider/\n  resource[:provider] = nil # fall back to default provider\nend","preventionTips":["Omit provider where possible; Puppet selects the suitable default per platform","Check availability first: Puppet::Type.type(:package).suitable_provider_names","Install provider dependencies (aptitude, yum-utils) before pinning to them"],"tags":["puppet","provider","suitability","package","cross-platform"],"backgroundTag":"provider-not-found","analyzedSha":"e227c27540975c25aa22d533a52424a9d2fc886a","analyzedAt":"2026-08-21T20:49:46.650Z","schemaVersion":2},"datasetVersion":"2026-08-21T23:17:16.201Z"}