SlideShare ist ein Scribd-Unternehmen logo
1 von 35
Automated Puppet Testing
      “All code is guilty, until proven
         innocent.” – Anonymous


Scott Nottingham                  July 23rd, 2012
Before and After Testing
• Before Testing
  – Unit tests
     • Cucumber-puppet
     • Rspec-puppet
• After Testing
  – User Space tests
     • Did everything that was supposed to get done actually
       get done?
Unit Tests - frameworks
• Cucumber-puppet
  – Tests the outcome of the entire module as
    opposed to just the manifests
  – Overly complicated by trying to be simple (imho)


• Rspec-puppet
  – Unit tests for the manifests
  – Truly simple (and effective)
RSpec-puppet
• Written by Tim Sharpe (rodjek)
• Available on github
  – https://github.com/rodjek/rspec-puppet/
RSpec-puppet
• PROs
  – Simple language and structure
  – Easy to maintain
  – Fast to execute
  – Execution easily automated

• CONs
  – Only tests what you tell it to
     • Easy to make changes to manifests and forget to update
       RSpec tests
Writing RSpec Tests
•   Directory Tree
     module
      |
      +-- manifests
      |
      +-- files
      |
      +-- templates
      |
      +-- lib
      |
      +-- spec
         |
         +-- spec_helper.rb
         |
         +-- classes
              |
              +-- <class_name>_spec.rb
Writing RSpec Tests
• spec_helper file
  – Required for RSpec to know where to find the module
    path
  – Resides within: <module_name>/spec/spec_helper.rb
  – contents:
        require 'puppet'
        require 'rubygems'
        require 'rspec-puppet'

        RSpec.configure do |c|
         c.module_path = File.join(File.dirname(__FILE__), '../../')
         c.manifest = '../../../../manifests/site.pp'
        end
Writing RSpec Tests
• Spec file
  – Contains test logic
  – Naming convention:
     • <classname>_<pp_filename>_spec.rb
     • Ex. nagios_init_spec.rb
  – Contents
     • Requires
        – require ‘spec_helper’
     • Tests
Writing RSpec Tests
• Defining Tests
  – Tests are created using the ‘describe’ method.
  – The first test must describe the class defined in
    your manifest.

        describe ‘nagios’ do
          …
          …
        end
Writing RSpec Tests
• Accounting for class dependencies
  – Some modules define class dependencies
  – Example:
     • Class*‘yum’+ -> Class*‘nagios’+
  – These are handled in RSpec test with
    ‘:pre_condition’

        let(:pre_condition) , 'class ,”yum":-' -
Writing RSpec Tests
• Setting parameters used by puppet manifests
  – Optional unless manifest needs them to compile
  – Handled with ‘:params’
  – Example (nested parameters):
  let(:params) { {:key1 => 'value1', :key2 => 'value2', :key3 => {'keyA' =>
  'valA'}, :key4 => {'keyB' => {'keyX' => 'valX'} } } }
Writing RSpec Tests
• Setting a node name for the tests (optional)
  – Might use if your manifests has node name
    dependent logic

     let(:node) { host.example.com }
Writing RSpec Tests
• Setting custom fact values
  – Probably the most commonly used
  – Example:

     let(:facts) { {:fact1 => 'val1', :fact2 => 'val2'} }
Writing RSpec Tests
• Sub-tests
  – These are the tests for each condition that you want
    to test for a given manifest.
  describe 'nagios' do
   describe 'with valid parameters passed' do
     ....
   end

   describe 'with invalid parameters passed' do
     ....
   end
  end
Writing RSpec Tests
• Testing the resources
• Generally speaking, the tests you will be writing will be to confirm that the
  class contains some set of resources. This is done with the
  ‘contain_<resource_type>’
• Each resource will generally have attributes that you will want to test are
  present. This is done with the ‘.with_<attribute>(‘value’)’ method.
• Example:

    it { should contain_file('foo').with_ensure('present').with_owner('root').with_group('root') }
Writing RSpec Tests
• Cascading .with_ methods can get ugly!
• Cascading should only be used for resources with 1 or 2
  attributes defined.
