Jira (PUP-9794) Could not autoload puppet/provider/package/gem: superclass must be a Class (Module given)

0 views
Skip to first unread message

Thomas Kishel (JIRA)

unread,
Jun 21, 2019, 3:53:03 PM6/21/19
to puppe...@googlegroups.com
Thomas Kishel created an issue
 
Puppet / Bug PUP-9794
Could not autoload puppet/provider/package/gem: superclass must be a Class (Module given)
Issue Type: Bug Bug
Affects Versions: PUP 6.5.0
Assignee: Unassigned
Created: 2019/06/21 12:52 PM
Environment:

puppet -V; puppetserver -v; /opt/puppetlabs/puppet/bin/ruby -v
6.5.0
puppetserver version: 6.4.0
ruby 2.5.3p105 (2018-10-18 revision 65156) [x86_64-linux]

Triggered by package_provider fact in puppetlabs-stdlib

Priority: Normal Normal
Reporter: Thomas Kishel

Puppet Version: 6.5.0
Puppet Server Version: 6.4.0
OS Name/Version: Linux ip-10-0-42-40 4.4.0-1047-aws #56-Ubuntu SMP Sat Jan 6 19:39:06 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

Error: Could not autoload puppet/provider/package/gem: superclass must be a Class (Module given)
Error: Facter: error while resolving custom facts in /opt/puppetlabs/puppet/cache/lib/facter/package_provider.rb: Could not autoload puppet/provider/package/gem: superclass must be a Class (Module given)

Describe steps to reproduce…

Limited to AWS Kernel ...

uname -a
Linux ip-10-0-42-40 4.4.0-1047-aws #56-Ubuntu SMP Sat Jan 6 19:39:06 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

Install Puppet 6 and puppetlabs-stdlib ...

sudo -i
wget https://apt.puppetlabs.com/puppet6-release-xenial.deb
dpkg -i puppet6-release-xenial.deb
apt update
apt install -y puppetserver
source /etc/profile.d/puppet-agent.sh
puppet config set server $(hostname -f)
puppetserver ca setup
systemctl start puppetserver
puppet module install puppetlabs-stdlib

Trigger ...

puppet agent -t
Info: Using configured environment 'production'
Info: Retrieving pluginfacts
Info: Retrieving plugin
Notice: /File[/opt/puppetlabs/puppet/cache/lib/facter]/ensure: created
...
Info: Retrieving locales
Info: Loading facts
Error: Could not autoload puppet/provider/package/gem: superclass must be a Class (Module given)
Error: Facter: error while resolving custom facts in /opt/puppetlabs/puppet/cache/lib/facter/package_provider.rb: Could not autoload puppet/provider/package/gem: superclass must be a Class (Module given)
Info: Caching catalog for ip-10-0-42-40.us-west-2.compute.internal
Info: Applying configuration version '1561145391'
Info: Creating state file /opt/puppetlabs/puppet/cache/state/state.yaml
Notice: Applied catalog in 0.02 seconds

Or ...

facter -p os
2019-06-21 19:36:32.606934 ERROR puppetlabs.facter - error while resolving custom facts in /opt/puppetlabs/puppet/cache/lib/facter/package_provider.rb: Could not autoload puppet/provider/package/gem: superclass must be a Class (Module given)
{
  architecture => "amd64",
  distro => {
    codename => "xenial",
    description => "Ubuntu 16.04.3 LTS",
    id => "Ubuntu",
    release => {
      full => "16.04",
      major => "16.04"
    }
  },
  family => "Debian",
  hardware => "x86_64",
  name => "Ubuntu",
  release => {
    full => "16.04",
    major => "16.04"
  },
  selinux => {
    enabled => false
  }
}

Or ...

