require 'spec_helper_acceptance' describe 'apache::mod::passenger class', :unless => UNSUPPORTED_PLATFORMS.include?(fact('osfamily')) do case fact('osfamily') when 'Debian' service_name = 'apache2' mod_dir = '/etc/apache2/mods-available/' conf_file = "#{mod_dir}passenger.conf" load_file = "#{mod_dir}passenger.load" case fact('operatingsystem') when 'Ubuntu' case fact('lsbdistrelease') when '10.04' passenger_root = '/usr' passenger_ruby = '/usr/bin/ruby' when '12.04' passenger_root = '/usr' passenger_ruby = '/usr/bin/ruby' when '14.04' passenger_root = '/usr/lib/ruby/vendor_ruby/phusion_passenger/locations.ini' passenger_ruby = '/usr/bin/ruby' passenger_default_ruby = '/usr/bin/ruby' else # This may or may not work on Ubuntu releases other than the above passenger_root = '/usr' passenger_ruby = '/usr/bin/ruby' end when 'Debian' case fact('lsbdistcodename') when 'wheezy' passenger_root = '/usr' passenger_ruby = '/usr/bin/ruby' else # This may or may not work on Debian releases other than the above passenger_root = '/usr' passenger_ruby = '/usr/bin/ruby' end end passenger_module_path = '/usr/lib/apache2/modules/mod_passenger.so' rackapp_user = 'www-data' rackapp_group = 'www-data' when 'RedHat' service_name = 'httpd' mod_dir = '/etc/httpd/conf.d/' conf_file = "#{mod_dir}passenger.conf" load_file = "#{mod_dir}passenger.load" # sometimes installs as 3.0.12, sometimes as 3.0.19 - so just check for the stable part passenger_root = '/usr/lib/ruby/gems/1.8/gems/passenger-3.0.1' passenger_ruby = '/usr/bin/ruby' passenger_tempdir = '/var/run/rubygem-passenger' passenger_module_path = 'modules/mod_passenger.so' rackapp_user = 'apache' rackapp_group = 'apache' end pp_rackapp = <<-EOS /* a simple ruby rack 'hellow world' app */ file { '/var/www/passenger': ensure => directory, owner => '#{rackapp_user}', group => '#{rackapp_group}', require => Class['apache::mod::passenger'], } file { '/var/www/passenger/config.ru': ensure => file, owner => '#{rackapp_user}', group => '#{rackapp_group}', content => "app = proc { |env| [200, { \\"Content-Type\\" => \\"text/html\\" }, [\\"hello world\\"]] }\\nrun app", require => File['/var/www/passenger'] , } apache::vhost { 'passenger.example.com': port => '80', docroot => '/var/www/passenger/public', docroot_group => '#{rackapp_group}' , docroot_owner => '#{rackapp_user}' , custom_fragment => "PassengerRuby #{passenger_ruby}\\nRailsEnv development" , require => File['/var/www/passenger/config.ru'] , } host { 'passenger.example.com': ip => '127.0.0.1', } EOS case fact('osfamily') when 'Debian' context "default passenger config" do it 'succeeds in puppeting passenger' do pp = <<-EOS /* stock apache and mod_passenger */ class { 'apache': } class { 'apache::mod::passenger': } #{pp_rackapp} EOS apply_manifest(pp, :catch_failures => true) end describe service(service_name) do it { is_expected.to be_enabled } it { is_expected.to be_running } end describe file(conf_file) do it { is_expected.to contain "PassengerRoot \"#{passenger_root}\"" } case fact('operatingsystem') when 'Ubuntu' case fact('lsbdistrelease') when '10.04' it { is_expected.to contain "PassengerRuby \"#{passenger_ruby}\"" } it { is_expected.not_to contain "/PassengerDefaultRuby/" } when '12.04' it { is_expected.to contain "PassengerRuby \"#{passenger_ruby}\"" } it { is_expected.not_to contain "/PassengerDefaultRuby/" } when '14.04' it { is_expected.to contain "PassengerDefaultRuby \"#{passenger_ruby}\"" } it { is_expected.not_to contain "/PassengerRuby/" } else # This may or may not work on Ubuntu releases other than the above it { is_expected.to contain "PassengerRuby \"#{passenger_ruby}\"" } it { is_expected.not_to contain "/PassengerDefaultRuby/" } end when 'Debian' case fact('lsbdistcodename') when 'wheezy' it { is_expected.to contain "PassengerRuby \"#{passenger_ruby}\"" } it { is_expected.not_to contain "/PassengerDefaultRuby/" } else # This may or may not work on Debian releases other than the above it { is_expected.to contain "PassengerRuby \"#{passenger_ruby}\"" } it { is_expected.not_to contain "/PassengerDefaultRuby/" } end end end describe file(load_file) do it { is_expected.to contain "LoadModule passenger_module #{passenger_module_path}" } end it 'should output status via passenger-memory-stats' do shell("sudo /usr/sbin/passenger-memory-stats") do |r| expect(r.stdout).to match(/Apache processes/) expect(r.stdout).to match(/Nginx processes/) expect(r.stdout).to match(/Passenger processes/) # passenger-memory-stats output on Ubuntu 14.04 does not contain # these two lines unless fact('operatingsystem') == 'Ubuntu' && fact('operatingsystemrelease') == '14.04' expect(r.stdout).to match(/### Processes: [0-9]+/) expect(r.stdout).to match(/### Total private dirty RSS: [0-9\.]+ MB/) end expect(r.exit_code).to eq(0) end end # passenger-status fails under stock ubuntu-server-12042-x64 + mod_passenger, # even when the passenger process is successfully installed and running unless fact('operatingsystem') == 'Ubuntu' && fact('operatingsystemrelease') == '12.04' it 'should output status via passenger-status' do # xml output not available on ubunutu <= 10.04, so sticking with default pool output shell("/usr/sbin/passenger-status") do |r| # spacing may vary expect(r.stdout).to match(/[\-]+ General information [\-]+/) if fact('operatingsystem') == 'Ubuntu' && fact('operatingsystemrelease') == '14.04' expect(r.stdout).to match(/Max pool size[ ]+: [0-9]+/) expect(r.stdout).to match(/Processes[ ]+: [0-9]+/) expect(r.stdout).to match(/Requests in top-level queue[ ]+: [0-9]+/) else expect(r.stdout).to match(/max[ ]+= [0-9]+/) expect(r.stdout).to match(/count[ ]+= [0-9]+/) expect(r.stdout).to match(/active[ ]+= [0-9]+/) expect(r.stdout).to match(/inactive[ ]+= [0-9]+/) expect(r.stdout).to match(/Waiting on global queue: [0-9]+/) end expect(r.exit_code).to eq(0) end end end it 'should answer to passenger.example.com' do shell("/usr/bin/curl passenger.example.com:80") do |r| expect(r.stdout).to match(/^hello world<\/b>$/) expect(r.exit_code).to eq(0) end end end when 'RedHat' # no fedora 18 passenger package yet, and rhel5 packages only exist for ruby 1.8.5 unless (fact('operatingsystem') == 'Fedora' and fact('operatingsystemrelease').to_f >= 18) or (fact('osfamily') == 'RedHat' and fact('operatingsystemmajrelease') == '5' and fact('rubyversion') != '1.8.5') if fact('operatingsystem') == 'RedHat' and fact('operatingsystemmajrelease') == '7' pending('test passenger - RHEL7 packages don\'t exist') else context "default passenger config" do it 'succeeds in puppeting passenger' do pp = <<-EOS /* EPEL and passenger repositories */ class { 'epel': } exec { 'passenger.repo GPG key': command => '/usr/bin/curl -o /etc/yum.repos.d/RPM-GPG-KEY-stealthymonkeys.asc http://passenger.stealthymonkeys.com/RPM-GPG-KEY-stealthymonkeys.asc', creates => '/etc/yum.repos.d/RPM-GPG-KEY-stealthymonkeys.asc', } file { 'passenger.repo GPG key': ensure => file, path => '/etc/yum.repos.d/RPM-GPG-KEY-stealthymonkeys.asc', require => Exec['passenger.repo GPG key'], } epel::rpm_gpg_key { 'passenger.stealthymonkeys.com': path => '/etc/yum.repos.d/RPM-GPG-KEY-stealthymonkeys.asc', require => [ Class['epel'], File['passenger.repo GPG key'], ] } $releasever_string = $operatingsystem ? { 'Scientific' => '6', default => '$releasever', } yumrepo { 'passenger': baseurl => "http://passenger.stealthymonkeys.com/rhel/${releasever_string}/\\$basearch" , descr => "Red Hat Enterprise ${releasever_string} - Phusion Passenger", enabled => 1, gpgcheck => 1, gpgkey => 'http://passenger.stealthymonkeys.com/RPM-GPG-KEY-stealthymonkeys.asc', mirrorlist => 'http://passenger.stealthymonkeys.com/rhel/mirrors', require => [ Epel::Rpm_gpg_key['passenger.stealthymonkeys.com'], ], } /* apache and mod_passenger */ class { 'apache': require => [ Class['epel'], ], } class { 'apache::mod::passenger': require => [ Yumrepo['passenger'] ], } #{pp_rackapp} EOS apply_manifest(pp, :catch_failures => true) end describe service(service_name) do it { is_expected.to be_enabled } it { is_expected.to be_running } end describe file(conf_file) do it { is_expected.to contain "PassengerRoot #{passenger_root}" } it { is_expected.to contain "PassengerRuby #{passenger_ruby}" } it { is_expected.to contain "PassengerTempDir #{passenger_tempdir}" } end describe file(load_file) do it { is_expected.to contain "LoadModule passenger_module #{passenger_module_path}" } end it 'should output status via passenger-memory-stats' do shell("sudo /usr/bin/passenger-memory-stats") do |r| expect(r.stdout).to match(/Apache processes/) expect(r.stdout).to match(/Nginx processes/) expect(r.stdout).to match(/Passenger processes/) expect(r.stdout).to match(/### Processes: [0-9]+/) expect(r.stdout).to match(/### Total private dirty RSS: [0-9\.]+ MB/) expect(r.exit_code).to eq(0) end end it 'should output status via passenger-status' do shell("PASSENGER_TMPDIR=/var/run/rubygem-passenger /usr/bin/passenger-status") do |r| # spacing may vary r.stdout.should =~ /[\-]+ General information [\-]+/ r.stdout.should =~ /max[ ]+= [0-9]+/ r.stdout.should =~ /count[ ]+= [0-9]+/ r.stdout.should =~ /active[ ]+= [0-9]+/ r.stdout.should =~ /inactive[ ]+= [0-9]+/ r.stdout.should =~ /Waiting on global queue: [0-9]+/ r.exit_code.should == 0 end end it 'should answer to passenger.example.com' do shell("/usr/bin/curl passenger.example.com:80") do |r| r.stdout.should =~ /^hello world<\/b>$/ r.exit_code.should == 0 end end end end end end end