• Alternatively, you can use block notation for resources with
  many attributes

   it do should contain_file('/var/spool/squid/cache').with(
        'require' => 'Package[squid]',
        'ensure' => 'directory',
        'owner' => 'squid',
        'group' => 'squid'
   ) end
Writing RSpec Tests
• Sometimes multiple values are assigned to a
  single attribute
• These are handled like so:
  it do should contain_mount('/var/spool/squid/cache').with(
     'require' => ['Logical_volume[lv_cache]', 'Package[xfsprogs]' ],
     ....
     ....
  ) end
Writing RSpec Tests
• Templates
   – If your file content is generated by a template, rspec can test for this
     too. Here’s how:
       • Test that a template generates any content
       it 'should generate valid content for squid.conf' do
             content = catalogue.resource('file', '/etc/squid/squid.conf').send(:paramters)[:content]
             content.should_not be_empty
       End


       • Test that a template generates specific content
       it 'should generate valid content for squid.conf' do
             content = catalogue.resource('file', '/etc/squid/squid.conf').send(:paramters)[:content]
             content.should match('some_string')
       end
Writing RSpec Tests
• Test for an expected error
• Sometimes, you want to test that an error is
  raised.
  – For example, if not passing a parameter when one
    is needed, or passing an invalid parameter.
  – Example test
     it { expect { should contain_class('nagios::server') }.to raise_error(Puppet::Error) }
require 'spec_helper'

describe 'sendmail' do
  let(:params) { {:mail_server => 'foobarbaz'} }

  it { should contain_package('sendmail').with_ensure('installed') }

  it do should contain_file('/etc/mail/sendmail.cf').with(
     'require' => 'Package[sendmail]',
     'notify' => 'Exec[makemap]'
  ) end

  it 'should generate /etc/mail/sendmail.cf from a template' do
      content = catalogue.resource('file', '/etc/mail/sendmail.cf').send(:parameters)[:content]
      content.should match('foobarbaz')
  end

  it 'should generate /etc/mail/submit.cf from a template' do
      content = catalogue.resource('file', '/etc/mail/submit.cf').send(:parameters)[:content]
      content.should match('foobarbaz')
  end

  it do should contain_file('/etc/mail/submit.cf').with(
     'require' => 'Package[sendmail]',
     'notify' => 'Exec[makemap]'
  ) end

  it { should contain_file('/etc/sysconfig/sendmail').with_source('puppet:///sendmail/sendmail') }

  it do should contain_service('sendmail').with(
     'require' => 'Package[sendmail]',
     'enable' => 'true',
     'ensure' => 'running'
  ) end
end
Running RSpec Tests
• rspec –color –format documentation
  /etc/puppet/modules/sendmail/spec/classes/sendmail_init_spec.rb


    sendmail
         should contain Package[sendmail] with ensure => "installed"
         should contain File[/etc/mail/sendmail.cf] with notify => "Exec[makemap]" and require =>
        "Package[sendmail]"
         should generate /etc/mail/sendmail.cf from a template
         should generate /etc/mail/submit.cf from a template
         should contain File[/etc/mail/submit.cf] with notify => "Exec[makemap]" and require =>
        "Package[sendmail]"
         should contain File[/etc/sysconfig/sendmail] with source => "puppet:///sendmail/sendmail"
         should contain Service[sendmail] with enable => "true", ensure => "running" and require =>
        "Package[sendmail]"
   Finished in 1.98 seconds
   7 examples, 0 failures
Running RSpec Tests
• Oops! Someone put a comma where they meant to put a semi-colon!

Sendmail
Failures:

 1) sendmail
   Failure/Error: it { should contain_package('sendmail').with_ensure('installed') }
   Puppet::Error:
    Syntax error at '/etc/sysconfig/sendmail'; expected '}' at
/etc/puppetmaster/modules/sendmail/spec/../../sendmail/manifests/init.pp:19 on node neodymium.trading.imc.intra
   # ./sendmail_init_spec.rb:6

 2) sendmail
   Failure/Error: it { should contain_package('sendmail').with_ensure('installed') }
   Puppet::Error:
    Syntax error at '/etc/sysconfig/sendmail'; expected '}' at
/etc/puppetmaster/modules/sendmail/spec/../../sendmail/manifests/init.pp:19 on node neodymium.trading.imc.intra
   # ./sendmail_init_spec.rb:6

