Vagrant + Rouster
at salesforce.com
Conor Horan-Kates
Senior Member of the Technical Staff,
Quality Engineering
@chorankates
/usr/bin/whoami
•  most recently as a tester in quality
assurance for a Windows based antimalware solution
•  started as a traditional quality engineer in a
Data Center Automation group, moved towards
developer and systems engineer, riding the DevOps
wave
Rouster
basic instantiation
require	
  'rouster'	
  
	
  
#	
  the	
  value	
  for	
  the	
  'name'	
  attribute	
  should	
  be	
  a	
  name	
  in	
  `vagrant	
  status`	
  
app	
  =	
  Rouster.new(:name	
  =>	
  'app')	
  
	
  
#	
  equivalent	
  to	
  `vagrant	
  up	
  app`	
  
app.up()	
  
	
  
#	
  STD(OUT|ERR)	
  of	
  this	
  is	
  available	
  in	
  app.get_output()	
  
app.run('cat	
  /etc/hosts')	
  
app.put('new-­‐foo',	
  '/tmp/foo')	
  
app.get('/tmp/foo')	
  
	
  
app.destroy()	
  
http://tipmra.com/new_tipmra/new_cop_pic/old_cop_time_1a.gif
Where did we start?
•  Team composition
•  6 engineers – 3 system engineers, 2 QE and 1 developer
•  Very little Ruby experience, mostly Perl and Shell
•  Education
•  Pro Puppet, Puppet 2.7 Cookbook, Puppet Types and Providers
•  Puppet Intro and Puppet Developers (now Advanced) classes
from PuppetLabs
•  Tools
•  RSpec, rspec-puppet
•  puppet-lint
Where have we been?
•  get out of perforce and into git
•  local git-commit hooks
•  puppet-lint
•  RSpec, rspec-puppet
•  Vagrantfile: 39 lines
•  piab -> ‘Puppet in a box’
•  Supports base images for roles in SFDC stack
Where are we now?
•  Jenkins – relatively small installation
•  RSpec, rspec-puppet – for catalog validation of
manifests, some unit testing
•  test-unit – for unit tests of custom functions
•  Test::More – for unit/functional tests of ENC
•  built mock racadm for type/provider testing
•  Vagrantfile: 237 lines
•  Supports base images for ~every host in production
Where are we now? (pt. 2)
•  Salesforce::piab – for functional validation of catalogs –
the precursor to Rouster
•  Perl abstraction layer to Vagrant machines, shelled out to
vagrant faces, created a new pseudo-TTY connection for each
run() command
•  Relies on external project, deltas, to power the get_(groups|
packages|services|users)
•  Supports a subset of is_* tests
•  To accomplish isolation, large portions of code in role_*.t is
duplicated for each test
Where are we going?
•  Rouster
•  Porting existing Salesforce::piab tests
•  Resolve issues and TODOs in codebase
•  Moving from all Vagrant VMs to include physical
hardware environment
http://www.hostgator.com/images/d8.jpg
puppet-y methods
require	
  'rouster'	
  
require	
  'rouster/puppet'	
  
	
  
ppm	
  =	
  Rouster.new(:name	
  =>	
  'ppm')	
  
p	
  (ppm.methods	
  –	
  Object.methods).sort	
  
[	
  
	
  :get_catalog,	
  :get_puppet_errors,	
  :get_puppet_notices,
:parse_catalog,	
  :remove_existing_certs,	
  :run_puppet	
  
]	
  
	
  
	
  
	
  
	
  	
  	
  
testing methods
require	
  'rouster'	
  
require	
  'rouster/testing'	
  
	
  
ppm	
  =	
  Rouster.new(:name	
  =>	
  'ppm')	
  
p	
  (ppm.methods	
  –	
  Object.methods).sort	
  
[	
  
	
  :is_dir?,	
  :is_executable?,	
  :is_file?,	
  :is_group?,	
  :is_
in_file?,	
  :is_in_path?,	
  :is_package?,	
  :is_port_active?
,	
  :is_port_open?,	
  :is_process_running?,	
  :is_readable?,	
  
:is_service?,	
  :is_service_running?,	
  :is_user?,	
  :is_use
r_in_group?,	
  :is_writeable?	
  
]	
  
Rouster - demo
Where is Rouster going?
•  SFDC is going all RHEL, most of our time will be
devoted to supporting that OS
•  Object model – no more shelling out
•  Vagrant
•  Puppet
•  Passthrough implementation
•  Better/more
•  Documentation
•  Tests
•  What does the community need?
http://www.skyanalytics.com/Portals/171866/images/roadmap.jpg
Want to help?
•  Testing
•  do our tests work in your environment? how can we make them
more generic?
•  how does Rouster work with providers other than VirtualBox?
•  Support for
•  other system configuration tools – Chef? Ansible?
$whatevercomesnext?
•  other operating systems
•  TODO hunting – at last count, more than 30
•  New tests/convenience methods
•  Most importantly, need an awesome logo
Questions for the audience
•  How are you accomplishing test isolation?
•  How are you handling credential management?
•  How are you testing code against non-server puppet
agents?
•  How are you handling negative testing?
Conor Horan-Kates
SMTS, QE
github.com/chorankates/rouster
@chorankates

Vagrant + Rouster at salesforce.com - PuppetConf 2013

  • 1.
    Vagrant + Rouster atsalesforce.com Conor Horan-Kates Senior Member of the Technical Staff, Quality Engineering @chorankates
  • 2.
    /usr/bin/whoami •  most recentlyas a tester in quality assurance for a Windows based antimalware solution •  started as a traditional quality engineer in a Data Center Automation group, moved towards developer and systems engineer, riding the DevOps wave
  • 3.
  • 4.
    basic instantiation require  'rouster'     #  the  value  for  the  'name'  attribute  should  be  a  name  in  `vagrant  status`   app  =  Rouster.new(:name  =>  'app')     #  equivalent  to  `vagrant  up  app`   app.up()     #  STD(OUT|ERR)  of  this  is  available  in  app.get_output()   app.run('cat  /etc/hosts')   app.put('new-­‐foo',  '/tmp/foo')   app.get('/tmp/foo')     app.destroy()   http://tipmra.com/new_tipmra/new_cop_pic/old_cop_time_1a.gif
  • 5.
    Where did westart? •  Team composition •  6 engineers – 3 system engineers, 2 QE and 1 developer •  Very little Ruby experience, mostly Perl and Shell •  Education •  Pro Puppet, Puppet 2.7 Cookbook, Puppet Types and Providers •  Puppet Intro and Puppet Developers (now Advanced) classes from PuppetLabs •  Tools •  RSpec, rspec-puppet •  puppet-lint
  • 6.
    Where have webeen? •  get out of perforce and into git •  local git-commit hooks •  puppet-lint •  RSpec, rspec-puppet •  Vagrantfile: 39 lines •  piab -> ‘Puppet in a box’ •  Supports base images for roles in SFDC stack
  • 7.
    Where are wenow? •  Jenkins – relatively small installation •  RSpec, rspec-puppet – for catalog validation of manifests, some unit testing •  test-unit – for unit tests of custom functions •  Test::More – for unit/functional tests of ENC •  built mock racadm for type/provider testing •  Vagrantfile: 237 lines •  Supports base images for ~every host in production
  • 8.
    Where are wenow? (pt. 2) •  Salesforce::piab – for functional validation of catalogs – the precursor to Rouster •  Perl abstraction layer to Vagrant machines, shelled out to vagrant faces, created a new pseudo-TTY connection for each run() command •  Relies on external project, deltas, to power the get_(groups| packages|services|users) •  Supports a subset of is_* tests •  To accomplish isolation, large portions of code in role_*.t is duplicated for each test
  • 9.
    Where are wegoing? •  Rouster •  Porting existing Salesforce::piab tests •  Resolve issues and TODOs in codebase •  Moving from all Vagrant VMs to include physical hardware environment http://www.hostgator.com/images/d8.jpg
  • 10.
    puppet-y methods require  'rouster'   require  'rouster/puppet'     ppm  =  Rouster.new(:name  =>  'ppm')   p  (ppm.methods  –  Object.methods).sort   [    :get_catalog,  :get_puppet_errors,  :get_puppet_notices, :parse_catalog,  :remove_existing_certs,  :run_puppet   ]              
  • 11.
    testing methods require  'rouster'   require  'rouster/testing'     ppm  =  Rouster.new(:name  =>  'ppm')   p  (ppm.methods  –  Object.methods).sort   [    :is_dir?,  :is_executable?,  :is_file?,  :is_group?,  :is_ in_file?,  :is_in_path?,  :is_package?,  :is_port_active? ,  :is_port_open?,  :is_process_running?,  :is_readable?,   :is_service?,  :is_service_running?,  :is_user?,  :is_use r_in_group?,  :is_writeable?   ]  
  • 12.
  • 13.
    Where is Roustergoing? •  SFDC is going all RHEL, most of our time will be devoted to supporting that OS •  Object model – no more shelling out •  Vagrant •  Puppet •  Passthrough implementation •  Better/more •  Documentation •  Tests •  What does the community need? http://www.skyanalytics.com/Portals/171866/images/roadmap.jpg
  • 14.
    Want to help? • Testing •  do our tests work in your environment? how can we make them more generic? •  how does Rouster work with providers other than VirtualBox? •  Support for •  other system configuration tools – Chef? Ansible? $whatevercomesnext? •  other operating systems •  TODO hunting – at last count, more than 30 •  New tests/convenience methods •  Most importantly, need an awesome logo
  • 15.
    Questions for theaudience •  How are you accomplishing test isolation? •  How are you handling credential management? •  How are you testing code against non-server puppet agents? •  How are you handling negative testing?
  • 17.