/opt/puppetlabs/puppet/bin/ruby /opt/puppetlabs/puppet/cache/lib/facter/package_provider.rb
Traceback (most recent call last):
	15: from /opt/puppetlabs/puppet/cache/lib/facter/package_provider.rb:11:in `<main>'
	14: from /opt/puppetlabs/puppet/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in `require'
	13: from /opt/puppetlabs/puppet/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in `require'
	12: from /opt/puppetlabs/puppet/lib/ruby/vendor_ruby/puppet/type/package.rb:9:in `<top (required)>'
	11: from /opt/puppetlabs/puppet/lib/ruby/vendor_ruby/puppet/type/package.rb:10:in `<module:Puppet>'
	10: from /opt/puppetlabs/puppet/lib/ruby/vendor_ruby/puppet/metatype/manager.rb:127:in `newtype'
	 9: from /opt/puppetlabs/puppet/lib/ruby/vendor_ruby/puppet/util/autoload.rb:215:in `loadall'
	 8: from /opt/puppetlabs/puppet/lib/ruby/vendor_ruby/puppet/util/autoload.rb:79:in `loadall'
	 7: from /opt/puppetlabs/puppet/lib/ruby/vendor_ruby/puppet/util/autoload.rb:79:in `each'
	 6: from /opt/puppetlabs/puppet/lib/ruby/vendor_ruby/puppet/util/autoload.rb:81:in `block in loadall'
	 5: from /opt/puppetlabs/puppet/lib/ruby/vendor_ruby/puppet/util/autoload.rb:66:in `load_file'
	 4: from /opt/puppetlabs/puppet/lib/ruby/vendor_ruby/puppet/util/autoload.rb:66:in `load'
	 3: from /opt/puppetlabs/puppet/lib/ruby/vendor_ruby/puppet/provider/package/gem.rb:1:in `<top (required)>'
	 2: from /opt/puppetlabs/puppet/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in `require'
	 1: from /opt/puppetlabs/puppet/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in `require'
/opt/puppetlabs/puppet/lib/ruby/vendor_ruby/puppet/provider/package_targetable.rb:23:in `<top (required)>': Could not autoload puppet/provider/package/gem: superclass must be a Class (Module given) (Puppet::Error)

Resolve ...

puppet module uninstall puppetlabs-stdlib
puppet agent -t
Info: Using configured environment 'production'
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Retrieving locales
Info: Caching catalog for ip-10-0-42-40.us-west-2.compute.internal
Info: Applying configuration version '1561145919'
Notice: Applied catalog in 0.05 seconds

Unable to reproduce with Generic Kernel ...

uname -a
Linux fy4y57a54szfeln 4.4.0-21-generic #37-Ubuntu SMP Mon Apr 18 18:33:37 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

Add Comment Add Comment
 