Finished in 0.19808 seconds
2 examples, 2 failures
Automating RSpec Tests
• Tests can be run by anything capable of executing a
  system command
• We integrate ours into Team City
   – Much like Jenkins
   – Allows for event driven execution of tests
• Any time a commit occurs in version control, tests
  are executed
   – If tests pass, manifests are wrapped inside an RPM and
     pushed to puppet masters
   – If tests fail, we are notified
Automating RSpec Tests
• RSpec tests do a great job of making sure manifests
  are syntactically correct and, generally speaking,
  function as expected.
• But….Things aren’t
  always as they seem!
‘After’ Tests
• To ensure our environment really is clean we
  must test in user space land.
• Probably many solutions out there
  – We wrote our own
User Space Testing
• Post Provision Checks (PPC) is a framework for
  testing stuff in user space.
  – Originally written as health checks for testing a
    machine immediately after provisioning it and as
    verification testing after maintenance.
  – Quickly grew to an extensible framework capable of
    integrating with Nagios/Icinga and Teamcity, or
    running as stand alone application.
  – Contains libraries of functions for commonly used
    tasks.
  – Easily customize runtime options with profiles
  – Can be extended with plugins
PPC functionality
puppet_ust plugin
• The puppet user space tests plugin was
  written to extend the framework for
  specifically testing puppet applied
  configurations.
  – Auto detects the puppet classes that are applied
    to a given box
  – Determines the parameters defined for the host
    being tested and utilizes them within tests.
     • Also uses facter facts in the same manner
That’s great, but puppet reports will tell you
what worked and what didn’t…
misses
• You wouldn’t believe the things we have seen go wrong
  with applying configurations (that the puppet logs/reports
  didn’t indicate).
   – PPC tests can be written to catch all of these!
       • Mistakes only happen once
       • Winning!
   – A few examples
       • Version of package specified not what got installed – not puppet’s
         fault, but still a problem.
       • Package got installed, but some key files were zero length
       • Drivers upgraded, but not properly loaded
       • Machines joined to wrong domain
       • Services running (per status) but not functioning properly
       • Yum repos configured but not functioning
       • Sysctl settings still not loaded after sysctl –p
PPC sample output
• Stand Alone mode
PPC Sample Output
• Team City Mode
Automating PPC Tests
• Team City + multiplexed SSH (for parallelization)
• Each version control commit results in a puppet
  run + user space test run in our dev and qa
  environments.
• Over 20,000 tests performed in ~20 minutes
   – This means every 20 minutes new, fully tested
     changes are pushed from the development
     environment to QA
   – Each stage of the pipeline is tested in a similar fashion
Puppet camp chicago-automated_testing2

Weitere ähnliche Inhalte

Was ist angesagt?

Was ist angesagt? (20)

Puppet: From 0 to 100 in 30 minutes
Puppet: From 0 to 100 in 30 minutesPuppet: From 0 to 100 in 30 minutes
Puppet: From 0 to 100 in 30 minutes
 
Puppet modules for Fun and Profit
Puppet modules for Fun and ProfitPuppet modules for Fun and Profit
Puppet modules for Fun and Profit
 
Unit Testing Lots of Perl
Unit Testing Lots of PerlUnit Testing Lots of Perl
Unit Testing Lots of Perl
 
Memory Manglement in Raku
Memory Manglement in RakuMemory Manglement in Raku
Memory Manglement in Raku
 
Puppet @ Seat
Puppet @ SeatPuppet @ Seat
Puppet @ Seat
 
Test-Driven Puppet Development - PuppetConf 2014
Test-Driven Puppet Development - PuppetConf 2014Test-Driven Puppet Development - PuppetConf 2014
Test-Driven Puppet Development - PuppetConf 2014
 
Puppet loves RSpec, why you should, too
Puppet loves RSpec, why you should, tooPuppet loves RSpec, why you should, too
Puppet loves RSpec, why you should, too
 
BSDM with BASH: Command Interpolation
BSDM with BASH: Command InterpolationBSDM with BASH: Command Interpolation
BSDM with BASH: Command Interpolation
 
