sous-chefs/nodejs

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?

tas50 commented

Closing this out since it looks like we fixed it with the change to limit the results returned