npm_packages attribute not working nodejs 8
Closed this issue · 3 comments
Cookbook version
2.4.4
Chef-client version
12
Platform Details
CentOS 6
Scenario:
npm_package to install libraries fails
Steps to Reproduce:
wrapped cookbook in role that has the following attributes:
{
"nodejs": {
"version": "8.1.2",
"engine": "node",
"install_method": "binary",
"binary": {
"checksum": {
"linux_x64": "73b116238dd930efbed7c2f6ba24c5c04f27223fcc44d1d35305e22d70c4bb87"
}
},
"npm_packages": [
{
"name": "ramda"
}
]
}
}
Expected Result:
The ramda library to install. If I leave off the npm_packages everything installs fine
Actual Result:
Error:
Generated at 2017-06-15 17:53:22 -0400
JSON::ParserError: nodejs_npm[ramda] (nodejs::npm_packages line 2) had an error: JSON::ParserError: execute[install NPM package ramda] (/var/chef/cache/cookbooks/nodejs/providers/npm.rb line 6) had an error: JSON::ParserError: 743: unexpected token at '{
"dependencies": {
"npm": {
"version": "5.0.3",
"dependencies": {
"JSONStream": {
"version": "1.3.1",
"from": "JSONStream@~1.3.1",
"resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.1.tgz",
"dependencies": {
"jsonparse": {
"version": "1.3.0",
"from": "jsonparse@^1.2.0",
"resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.0.tgz"
},
"through": {
"version": "2.3.8",
"from": "through@>=2.2.7 <3",
"resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz"
}
}
},
},
"extend": {
"version": "3.0.1",
"from": "extend@3",
"resolv'
/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/json-2.0.3/lib/json/common.rb:156:in `parse'
/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/json-2.0.3/lib/json/common.rb:156:in `parse'
/var/chef/cache/cookbooks/nodejs/libraries/nodejs_helper.rb:25:in `npm_list'
/var/chef/cache/cookbooks/nodejs/libraries/nodejs_helper.rb:39:in `npm_package_installed?'
/var/chef/cache/cookbooks/nodejs/providers/npm.rb:37:in `package_installed?'
/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/chef-12.20.3/lib/chef/resource.rb:1375:in `method_missing'
/var/chef/cache/cookbooks/nodejs/providers/npm.rb:12:in `block (3 levels) in class_from_file'
/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/chef-12.20.3/lib/chef/resource/conditional.rb:106:in `evaluate_block'
/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/chef-12.20.3/lib/chef/resource/conditional.rb:95:in `evaluate'
/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/chef-12.20.3/lib/chef/resource/conditional.rb:88:in `continue?'
/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/chef-12.20.3/lib/chef/resource.rb:1537:in `block in should_skip?'
/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/chef-12.20.3/lib/chef/resource.rb:1536:in `each'
/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/chef-12.20.3/lib/chef/resource.rb:1536:in `find'
/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/chef-12.20.3/lib/chef/resource.rb:1536:in `should_skip?'
/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/chef-12.20.3/lib/chef/resource.rb:621:in `run_action'
/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/chef-12.20.3/lib/chef/runner.rb:69:in `run_action'
/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/chef-12.20.3/lib/chef/runner.rb:97:in `block (2 levels) in converge'
/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/chef-12.20.3/lib/chef/runner.rb:97:in `each'
/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/chef-12.20.3/lib/chef/runner.rb:97:in `block in converge'
/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/chef-12.20.3/lib/chef/resource_collection/resource_list.rb:94:in `block in execute_each_resource'
/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/chef-12.20.3/lib/chef/resource_collection/stepable_iterator.rb:114:in `call_iterator_block'
/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/chef-12.20.3/lib/chef/resource_collection/stepable_iterator.rb:85:in `step'
/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/chef-12.20.3/lib/chef/resource_collection/stepable_iterator.rb:103:in `iterate'
/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/chef-12.20.3/lib/chef/resource_collection/stepable_iterator.rb:55:in `each_with_index'
/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/chef-12.20.3/lib/chef/resource_collection/resource_list.rb:92:in `execute_each_resource'
/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/chef-12.20.3/lib/chef/runner.rb:96:in `converge'
/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/chef-12.20.3/lib/chef/provider.rb:362:in `compile_and_converge_action'
(eval):2:in `action_install'
/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/chef-12.20.3/lib/chef/provider.rb:145:in `run_action'
/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/chef-12.20.3/lib/chef/resource.rb:622:in `run_action'
/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/chef-12.20.3/lib/chef/runner.rb:69:in `run_action'
/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/chef-12.20.3/lib/chef/runner.rb:97:in `block (2 levels) in converge'
/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/chef-12.20.3/lib/chef/runner.rb:97:in `each'
/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/chef-12.20.3/lib/chef/runner.rb:97:in `block in converge'
/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/chef-12.20.3/lib/chef/resource_collection/resource_list.rb:94:in `block in execute_each_resource'
/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/chef-12.20.3/lib/chef/resource_collection/stepable_iterator.rb:114:in `call_iterator_block'
/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/chef-12.20.3/lib/chef/resource_collection/stepable_iterator.rb:85:in `step'
/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/chef-12.20.3/lib/chef/resource_collection/stepable_iterator.rb:103:in `iterate'
/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/chef-12.20.3/lib/chef/resource_collection/stepable_iterator.rb:55:in `each_with_index'
/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/chef-12.20.3/lib/chef/resource_collection/resource_list.rb:92:in `execute_each_resource'
/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/chef-12.20.3/lib/chef/runner.rb:96:in `converge'
/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/chef-12.20.3/lib/chef/client.rb:715:in `block in converge'
/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/chef-12.20.3/lib/chef/client.rb:710:in `catch'
/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/chef-12.20.3/lib/chef/client.rb:710:in `converge'
/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/chef-12.20.3/lib/chef/client.rb:749:in `converge_and_save'
/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/chef-12.20.3/lib/chef/client.rb:286:in `run'
/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/chef-12.20.3/lib/chef/application.rb:295:in `block in fork_chef_client'
/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/chef-12.20.3/lib/chef/application.rb:283:in `fork'
/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/chef-12.20.3/lib/chef/application.rb:283:in `fork_chef_client'
/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/chef-12.20.3/lib/chef/application.rb:248:in `block in run_chef_client'
/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/chef-12.20.3/lib/chef/local_mode.rb:44:in `with_server_connectivity'
/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/chef-12.20.3/lib/chef/application.rb:236:in `run_chef_client'
/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/chef-12.20.3/lib/chef/application/client.rb:464:in `sleep_then_run_chef_client'
/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/chef-12.20.3/lib/chef/application/client.rb:451:in `block in interval_run_chef_client'
/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/chef-12.20.3/lib/chef/application/client.rb:450:in `loop'
/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/chef-12.20.3/lib/chef/application/client.rb:450:in `interval_run_chef_client'
/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/chef-12.20.3/lib/chef/application/client.rb:434:in `run_application'
/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/chef-12.20.3/lib/chef/application.rb:59:in `run'
/opt/chef/embedded/lib/ruby/gems/2.3.0/gems/chef-12.20.3/bin/chef-client:26:in `<top (required)>'
/usr/bin/chef-client:57:in `load'
/usr/bin/chef-client:57:in `<main>'
Running into the same issue while trying to install forever
with cookbook version 2.4.4 and node 8.1.2. In the trace it shows that Chef is attempting to run npm install -global forever
which is breaking in the same manner as the OP's run. Interestingly, running that command manually results in a successful install of forever
.
Did some digging and discovered that the problem is likely in the npm list -global -json
command and not in the npm install -global
one. The list command is dying at byte 65536 but only when I pipe it to another program like less
. If I redirect the output to a file or let it spit out to stdout it completes successfully. For instance, the output of this truncates...
# npm list -global -json | wc -c
65536
Whereas the output of this does not
# npm list -global -json > test.json
# cat test.json | wc -c
227605
I think this may be related to a limit on the capacity of a pipe. https://linux.die.net/man/7/pipe (under the Pipe Capacity heading) indicates that there is a maximum of 65536 bytes that can be stored up in a pipe. Maybe npm
is blocking while writing to the output pipe, fills up the buffer, and then crashes before less can unload the pipe?
Closing this out since it looks like we fixed it with the change to limit the results returned