Orchestrated Functional Testing with Puppet-spec and Mspectator
Orchestrated Functional Testing with Puppet-spec and MspectatorOrchestrated Functional Testing with Puppet-spec and Mspectator
Orchestrated Functional Testing with Puppet-spec and Mspectator
 
Test-Driven Infrastructure with Ansible, Test Kitchen, Serverspec and RSpec
Test-Driven Infrastructure with Ansible, Test Kitchen, Serverspec and RSpecTest-Driven Infrastructure with Ansible, Test Kitchen, Serverspec and RSpec
Test-Driven Infrastructure with Ansible, Test Kitchen, Serverspec and RSpec
 
Puppet modules: An Holistic Approach
Puppet modules: An Holistic ApproachPuppet modules: An Holistic Approach
Puppet modules: An Holistic Approach
 
Puppi. Puppet strings to the shell
Puppi. Puppet strings to the shellPuppi. Puppet strings to the shell
Puppi. Puppet strings to the shell
 
Test Driven Development with Puppet - PuppetConf 2014
Test Driven Development with Puppet - PuppetConf 2014Test Driven Development with Puppet - PuppetConf 2014
Test Driven Development with Puppet - PuppetConf 2014
 
Puppet meetup testing
Puppet meetup testingPuppet meetup testing
Puppet meetup testing
 
Workshop quality assurance for php projects - phpbelfast
Workshop quality assurance for php projects - phpbelfastWorkshop quality assurance for php projects - phpbelfast
Workshop quality assurance for php projects - phpbelfast
 
