rspec - Unable to find class ::logstash

612 views
Skip to first unread message

Brian Wilkins

unread,
Jun 4, 2014, 2:30:21 PM6/4/14
to puppet...@googlegroups.com
I am trying to write unit tests of my puppet modules. In my profiles::logstash::install, I disambiguate the call to /etc/puppet/modules/logstash by using ::logstash in my class definition like so:

class profiles::logstash::install() {
  $ensure = $profiles::logstash::enable ? {true => present, default => absent}
  $status = $profiles::logstash::start ? {true => enabled, default => disabled}

  class { '::logstash':
    ensure  => $ensure,
    status  => $status,
    version => $profiles::logstash::version
  }
}

However, when I run my spec file:

require 'spec_helper'

describe "profiles::logstash" do
  it { should contain_class("::logstash") }
  it { should contain_class("profiles::logstash::install") }
  it { should contain_class("profiles::logstash::config") }
end

I get the errors:

1) profiles::logstash
     Failure/Error: it { should contain_class("::logstash") }
     Puppet::Error:
       Puppet::Parser::AST::Resource failed with error ArgumentError: Could not find declared class ::logstash at /etc/puppet/modules/profiles/spec/fixtures/modules/profiles/manifests/logstash/install.pp:10 on node els4167.els.dev
     # ./spec/classes/logstash_spec.rb:4

  2) profiles::logstash
     Failure/Error: it { should contain_class("profiles::logstash::install") }
     Puppet::Error:
       Puppet::Parser::AST::Resource failed with error ArgumentError: Could not find declared class ::logstash at /etc/puppet/modules/profiles/spec/fixtures/modules/profiles/manifests/logstash/install.pp:10 on node els4167.els.dev
     # ./spec/classes/logstash_spec.rb:5

  3) profiles::logstash
     Failure/Error: it { should contain_class("profiles::logstash::config") }
     Puppet::Error:
       Puppet::Parser::AST::Resource failed with error ArgumentError: Could not find declared class ::logstash at /etc/puppet/modules/profiles/spec/fixtures/modules/profiles/manifests/logstash/install.pp:10 on node els4167.els.dev
     # ./spec/classes/logstash_spec.rb:6

How do I get rspec to find my class /etc/puppet/modules/logstash and get it to reference ::logstash as a disambiguation?

Garrett Honeycutt

unread,
Jun 4, 2014, 3:11:14 PM6/4/14
to puppet...@googlegroups.com
Hi Brian,

Using ::class is not needed and should not be done. If you still want to
do that in your class, try changing the spec by dropping the preceding
double colons.

Best regards,
-g

--
Garrett Honeycutt
@learnpuppet
Puppet Training with LearnPuppet.com
Mobile: +1.206.414.8658

Brian Wilkins

unread,
Jun 4, 2014, 3:13:35 PM6/4/14
to puppet...@googlegroups.com
I think you missed the part where it is complaining about line 10 in my profiles::logstash::install module

class { '::logstash':

Removing ::logstash from the spec file has the same complaint.

Brian

Garrett Honeycutt

unread,
Jun 4, 2014, 3:52:01 PM6/4/14
to puppet...@googlegroups.com
Hi Brian,

Recommend dropping the preceding double colons all around. It is not
needed at all.

Br,

Brian Wilkins

unread,
Jun 4, 2014, 3:56:40 PM6/4/14
to puppet...@googlegroups.com
It is needed to disambiguate from profiles::logstash and just logstash classes. If I remove it, then it will complain that logstash is already loaded when it tries to load profiles::logstash.

Johan De Wit

unread,
Jun 4, 2014, 5:05:05 PM6/4/14
to puppet...@googlegroups.com
Hi,

the scoping of the class is indeed needed, but i believe that is a parser issue.

I did the test wit class { '::vim': version => '7.4' }

on my master with puppet master --compile <certname> i got following :

{
  "metadata": {
    "api_version": 1
  },
  "data": {
    "classes": [
      "settings",

     <snip>

     "vim",

    <snip>

And that is what you should check in your rspec file. 

In your manifests, you need indeed the scoping, in your spec, you don't

hth

jo  
--
You received this message because you are subscribed to the Google Groups "Puppet Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to puppet-users...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/puppet-users/141ee867-2464-4187-9e55-5aab364c1700%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.


-- 
Johan De Wit

Open Source Consultant

Red Hat Certified Engineer              (805008667232363)
Puppet Certified Professional 2013/2014 (PCP0000006)
_________________________________________________________
 
Open-Future                 Phone     +32 (0)2/255 70 70
Zavelstraat 72              Fax       +32 (0)2/255 70 71
3071 KORTENBERG             Mobile    +32 (0)474/42 40 73
BELGIUM                     http://www.open-future.be
_________________________________________________________
 

Upcoming Events:

Puppet Advanced Training | https://www.open-future.be/puppet-advanced-training-10-till-12th-june

Puppet Introduction Course | https://www.open-future.be/puppet-introduction-course-13th-june

Linux Training | https://www.open-future.be/linux-training-16-till-20th-june

Subscribe to our newsletter: http://eepurl.com/BUG8H


Brian Wilkins

unread,
Jun 4, 2014, 8:13:48 PM6/4/14
to puppet...@googlegroups.com
Thanks Johan. It turns out that I had to set my path's explicitly in my spec_helper.rb. For some reason, the automatically created spec_helper.rb created by rspec-puppet-init did not create a usuable file. My tests are running successfully now.

Brian

Wolf Noble

unread,
Jun 5, 2014, 2:41:56 AM6/5/14
to puppet...@googlegroups.com
Hi Brian,

I've found having my spec test print out a catalog is a good way to build out a suite of tests


context 'when the do_stuff param has the value of hell_yeah' do
  let (:facts) {{'osfamily' => 'RainbowOS }}
  let (:params) {{'do_stuff' => 'hell_yeah'}}
  It 'print a catalog for spec building' do
   p subject.resources
  end
end
context 'when the do_stuff param has the value of nope' do
  let (:facts) {{'osfamily' => 'RainbowOS }}
  let (:params) {{'do_stuff' => 'nope'}}
  It 'print a catalog for spec building' do
   p subject.resources
  end
end

Then I do some simple formatting on the subsequently generated catalogs in sublime text and review all the resources. With just a few tweaks it's pretty easy to grab the resources you actually care about from the catalog as rspec sees it.


HTH
-W
Sent from my iPad
--
You received this message because you are subscribed to the Google Groups "Puppet Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to puppet-users...@googlegroups.com.

Felix Frank

unread,
Jun 5, 2014, 5:57:02 AM6/5/14
to puppet...@googlegroups.com
On 06/04/2014 11:04 PM, Johan De Wit wrote:
>
> And that is what you should check in your rspec file.
>
> In your manifests, you need indeed the scoping, in your spec, you don't

Humm, unfortunate.

Doesn't that (in theory) open you up for regressions in the form of
"does no longer include the properly scoped class, gets resolved to the
wrong class" like Brian described?

Johan De Wit

unread,
Jun 5, 2014, 7:16:46 AM6/5/14
to puppet...@googlegroups.com
this is something to be tested I believe ...

TBC


--
Johan De Wit

Open Source Consultant

Red Hat Certified Engineer (805008667232363)
Puppet Certified Professional 2013/2014 (PCP0000006)
_________________________________________________________

Open-Future Phone +32 (0)2/255 70 70
Zavelstraat 72 Fax +32 (0)2/255 70 71
3071 KORTENBERG Mobile +32 (0)474/42 40 73
BELGIUM http://www.open-future.be
_________________________________________________________


Next Events:
Reply all
Reply to author
Forward
0 new messages