This message was sent by Atlassian JIRA (v7.7.1#77002-sha1:e75ca93)
Atlassian logo

Josh Cooper (JIRA)

unread,
Jun 21, 2019, 6:24:02 PM6/21/19
to puppe...@googlegroups.com
Josh Cooper commented on Bug PUP-9794
 
Re: Could not autoload puppet/provider/package/gem: superclass must be a Class (Module given)

On that system the autoloader loads all package providers, effectively calling:

> Dir.entries('/opt/puppetlabs/puppet/lib/ruby/vendor_ruby/puppet/provider/package')"
gem.rb
blastwave.rb
...

The gem package provider requires 'puppet/provider/package_targetable`, which attempts to inherit directly from Puppet::Provider::Package. However, at that point in time, the constant refers to the Puppet::Util::Package module due to the Puppet::Util being mixed into all providers.

This doesn't occur on other systems because Dir.entries returns providers in a different order:

$ Dir.entries('/opt/puppetlabs/puppet/lib/ruby/vendor_ruby/puppet/provider/package')"
aptrpm.rb
hpux.rb
aix.rb
...

And one of those providers requires puppet/provider/package before the gem provider is loaded, thereby defining Puppet::Provider::Package to the expected class.

Thomas Kishel (JIRA)

unread,
Jun 21, 2019, 7:06:03 PM6/21/19
to puppe...@googlegroups.com

Josh Cooper (JIRA)

unread,
Jun 24, 2019, 6:16:03 PM6/24/19
to puppe...@googlegroups.com
Josh Cooper updated an issue
 
Change By: Josh Cooper
Fix Version/s: PUP 6.y
Fix Version/s: PUP 6.4.3
Fix Version/s: PUP 6.0.10
Fix Version/s: PUP 5.5.15

Thomas Kishel (JIRA)

unread,
Jun 24, 2019, 7:57:03 PM6/24/19
to puppe...@googlegroups.com

Josh Cooper (JIRA)

unread,
Jun 24, 2019, 8:29:03 PM6/24/19
to puppe...@googlegroups.com
Josh Cooper updated an issue
Change By: Josh Cooper
Fix Version/s: PUP 6.4.3
Fix Version/s: PUP 6.0.10
Fix Version/s: PUP 5.5.15

Josh Cooper (JIRA)

unread,
Jun 24, 2019, 8:29:04 PM6/24/19
to puppe...@googlegroups.com

Josh Cooper (JIRA)

unread,
Jun 24, 2019, 8:30:04 PM6/24/19
to puppe...@googlegroups.com
Josh Cooper commented on Bug PUP-9794

The change had to be made in 5.5.x since that's where the original change was made. However, the regression was only released in 6.5.0, so that's the only fix version needed.

Josh Cooper (JIRA)

unread,
Jun 24, 2019, 8:30:04 PM6/24/19
to puppe...@googlegroups.com

Josh Cooper (JIRA)

unread,
Jun 24, 2019, 9:08:03 PM6/24/19
to puppe...@googlegroups.com

Josh Cooper (JIRA)

unread,
Jun 24, 2019, 9:08:04 PM6/24/19
to puppe...@googlegroups.com

Thomas Kishel (JIRA)

unread,
Jun 25, 2019, 12:08:04 PM6/25/19
to puppe...@googlegroups.com
Thomas Kishel commented on Bug PUP-9794
 
Re: Could not autoload puppet/provider/package/gem: superclass must be a Class (Module given)

This is an unsupported method of patching:

# a.pp
file_line { 'PUP-9794':
  path  => '/opt/puppetlabs/puppet/lib/ruby/vendor_ruby/puppet/provider/package_targetable.rb',
  line  => "require 'puppet/provider/package' # PUP-9794",
  after => "# Rather, .*",
}

root@ip-10-0-0-1:~# puppet apply a.pp 
Error: Could not autoload puppet/provider/package/gem: superclass must be a Class (Module given)
Error: Facter: error while resolving custom facts in /opt/puppetlabs/puppet/cache/lib/facter/package_provider.rb: Could not autoload puppet/provider/package/gem: superclass must be a Class (Module given)
Notice: Compiled catalog for ip-10-0-0-1.us-west-2.compute.internal in environment production in 0.02 seconds
Notice: /Stage[main]/Main/File_line[PUP-9794]/ensure: created
Notice: Applied catalog in 0.02 seconds
 
root@ip-10-0-0-1:~# puppet apply a.pp 
Notice: Compiled catalog for ip-10-0-0-1.us-west-2.compute.internal in environment production in 0.02 seconds
Notice: Applied catalog in 0.01 seconds

Kenn Hussey (JIRA)

unread,
Jun 25, 2019, 12:13:04 PM6/25/19
to puppe...@googlegroups.com
Kenn Hussey updated an issue
 
Change By: Kenn Hussey
Fix Version/s: PUP 6.y
Fix Version/s: PUP 6.6.0

Jean Bond (JIRA)

unread,
Jun 28, 2019, 1:04:54 PM6/28/19
to puppe...@googlegroups.com

Gheorghe Popescu (JIRA)

unread,
Jul 3, 2019, 4:50:03 AM7/3/19
to puppe...@googlegroups.com
Gheorghe Popescu updated an issue
Change By: Gheorghe Popescu
Fix Version/s: PUP 6.4.3
Fix Version/s: PUP 6.0.10
Fix Version/s: PUP 5.5.15
Reply all
Reply to author
Forward
0 new messages