Can you upgrade to Puppet 4.x? (Beginner) Can you upgrade to Puppet 4.x? (Beg...
Can you upgrade to Puppet 4.x? (Beginner) Can you upgrade to Puppet 4.x? (Beg...Can you upgrade to Puppet 4.x? (Beginner) Can you upgrade to Puppet 4.x? (Beg...
Can you upgrade to Puppet 4.x? (Beginner) Can you upgrade to Puppet 4.x? (Beg...
 
Puppet for dummies - ZendCon 2011 Edition
Puppet for dummies - ZendCon 2011 EditionPuppet for dummies - ZendCon 2011 Edition
Puppet for dummies - ZendCon 2011 Edition
 
Puppet Camp Chicago 2014: Smoothing Troubles With Custom Types and Providers ...
Puppet Camp Chicago 2014: Smoothing Troubles With Custom Types and Providers ...Puppet Camp Chicago 2014: Smoothing Troubles With Custom Types and Providers ...
Puppet Camp Chicago 2014: Smoothing Troubles With Custom Types and Providers ...
 
Power of Puppet 4
Power of Puppet 4Power of Puppet 4
Power of Puppet 4
 
Oliver hookins puppetcamp2011
Oliver hookins puppetcamp2011Oliver hookins puppetcamp2011
Oliver hookins puppetcamp2011
 

Andere mochten auch

August 2016 HUG: Open Source Big Data Ingest with StreamSets Data Collector
August 2016 HUG: Open Source Big Data Ingest with StreamSets Data Collector August 2016 HUG: Open Source Big Data Ingest with StreamSets Data Collector
August 2016 HUG: Open Source Big Data Ingest with StreamSets Data Collector
Yahoo Developer Network
 
August 2016 HUG: Better together: Fast Data with Apache Spark™ and Apache Ign...
August 2016 HUG: Better together: Fast Data with Apache Spark™ and Apache Ign...August 2016 HUG: Better together: Fast Data with Apache Spark™ and Apache Ign...
August 2016 HUG: Better together: Fast Data with Apache Spark™ and Apache Ign...
Yahoo Developer Network
 

Andere mochten auch (6)

Puppet at Google
Puppet at GooglePuppet at Google
Puppet at Google
 
August 2016 HUG: Open Source Big Data Ingest with StreamSets Data Collector
August 2016 HUG: Open Source Big Data Ingest with StreamSets Data Collector August 2016 HUG: Open Source Big Data Ingest with StreamSets Data Collector
August 2016 HUG: Open Source Big Data Ingest with StreamSets Data Collector
 
August 2016 HUG: Better together: Fast Data with Apache Spark™ and Apache Ign...
August 2016 HUG: Better together: Fast Data with Apache Spark™ and Apache Ign...August 2016 HUG: Better together: Fast Data with Apache Spark™ and Apache Ign...
August 2016 HUG: Better together: Fast Data with Apache Spark™ and Apache Ign...
 
August 2016 HUG: Recent development in Apache Oozie
August 2016 HUG: Recent development in Apache OozieAugust 2016 HUG: Recent development in Apache Oozie
August 2016 HUG: Recent development in Apache Oozie
 
Reuters: Pictures of the Year 2016 (Part 2)
Reuters: Pictures of the Year 2016 (Part 2)Reuters: Pictures of the Year 2016 (Part 2)
Reuters: Pictures of the Year 2016 (Part 2)
 
The impact of innovation on travel and tourism industries (World Travel Marke...
The impact of innovation on travel and tourism industries (World Travel Marke...The impact of innovation on travel and tourism industries (World Travel Marke...
The impact of innovation on travel and tourism industries (World Travel Marke...
 

Ähnlich wie Puppet camp chicago-automated_testing2

modern module development - Ken Barber 2012 Edinburgh Puppet Camp
modern module development - Ken Barber 2012 Edinburgh Puppet Campmodern module development - Ken Barber 2012 Edinburgh Puppet Camp
modern module development - Ken Barber 2012 Edinburgh Puppet Camp
Puppet
 
20140406 loa days-tdd-with_puppet_tutorial
20140406 loa days-tdd-with_puppet_tutorial20140406 loa days-tdd-with_puppet_tutorial
20140406 loa days-tdd-with_puppet_tutorial
garrett honeycutt
 
20090514 Introducing Puppet To Sasag
20090514 Introducing Puppet To Sasag20090514 Introducing Puppet To Sasag
20090514 Introducing Puppet To Sasag
garrett honeycutt
 
Testing NodeJS with Mocha, Should, Sinon, and JSCoverage
Testing NodeJS with Mocha, Should, Sinon, and JSCoverageTesting NodeJS with Mocha, Should, Sinon, and JSCoverage
Testing NodeJS with Mocha, Should, Sinon, and JSCoverage
mlilley
 

Ähnlich wie Puppet camp chicago-automated_testing2 (20)

modern module development - Ken Barber 2012 Edinburgh Puppet Camp
modern module development - Ken Barber 2012 Edinburgh Puppet Campmodern module development - Ken Barber 2012 Edinburgh Puppet Camp
modern module development - Ken Barber 2012 Edinburgh Puppet Camp
 
Learning Puppet basic thing
Learning Puppet basic thing Learning Puppet basic thing
Learning Puppet basic thing
 
Puppet
PuppetPuppet
Puppet
 
Puppet Camp Paris 2014: Test Driven Development
Puppet Camp Paris 2014: Test Driven DevelopmentPuppet Camp Paris 2014: Test Driven Development
Puppet Camp Paris 2014: Test Driven Development
 
20140408 tdd puppetcamp-paris
20140408 tdd puppetcamp-paris20140408 tdd puppetcamp-paris
20140408 tdd puppetcamp-paris
 
Unit testing presentation
Unit testing presentationUnit testing presentation
Unit testing presentation
 
Testing for Ops: Going Beyond the Manifest - PuppetConf 2013
Testing for Ops: Going Beyond the Manifest - PuppetConf 2013Testing for Ops: Going Beyond the Manifest - PuppetConf 2013
Testing for Ops: Going Beyond the Manifest - PuppetConf 2013
 
Orchestrated Functional Testing with Puppet-spec and Mspectator - PuppetConf ...
Orchestrated Functional Testing with Puppet-spec and Mspectator - PuppetConf ...Orchestrated Functional Testing with Puppet-spec and Mspectator - PuppetConf ...
Orchestrated Functional Testing with Puppet-spec and Mspectator - PuppetConf ...
 
20140406 loa days-tdd-with_puppet_tutorial
20140406 loa days-tdd-with_puppet_tutorial20140406 loa days-tdd-with_puppet_tutorial
20140406 loa days-tdd-with_puppet_tutorial
 
Introduction to InSpec and 1.0 release update
Introduction to InSpec and 1.0 release updateIntroduction to InSpec and 1.0 release update
Introduction to InSpec and 1.0 release update
 
Writing and Publishing Puppet Modules - PuppetConf 2014
Writing and Publishing Puppet Modules - PuppetConf 2014Writing and Publishing Puppet Modules - PuppetConf 2014
Writing and Publishing Puppet Modules - PuppetConf 2014
 
Quick tour to front end unit testing using jasmine
Quick tour to front end unit testing using jasmineQuick tour to front end unit testing using jasmine
Quick tour to front end unit testing using jasmine
 
20090514 Introducing Puppet To Sasag
20090514 Introducing Puppet To Sasag20090514 Introducing Puppet To Sasag
20090514 Introducing Puppet To Sasag
 
BuildStuff.LT 2018 InSpec Workshop
BuildStuff.LT 2018 InSpec WorkshopBuildStuff.LT 2018 InSpec Workshop
BuildStuff.LT 2018 InSpec Workshop
 
DevOpsDays InSpec Workshop
DevOpsDays InSpec WorkshopDevOpsDays InSpec Workshop
DevOpsDays InSpec Workshop
 
Logstash
LogstashLogstash
Logstash
 
Model-Driven Testing For Agile Teams
Model-Driven Testing For Agile TeamsModel-Driven Testing For Agile Teams
Model-Driven Testing For Agile Teams
 
Testing NodeJS with Mocha, Should, Sinon, and JSCoverage
Testing NodeJS with Mocha, Should, Sinon, and JSCoverageTesting NodeJS with Mocha, Should, Sinon, and JSCoverage
Testing NodeJS with Mocha, Should, Sinon, and JSCoverage
 
Stanford Hackathon - Puppet Modules
Stanford Hackathon - Puppet ModulesStanford Hackathon - Puppet Modules
Stanford Hackathon - Puppet Modules
 
Supercharging WordPress Development in 2018
Supercharging WordPress Development in 2018Supercharging WordPress Development in 2018
Supercharging WordPress Development in 2018
 

KĂźrzlich hochgeladen

+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎️+971_581248768%)**%*]'#abortion pills for sale in dubai@
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Victor Rentea
 

KĂźrzlich hochgeladen (20)

DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with Milvus
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
 
Cyberprint. Dark Pink Apt Group [EN].pdf
Cyberprint. Dark Pink Apt Group [EN].pdfCyberprint. Dark Pink Apt Group [EN].pdf
Cyberprint. Dark Pink Apt Group [EN].pdf
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
 
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfRising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 

Puppet camp chicago-automated_testing2

  • 1. Automated Puppet Testing “All code is guilty, until proven innocent.” – Anonymous Scott Nottingham July 23rd, 2012
  • 2. Before and After Testing • Before Testing – Unit tests • Cucumber-puppet • Rspec-puppet • After Testing – User Space tests • Did everything that was supposed to get done actually get done?
  • 3. Unit Tests - frameworks • Cucumber-puppet – Tests the outcome of the entire module as opposed to just the manifests – Overly complicated by trying to be simple (imho) • Rspec-puppet – Unit tests for the manifests – Truly simple (and effective)
  • 4. RSpec-puppet • Written by Tim Sharpe (rodjek) • Available on github – https://github.com/rodjek/rspec-puppet/
  • 5. RSpec-puppet • PROs – Simple language and structure – Easy to maintain – Fast to execute – Execution easily automated • CONs – Only tests what you tell it to • Easy to make changes to manifests and forget to update RSpec tests
  • 6. Writing RSpec Tests • Directory Tree module | +-- manifests | +-- files | +-- templates | +-- lib | +-- spec | +-- spec_helper.rb | +-- classes | +-- <class_name>_spec.rb
  • 7. Writing RSpec Tests • spec_helper file – Required for RSpec to know where to find the module path – Resides within: <module_name>/spec/spec_helper.rb – contents: require 'puppet' require 'rubygems' require 'rspec-puppet' RSpec.configure do |c| c.module_path = File.join(File.dirname(__FILE__), '../../') c.manifest = '../../../../manifests/site.pp' end
  • 8. Writing RSpec Tests • Spec file – Contains test logic – Naming convention: • <classname>_<pp_filename>_spec.rb • Ex. nagios_init_spec.rb – Contents • Requires – require ‘spec_helper’ • Tests
  • 9. Writing RSpec Tests • Defining Tests – Tests are created using the ‘describe’ method. – The first test must describe the class defined in your manifest. describe ‘nagios’ do … … end
  • 10. Writing RSpec Tests • Accounting for class dependencies – Some modules define class dependencies – Example: • Class*‘yum’+ -> Class*‘nagios’+ – These are handled in RSpec test with ‘:pre_condition’ let(:pre_condition) , 'class ,”yum":-' -
  • 11. Writing RSpec Tests • Setting parameters used by puppet manifests – Optional unless manifest needs them to compile – Handled with ‘:params’ – Example (nested parameters): let(:params) { {:key1 => 'value1', :key2 => 'value2', :key3 => {'keyA' => 'valA'}, :key4 => {'keyB' => {'keyX' => 'valX'} } } }
  • 12. Writing RSpec Tests • Setting a node name for the tests (optional) – Might use if your manifests has node name dependent logic let(:node) { host.example.com }
  • 13. Writing RSpec Tests • Setting custom fact values – Probably the most commonly used – Example: let(:facts) { {:fact1 => 'val1', :fact2 => 'val2'} }
  • 14. Writing RSpec Tests • Sub-tests – These are the tests for each condition that you want to test for a given manifest. describe 'nagios' do describe 'with valid parameters passed' do .... end describe 'with invalid parameters passed' do .... end end
  • 15. Writing RSpec Tests • Testing the resources • Generally speaking, the tests you will be writing will be to confirm that the class contains some set of resources. This is done with the ‘contain_<resource_type>’ • Each resource will generally have attributes that you will want to test are present. This is done with the ‘.with_<attribute>(‘value’)’ method. • Example: it { should contain_file('foo').with_ensure('present').with_owner('root').with_group('root') }
  • 16. Writing RSpec Tests • Cascading .with_ methods can get ugly! • Cascading should only be used for resources with 1 or 2 attributes defined. • Alternatively, you can use block notation for resources with many attributes it do should contain_file('/var/spool/squid/cache').with( 'require' => 'Package[squid]', 'ensure' => 'directory', 'owner' => 'squid', 'group' => 'squid' ) end
  • 17. Writing RSpec Tests • Sometimes multiple values are assigned to a single attribute • These are handled like so: it do should contain_mount('/var/spool/squid/cache').with( 'require' => ['Logical_volume[lv_cache]', 'Package[xfsprogs]' ], .... .... ) end
  • 18. Writing RSpec Tests • Templates – If your file content is generated by a template, rspec can test for this too. Here’s how: • Test that a template generates any content it 'should generate valid content for squid.conf' do content = catalogue.resource('file', '/etc/squid/squid.conf').send(:paramters)[:content] content.should_not be_empty End • Test that a template generates specific content it 'should generate valid content for squid.conf' do content = catalogue.resource('file', '/etc/squid/squid.conf').send(:paramters)[:content] content.should match('some_string') end
  • 19. Writing RSpec Tests • Test for an expected error • Sometimes, you want to test that an error is raised. – For example, if not passing a parameter when one is needed, or passing an invalid parameter. – Example test it { expect { should contain_class('nagios::server') }.to raise_error(Puppet::Error) }
  • 20. require 'spec_helper' describe 'sendmail' do let(:params) { {:mail_server => 'foobarbaz'} } it { should contain_package('sendmail').with_ensure('installed') } it do should contain_file('/etc/mail/sendmail.cf').with( 'require' => 'Package[sendmail]', 'notify' => 'Exec[makemap]' ) end it 'should generate /etc/mail/sendmail.cf from a template' do content = catalogue.resource('file', '/etc/mail/sendmail.cf').send(:parameters)[:content] content.should match('foobarbaz') end it 'should generate /etc/mail/submit.cf from a template' do content = catalogue.resource('file', '/etc/mail/submit.cf').send(:parameters)[:content] content.should match('foobarbaz') end it do should contain_file('/etc/mail/submit.cf').with( 'require' => 'Package[sendmail]', 'notify' => 'Exec[makemap]' ) end it { should contain_file('/etc/sysconfig/sendmail').with_source('puppet:///sendmail/sendmail') } it do should contain_service('sendmail').with( 'require' => 'Package[sendmail]', 'enable' => 'true', 'ensure' => 'running' ) end end
  • 21. Running RSpec Tests • rspec –color –format documentation /etc/puppet/modules/sendmail/spec/classes/sendmail_init_spec.rb sendmail should contain Package[sendmail] with ensure => "installed" should contain File[/etc/mail/sendmail.cf] with notify => "Exec[makemap]" and require => "Package[sendmail]" should generate /etc/mail/sendmail.cf from a template should generate /etc/mail/submit.cf from a template should contain File[/etc/mail/submit.cf] with notify => "Exec[makemap]" and require => "Package[sendmail]" should contain File[/etc/sysconfig/sendmail] with source => "puppet:///sendmail/sendmail" should contain Service[sendmail] with enable => "true", ensure => "running" and require => "Package[sendmail]" Finished in 1.98 seconds 7 examples, 0 failures
  • 22. Running RSpec Tests • Oops! Someone put a comma where they meant to put a semi-colon! Sendmail Failures: 1) sendmail Failure/Error: it { should contain_package('sendmail').with_ensure('installed') } Puppet::Error: Syntax error at '/etc/sysconfig/sendmail'; expected '}' at /etc/puppetmaster/modules/sendmail/spec/../../sendmail/manifests/init.pp:19 on node neodymium.trading.imc.intra # ./sendmail_init_spec.rb:6 2) sendmail Failure/Error: it { should contain_package('sendmail').with_ensure('installed') } Puppet::Error: Syntax error at '/etc/sysconfig/sendmail'; expected '}' at /etc/puppetmaster/modules/sendmail/spec/../../sendmail/manifests/init.pp:19 on node neodymium.trading.imc.intra # ./sendmail_init_spec.rb:6 Finished in 0.19808 seconds 2 examples, 2 failures
  • 23. Automating RSpec Tests • Tests can be run by anything capable of executing a system command • We integrate ours into Team City – Much like Jenkins – Allows for event driven execution of tests • Any time a commit occurs in version control, tests are executed – If tests pass, manifests are wrapped inside an RPM and pushed to puppet masters – If tests fail, we are notified
  • 24. Automating RSpec Tests • RSpec tests do a great job of making sure manifests are syntactically correct and, generally speaking, function as expected. • But….Things aren’t always as they seem!
  • 25. ‘After’ Tests • To ensure our environment really is clean we must test in user space land. • Probably many solutions out there – We wrote our own
  • 26.
  • 27. User Space Testing • Post Provision Checks (PPC) is a framework for testing stuff in user space. – Originally written as health checks for testing a machine immediately after provisioning it and as verification testing after maintenance. – Quickly grew to an extensible framework capable of integrating with Nagios/Icinga and Teamcity, or running as stand alone application. – Contains libraries of functions for commonly used tasks. – Easily customize runtime options with profiles – Can be extended with plugins
  • 29. puppet_ust plugin • The puppet user space tests plugin was written to extend the framework for specifically testing puppet applied configurations. – Auto detects the puppet classes that are applied to a given box – Determines the parameters defined for the host being tested and utilizes them within tests. • Also uses facter facts in the same manner
  • 30. That’s great, but puppet reports will tell you what worked and what didn’t…
  • 31. misses • You wouldn’t believe the things we have seen go wrong with applying configurations (that the puppet logs/reports didn’t indicate). – PPC tests can be written to catch all of these! • Mistakes only happen once • Winning! – A few examples • Version of package specified not what got installed – not puppet’s fault, but still a problem. • Package got installed, but some key files were zero length • Drivers upgraded, but not properly loaded • Machines joined to wrong domain • Services running (per status) but not functioning properly • Yum repos configured but not functioning • Sysctl settings still not loaded after sysctl –p
  • 32. PPC sample output • Stand Alone mode
  • 33. PPC Sample Output • Team City Mode
  • 34. Automating PPC Tests • Team City + multiplexed SSH (for parallelization) • Each version control commit results in a puppet run + user space test run in our dev and qa environments. • Over 20,000 tests performed in ~20 minutes – This means every 20 minutes new, fully tested changes are pushed from the development environment to QA – Each stage of the pipeline is tested in a similar fashion