btobolaski
btobolaski

Reputation: 168

NoMethodError error in chef run that only occurs in vagrant

I have a cookbook that wraps the docker cookbook (along with a number of others). When I attempt to use this cookbook in Vagrant, I get a NoMethodError for coerce_shell_command. This is the relevant section of the log:

==> default: Compiling Cookbooks...
==> default: /opt/chef/embedded/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:54:in `require'
==> default: /opt/chef/embedded/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:54:in `require'
==> default: /opt/chef/embedded/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:54:in `require'
==> default: /opt/chef/embedded/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:54:in `require'
==> default: /opt/chef/embedded/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:54:in `require'
==> default: /opt/chef/embedded/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:54:in `require'
==> default: /opt/chef/embedded/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:54:in `require'
==> default: /opt/chef/embedded/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:54:in `require'
==> default: /opt/chef/embedded/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:54:in `require'
==> default: /opt/chef/embedded/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:54:in `require'
==> default: /opt/chef/embedded/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:54:in `require'
==> default: /opt/chef/embedded/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:54:in `require'
==> default: /opt/chef/embedded/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:54:in `require'
==> default: /opt/chef/embedded/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:54:in `require'
==> default: /tmp/vagrant-chef/e6a0063338a4a700e2c49f12beaa529f/cookbooks/compat_resource/libraries/autoload.rb:19:in `<top (required)>'
==> default: /opt/chef/embedded/lib/ruby/2.1.0/forwardable.rb:183:in `setup_run_context'
==> default: /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/chef-12.6.0/bin/chef-solo:25:in `<top (required)>'
==> default: /usr/bin/chef-solo:54:in `load'
==> default: /usr/bin/chef-solo:54:in `<main>'
==> default: /tmp/vagrant-chef/e6a0063338a4a700e2c49f12beaa529f/cookbooks/docker/libraries/docker_base.rb:39:in `<class:DockerBase>'
==> default: /tmp/vagrant-chef/e6a0063338a4a700e2c49f12beaa529f/cookbooks/docker/libraries/docker_base.rb:2:in `<module:DockerCookbook>'
==> default: /tmp/vagrant-chef/e6a0063338a4a700e2c49f12beaa529f/cookbooks/docker/libraries/docker_base.rb:1:in `<top (required)>'
==> default: /opt/chef/embedded/lib/ruby/2.1.0/forwardable.rb:183:in `setup_run_context'
==> default: /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/chef-12.6.0/bin/chef-solo:25:in `<top (required)>'
==> default: /usr/bin/chef-solo:54:in `load'
==> default: /usr/bin/chef-solo:54:in `<main>'
==> default: /tmp/vagrant-chef/e6a0063338a4a700e2c49f12beaa529f/cookbooks/docker/libraries/docker_base.rb:44:in `<class:DockerBase>'
==> default: /tmp/vagrant-chef/e6a0063338a4a700e2c49f12beaa529f/cookbooks/docker/libraries/docker_base.rb:2:in `<module:DockerCookbook>'
==> default: /tmp/vagrant-chef/e6a0063338a4a700e2c49f12beaa529f/cookbooks/docker/libraries/docker_base.rb:1:in `<top (required)>'
==> default: /opt/chef/embedded/lib/ruby/2.1.0/forwardable.rb:183:in `setup_run_context'
==> default: /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/chef-12.6.0/bin/chef-solo:25:in `<top (required)>'
==> default: /usr/bin/chef-solo:54:in `load'
==> default: /usr/bin/chef-solo:54:in `<main>'
==> default: /tmp/vagrant-chef/e6a0063338a4a700e2c49f12beaa529f/cookbooks/docker/libraries/docker_base.rb:49:in `<class:DockerBase>'
==> default: /tmp/vagrant-chef/e6a0063338a4a700e2c49f12beaa529f/cookbooks/docker/libraries/docker_base.rb:2:in `<module:DockerCookbook>'
==> default: /tmp/vagrant-chef/e6a0063338a4a700e2c49f12beaa529f/cookbooks/docker/libraries/docker_base.rb:1:in `<top (required)>'
==> default: /opt/chef/embedded/lib/ruby/2.1.0/forwardable.rb:183:in `setup_run_context'
==> default: /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/chef-12.6.0/bin/chef-solo:25:in `<top (required)>'
==> default: /usr/bin/chef-solo:54:in `load'
==> default: /usr/bin/chef-solo:54:in `<main>'
==> default: 
==> default: ================================================================================
==> default: Recipe Compile Error in /tmp/vagrant-chef/e6a0063338a4a700e2c49f12beaa529f/cookbooks/docker/libraries/docker_base.rb
==> default: ================================================================================
==> default: 
==> default: NoMethodError
==> default: -------------
==> default: undefined method `coerce_shell_command' for DockerCookbook::DockerBase:Class
==> default: 
==> default: Cookbook Trace:
==> default: ---------------
==> default:   /tmp/vagrant-chef/e6a0063338a4a700e2c49f12beaa529f/cookbooks/docker/libraries/docker_base.rb:56:in `block in <class:DockerBase>'
==> default:   /tmp/vagrant-chef/e6a0063338a4a700e2c49f12beaa529f/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/property.rb:599:in `call'
==> default:   /tmp/vagrant-chef/e6a0063338a4a700e2c49f12beaa529f/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/property.rb:599:in `exec_in_resource'
==> default:   /tmp/vagrant-chef/e6a0063338a4a700e2c49f12beaa529f/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/property.rb:427:in `coerce'
==> default:   /tmp/vagrant-chef/e6a0063338a4a700e2c49f12beaa529f/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/property.rb:91:in `initialize'
==> default:   /tmp/vagrant-chef/e6a0063338a4a700e2c49f12beaa529f/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/property.rb:52:in `new'
==> default:   /tmp/vagrant-chef/e6a0063338a4a700e2c49f12beaa529f/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/property.rb:52:in `derive'
==> default:   /tmp/vagrant-chef/e6a0063338a4a700e2c49f12beaa529f/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/mixin/properties.rb:150:in `property_type'
==> default:   /tmp/vagrant-chef/e6a0063338a4a700e2c49f12beaa529f/cookbooks/docker/libraries/docker_base.rb:54:in `<class:DockerBase>'
==> default:   /tmp/vagrant-chef/e6a0063338a4a700e2c49f12beaa529f/cookbooks/docker/libraries/docker_base.rb:2:in `<module:DockerCookbook>'
==> default:   /tmp/vagrant-chef/e6a0063338a4a700e2c49f12beaa529f/cookbooks/docker/libraries/docker_base.rb:1:in `<top (required)>'
==> default: 
==> default: Relevant File Content:
==> default: ----------------------
==> default: /tmp/vagrant-chef/e6a0063338a4a700e2c49f12beaa529f/cookbooks/docker/libraries/docker_base.rb:
==> default: 
==> default:  49:      NonEmptyArray = property_type(
==> default:  50:        is: [Array, nil],
==> default:  51:        coerce: proc { |v| Array(v).empty? ? nil : Array(v) }
==> default:  52:      ) unless defined?(NonEmptyArray)
==> default:  53:  
==> default:  54:      ShellCommand = property_type(
==> default:  55:        is: [String],
==> default:  56>>       coerce: proc { |v| coerce_shell_command(v) }
==> default:  57:      ) unless defined?(ShellCommand)
==> default:  58:  
==> default:  59:      UnorderedArrayType = property_type(
==> default:  60:        is: [UnorderedArray, nil],
==> default:  61:        coerce: proc { |v| v.nil? ? nil : UnorderedArray.new(Array(v)) }
==> default:  62:      ) unless defined?(UnorderedArrayType)
==> default:  63:  
==> default:  64:      PartialHashType = property_type(
==> default:  65:        is: [PartialHash, nil],
==> default: 
==> default: 
==> default: Running handlers:
==> default: [2016-01-28T16:27:24-08:00] ERROR: Running exception handlers
==> default: Running handlers complete
==> default: [2016-01-28T16:27:24-08:00] ERROR: Exception handlers complete
==> default: Chef Client failed. 0 resources updated in 05 seconds
==> default: [2016-01-28T16:27:24-08:00] FATAL: Stacktrace dumped to /var/chef/cache/chef-stacktrace.out
==> default: [2016-01-28T16:27:24-08:00] FATAL: Please provide the contents of the stacktrace.out file if you file a bug report
==> default: [2016-01-28T16:27:24-08:00] ERROR: undefined method `coerce_shell_command' for DockerCookbook::DockerBase:Class
==> default: [2016-01-28T16:27:24-08:00] FATAL: Chef::Exceptions::ChildConvergeError: Chef run process exited unsuccessfully (exit code 1)`

(full vagrant log here)

I'm using vagrant-berkshelf to install my wrapper cookbook as well as all of its dependencies. I'm able to locate the function in the expected file docker/libraries/helpers_base.rb but, it doesn't appear that chef is locating it.

I don't think that this is a bug in the cookbook because it works when run:

Things I've tried:

Yet I continue to get the same error each time I run vagrant up.

Upvotes: 0

Views: 459

Answers (1)

lamont
lamont

Reputation: 3974

This was a bug in the version of compat_resource you were using:

==> default: Using compat_resource (12.5.26)

I think it was fixed with 12.7.0. When you tried again you pulled the new cookbook which fixed the issue.

Looks like related bug here:

https://github.com/chef-cookbooks/docker/issues/621

(and looks like it might not be fixed, yet, but it 'smells' compat_resources related and that's the bug you should follow)

Upvotes: 1

Related Questions