test-kitchen / busser-serverspec

A Busser runner plugin for the serverspec testing library
Other
54 stars 41 forks source link

All tests fail with NoMethodError: undefined method `[]' for nil:NilClass #31

Closed philbert closed 9 years ago

philbert commented 9 years ago

I'm running Test-Kitchen with serverspec against a centos 6.5 target on Amazon using the ec2-driver.

All my tests pass when I set my backend to :exec, but all fail with the following error when I use an :ssh backend.

            NoMethodError:
              undefined method `[]' for nil:NilClass

In the .kitchen/logs/default-devtestnet.log all the tests fail with the following stacktrace:

I, [2015-07-06T09:31:04.606545 #27974]  INFO -- default-devtestnet:   22) Service "httpd" should be enabled
I, [2015-07-06T09:31:04.606560 #27974]  INFO -- default-devtestnet:       ESC[31mFailure/Error: it { should be_enabled }ESC[0m
I, [2015-07-06T09:31:04.606574 #27974]  INFO -- default-devtestnet:       ESC[31mNoMethodError:ESC[0m
I, [2015-07-06T09:31:04.606588 #27974]  INFO -- default-devtestnet:       ESC[31m  undefined method `[]' for nil:NilClassESC[0m
I, [2015-07-06T09:31:04.606602 #27974]  INFO -- default-devtestnet:       ESC[36m# /tmp/verifier/gems/gems/specinfra-2.36.14/lib/specinfra/backend/ssh.rb:174:in `sudo?'ESC[0m
I, [2015-07-06T09:31:04.621094 #27974]  INFO -- default-devtestnet:
I, [2015-07-06T09:31:04.621143 #27974]  INFO -- default-devtestnet:       ESC[36m# /tmp/verifier/gems/gems/specinfra-2.36.14/lib/specinfra/backend/ssh.rb:10:in `run_command'ESC[0m
I, [2015-07-06T09:31:04.621182 #27974]  INFO -- default-devtestnet:       ESC[36m# /tmp/verifier/gems/gems/specinfra-2.36.14/lib/specinfra/runner.rb:27:in `run'ESC[0m
I, [2015-07-06T09:31:04.621204 #27974]  INFO -- default-devtestnet:       ESC[36m# /tmp/verifier/gems/gems/specinfra-2.36.14/lib/specinfra/runner.rb:13:in `method_missing'ESC[0m
I, [2015-07-06T09:31:04.621222 #27974]  INFO -- default-devtestnet:       ESC[36m# /tmp/verifier/gems/gems/serverspec-2.19.0/lib/serverspec/type/service.rb:7:in `enabled?'ESC[0m
I, [2015-07-06T09:31:04.621240 #27974]  INFO -- default-devtestnet:       ESC[36m# /tmp/verifier/gems/gems/serverspec-2.19.0/lib/serverspec/matcher/be_enabled.rb:4:in `block (2 levels) in <top (required)>'ESC[0m
I, [2015-07-06T09:31:04.621256 #27974]  INFO -- default-devtestnet:       ESC[36m# /tmp/verifier/suites/serverspec/default_spec.rb:12:in `block (2 levels) in <top (required)>'
ESC[0m

Here is some more info from the .kitchen/logs/default-devtestnet.log if it's helpful at all.

I, [2015-07-06T09:31:04.623546 #27974]  INFO -- default-devtestnet:
I, [2015-07-06T09:31:04.623747 #27974]  INFO -- default-devtestnet: /opt/chef/embedded/bin/ruby -I/tmp/verifier/suites/serverspec -I/tmp/verifier/gems/gems/rspec-support-3.3.0/lib:/tmp/verifier/gems/gems/rspec-core-3.3.1/lib /opt/chef/embedded/bin/rspec --pattern /tmp/verifier/suites/serverspec/\*\*/\*_spec.rb --color --format documentation --default-path /tmp/verifier/suites/serverspec failed
I, [2015-07-06T09:31:04.623892 #27974]  INFO -- default-devtestnet: !!!!!! Ruby Script [/tmp/verifier/gems/gems/busser-serverspec-0.5.7/lib/busser/runner_plugin/../serverspec/runner.rb /tmp/verifier/suites/serverspec] exit code was 1
E, [2015-07-06T09:31:04.624819 #27974] ERROR -- default-devtestnet: Verify failed on instance <default-devtestnet>.
E, [2015-07-06T09:31:04.624905 #27974] ERROR -- default-devtestnet: ------Exception-------
E, [2015-07-06T09:31:04.624925 #27974] ERROR -- default-devtestnet: Class: Kitchen::ActionFailed
E, [2015-07-06T09:31:04.624938 #27974] ERROR -- default-devtestnet: Message: SSH exited (1) for command: [sh -c '

BUSSER_ROOT="/tmp/verifier"; export BUSSER_ROOT
GEM_HOME="/tmp/verifier/gems"; export GEM_HOME
GEM_PATH="/tmp/verifier/gems"; export GEM_PATH
GEM_CACHE="/tmp/verifier/gems/cache"; export GEM_CACHE

sudo -E /tmp/verifier/bin/busser test
']
E, [2015-07-06T09:31:04.624951 #27974] ERROR -- default-devtestnet: ---Nested Exception---
E, [2015-07-06T09:31:04.624972 #27974] ERROR -- default-devtestnet: Class: Kitchen::Transport::SshFailed
E, [2015-07-06T09:31:04.624984 #27974] ERROR -- default-devtestnet: Message: SSH exited (1) for command: [sh -c '

BUSSER_ROOT="/tmp/verifier"; export BUSSER_ROOT
GEM_HOME="/tmp/verifier/gems"; export GEM_HOME
GEM_PATH="/tmp/verifier/gems"; export GEM_PATH
GEM_CACHE="/tmp/verifier/gems/cache"; export GEM_CACHE

sudo -E /tmp/verifier/bin/busser test
']
E, [2015-07-06T09:31:04.624995 #27974] ERROR -- default-devtestnet: ------Backtrace-------
E, [2015-07-06T09:31:04.625006 #27974] ERROR -- default-devtestnet: /Users/Phil/.rvm/gems/ruby-2.0.0-p643/gems/test-kitchen-1.4.0/lib/kitchen/verifier/base.rb:79:in `rescue in call'
E, [2015-07-06T09:31:04.625018 #27974] ERROR -- default-devtestnet: /Users/Phil/.rvm/gems/ruby-2.0.0-p643/gems/test-kitchen-1.4.0/lib/kitchen/verifier/base.rb:82:in `call'
E, [2015-07-06T09:31:04.625030 #27974] ERROR -- default-devtestnet: /Users/Phil/.rvm/gems/ruby-2.0.0-p643/gems/test-kitchen-1.4.0/lib/kitchen/instance.rb:398:in `block in verify_action'
E, [2015-07-06T09:31:04.625041 #27974] ERROR -- default-devtestnet: /Users/Phil/.rvm/gems/ruby-2.0.0-p643/gems/test-kitchen-1.4.0/lib/kitchen/instance.rb:488:in `call'
E, [2015-07-06T09:31:04.625052 #27974] ERROR -- default-devtestnet: /Users/Phil/.rvm/gems/ruby-2.0.0-p643/gems/test-kitchen-1.4.0/lib/kitchen/instance.rb:488:in `synchronize_or_call'
E, [2015-07-06T09:31:04.625063 #27974] ERROR -- default-devtestnet: /Users/Phil/.rvm/gems/ruby-2.0.0-p643/gems/test-kitchen-1.4.0/lib/kitchen/instance.rb:453:in `block in action'
E, [2015-07-06T09:31:04.625075 #27974] ERROR -- default-devtestnet: /Users/Phil/.rvm/rubies/ruby-2.0.0-p643/lib/ruby/2.0.0/benchmark.rb:281:in `measure'
E, [2015-07-06T09:31:04.625096 #27974] ERROR -- default-devtestnet: /Users/Phil/.rvm/gems/ruby-2.0.0-p643/gems/test-kitchen-1.4.0/lib/kitchen/instance.rb:452:in `action'
E, [2015-07-06T09:31:04.625109 #27974] ERROR -- default-devtestnet: /Users/Phil/.rvm/gems/ruby-2.0.0-p643/gems/test-kitchen-1.4.0/lib/kitchen/instance.rb:394:in `verify_action'
E, [2015-07-06T09:31:04.625121 #27974] ERROR -- default-devtestnet: /Users/Phil/.rvm/gems/ruby-2.0.0-p643/gems/test-kitchen-1.4.0/lib/kitchen/instance.rb:341:in `block in transition_to'
E, [2015-07-06T09:31:04.625134 #27974] ERROR -- default-devtestnet: /Users/Phil/.rvm/gems/ruby-2.0.0-p643/gems/test-kitchen-1.4.0/lib/kitchen/instance.rb:340:in `each'
E, [2015-07-06T09:31:04.625146 #27974] ERROR -- default-devtestnet: /Users/Phil/.rvm/gems/ruby-2.0.0-p643/gems/test-kitchen-1.4.0/lib/kitchen/instance.rb:340:in `transition_to'
E, [2015-07-06T09:31:04.625159 #27974] ERROR -- default-devtestnet: /Users/Phil/.rvm/gems/ruby-2.0.0-p643/gems/test-kitchen-1.4.0/lib/kitchen/instance.rb:160:in `verify'
E, [2015-07-06T09:31:04.625180 #27974] ERROR -- default-devtestnet: /Users/Phil/.rvm/gems/ruby-2.0.0-p643/gems/test-kitchen-1.4.0/lib/kitchen/command.rb:176:in `public_send'
E, [2015-07-06T09:31:04.625194 #27974] ERROR -- default-devtestnet: /Users/Phil/.rvm/gems/ruby-2.0.0-p643/gems/test-kitchen-1.4.0/lib/kitchen/command.rb:176:in `block (2 levels) in run_action'
E, [2015-07-06T09:31:04.625207 #27974] ERROR -- default-devtestnet: ----------------------

Here is the relevant version info: My host is OSX Yosemite 10.10.4.

Test Kitchen version 1.4.0 kitchen-ansible (0.0.16) kitchen-cfengine (0.0.5) kitchen-ec2 (0.9.4) kitchen-openstack (1.8.0) kitchen-vagrant (0.18.0)

philbert commented 9 years ago

Ok so I figured out part of the issue is in my default_helper.rb, but I must be missing some glue between test-kitchen and serverspec because I'm beginning to duplicate the information in my .kitchen.yml.

I've fixed my default_helper.rb so that it looks like this:

require 'serverspec'
require 'net/ssh'

set :backend, :ssh
set :os, :family => 'redhat', :release => '6', :arch => 'x86_64'

options = Net::SSH::Config.for(host)
options[:user] = 'vagrant'
set :ssh_options, options

host = 'a.b.c.d'
set :host,        options[:host_name] || host

But now all my test cases fail with the error:

            Net::SSH::AuthenticationFailed:
              Authentication failed for user vagrant@a.b.c.d

But my ansible provisioner is configured in my .kitchen.yml, which looks like this:

---
driver:
  name: ec2
  aws_ssh_key_id: keyname
  region: eu-west-1
  availability_zone: eu-west-1c
  image_id: ami-number
  subnet_id: subnet-number
  associate_public_ip: true
  instance_type: t2.small
  interface: public

transport:
  ssh_key: id_rsa
  username: vagrant

provisioner:
  name: ansible_playbook
  hosts: master

platforms:
  - name: devtestnet

suites:
  - name: default

And when I run with kitchen verify -l debug it looks as though my ssh configuration is correct. The ansible provisioning works at least

D      [SSH] vagrant@a.b.c.d<{:user_known_hosts_file=>"/dev/null", :paranoid=>false, :port=>22, :compression=>"zlib", :compression_level=>6, :keepalive=>true, :keepalive_interval=>60, :timeout=>15, :keys_only=>true, :keys=>["<correct_ssh_priv_key_for_vagrant_user>"], :user=>"vagrant"}> (sh -c '

BUSSER_ROOT="/tmp/verifier"; export BUSSER_ROOT
GEM_HOME="/tmp/verifier/gems"; export GEM_HOME
GEM_PATH="/tmp/verifier/gems"; export GEM_PATH
GEM_CACHE="/tmp/verifier/gems/cache"; export GEM_CACHE

sudo -E /tmp/verifier/bin/busser test
')
-----> Running serverspec test suite
       /opt/chef/embedded/bin/ruby -I/tmp/verifier/suites/serverspec -I/tmp/verifier/gems/gems/rspec-support-3.3.0/lib:/tmp/verifier/gems/gems/rspec-core-3.3.1/lib /opt/chef/embedded/bin/rspec --pattern /tmp/verifier/suites/serverspec/\*\*/\*_spec.rb --color --format documentation --default-path /tmp/verifier/suites/serverspec

Maybe I am just barking up the wrong tree trying to get the :ssh backend working in test-kitchen?

d-higuchi commented 9 years ago

busser-serverspec runs serverspec on testing server after ssh log in it. so backend :exec is required and backend :ssh is not worked.

philbert commented 9 years ago

OK then I understand :)

It would be nice if you could explain this in the readme.md so that it's clear how it is intended to work.

d-higuchi commented 9 years ago

ok, i will add info later.

btw, if you want to run serverspec from outside of test target server via ssh, you can use kitchen-verifier-shell ( https://rubygems.org/gems/kitchen-verifier-shell ).