Skip to content

Commit

Permalink
Merge pull request #741 from Phil-Friderici/GH-578
Browse files Browse the repository at this point in the history
(GH-578) etc_dir should be configurable
  • Loading branch information
ghoneycutt authored Jul 25, 2017
2 parents c9e88ea + 958ec82 commit 2c64888
Show file tree
Hide file tree
Showing 4 changed files with 248 additions and 20 deletions.
13 changes: 11 additions & 2 deletions manifests/init.pp
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,11 @@
# Default: installed
# Valid values: absent, installed, latest, present, [\d\.\-el]+
#
# [*sensu_etc_dir*]
# String. Absolute path to the sensu etc directory.
# Default: '/etc/sensu' on Linux
# 'C:/opt/sensu' on windows
#
# [*sensu_plugin_name*]
# String. Name of the sensu-plugin package. Refers to the sensu-plugin rubygem
# Not the community sensu-plugins community scripts.
Expand Down Expand Up @@ -470,6 +475,10 @@
'windows' => 'gem',
default => undef,
},
Stdlib::Absolutepath $sensu_etc_dir = $::osfamily ? {
'windows' => 'C:/opt/sensu',
default => '/etc/sensu',
},
Pattern[/^absent$/, /^installed$/, /^latest$/, /^present$/, /^\d[\d\.\-\w]+$/] $sensu_plugin_version = 'installed',
Boolean $install_repo = true,
Boolean $enterprise = false,
Expand Down Expand Up @@ -668,7 +677,7 @@

case $::osfamily {
'Debian','RedHat': {
$etc_dir = '/etc/sensu'
$etc_dir = $sensu_etc_dir
$conf_dir = "${etc_dir}/conf.d"
$user = 'sensu'
$group = 'sensu'
Expand All @@ -679,7 +688,7 @@
}

'windows': {
$etc_dir = 'C:/opt/sensu'
$etc_dir = $sensu_etc_dir
$conf_dir = "${etc_dir}/conf.d"
$user = 'NT Authority\SYSTEM'
$group = 'Administrators'
Expand Down
239 changes: 222 additions & 17 deletions spec/classes/sensu_init_spec.rb
Original file line number Diff line number Diff line change
@@ -1,22 +1,127 @@
require 'spec_helper'

describe 'sensu', :type => :class do
let(:facts) { { :osfamily => 'RedHat' } }

it 'should compile' do should create_class('sensu') end
it { should contain_user('sensu') }
it { should contain_file('/etc/default/sensu').with_content(%r{^EMBEDDED_RUBY=true$}) }
it { should contain_file('/etc/default/sensu').with_content(%r{^LOG_LEVEL=info$}) }
it { should contain_file('/etc/default/sensu').with_content(%r{^LOG_DIR=/var/log/sensu$}) }
it { should contain_file('/etc/default/sensu').without_content(%r{^RUBYOPT=.*$}) }
it { should contain_file('/etc/default/sensu').without_content(%r{^GEM_PATH=.*$}) }
it { should contain_file('/etc/default/sensu').without_content(%r{^CLIENT_DEREGISTER_ON_STOP=true\nCLIENT_DEREGISTER_HANDLER=.*$}) }
it { should contain_file('/etc/default/sensu').with_content(%r{^SERVICE_MAX_WAIT="10"$}) }
it { should contain_file('/etc/default/sensu').with_content(%r{^PATH=\$PATH$}) }
it { should contain_anchor('plugins_before_checks') }
it { should_not contain_file('C:/opt/sensu/bin/sensu-client.xml') }

describe 'osfamily windows' do
describe 'osfamily RedHat defaults' do
let(:facts) { { :osfamily => 'RedHat' } }

it 'should compile' do should create_class('sensu') end
it { should contain_user('sensu') }
it { should contain_file('/etc/default/sensu').with_content(%r{^LOG_DIR=/var/log/sensu$}) }
it { should contain_file('/etc/default/sensu').with_content(%r{^EMBEDDED_RUBY=true$}) }
it { should contain_file('/etc/default/sensu').with_content(%r{^LOG_LEVEL=info$}) }
it { should contain_file('/etc/default/sensu').with_content(%r{^LOG_DIR=/var/log/sensu$}) }
it { should contain_file('/etc/default/sensu').without_content(%r{^RUBYOPT=.*$}) }
it { should contain_file('/etc/default/sensu').without_content(%r{^GEM_PATH=.*$}) }
it { should contain_file('/etc/default/sensu').without_content(%r{^CLIENT_DEREGISTER_ON_STOP=true\nCLIENT_DEREGISTER_HANDLER=.*$}) }
it { should contain_file('/etc/default/sensu').with_content(%r{^SERVICE_MAX_WAIT="10"$}) }
it { should contain_file('/etc/default/sensu').with_content(%r{^PATH=\$PATH$}) }
it { should_not contain_file('C:/opt/sensu/bin/sensu-client.xml') }

# FIXME: The following resource checks are only testing $sensu_etc_dir specific values
# resources from sensu::package
it { should contain_file('/etc/sensu/conf.d') }
it { should contain_file('/etc/sensu/conf.d/handlers') }
it { should contain_file('/etc/sensu/conf.d/checks') }
it { should contain_file('/etc/sensu/conf.d/filters') }
it { should contain_file('/etc/sensu/conf.d/extensions') }
it { should contain_file('/etc/sensu/conf.d/mutators') }
it { should contain_file('/etc/sensu/conf.d/contacts') }
it { should contain_file('/etc/sensu/handlers') }
it { should contain_file('/etc/sensu/extensions') }
it { should contain_file('/etc/sensu/extensions/handlers') }
it { should contain_file('/etc/sensu/mutators') }
it { should contain_file('/etc/sensu/plugins') }
it { should contain_file('/etc/sensu/config.json') }
# resources from sensu::rabbitmq::config
it { should_not contain_file('/etc/sensu/ssl') }
it { should_not contain_file('/etc/sensu/ssl/cert.pem').with_require('File[/etc/sensu/ssl]') }
it { should_not contain_file('/etc/sensu/ssl/key.pem').with_require('File[/etc/sensu/ssl]') }
it { should contain_file('/etc/sensu/conf.d/rabbitmq.json') }
it { should contain_sensu_rabbitmq_config('testfqdn.example.com').with_base_path('/etc/sensu/conf.d') }
# resources from sensu::redis::config
it { should contain_file('/etc/sensu/conf.d/redis.json') }
it { should contain_sensu_redis_config('testfqdn.example.com').with_base_path('/etc/sensu/conf.d') }
# resources from sensu::api::config
it { should contain_file('/etc/sensu/conf.d/api.json') }
it { should contain_sensu_api_config('testfqdn.example.com').with_base_path('/etc/sensu/conf.d') }
# resources from sensu::enterprise::dashboard::config
it { should_not contain_file('/etc/sensu/dashboard.json') }
# resources from sensu::subscription (positive tests are included in test for sensu::subscription itself)
it { should_not contain_file('/etc/sensu/conf.d/subscriptiond.json') }
it { should_not contain_sensu_client_subscription('mysubscription').with_base_path('/etc/sensu/conf.d') }
# resources from sensu::transport
it { should contain_file('/etc/sensu/conf.d/transport.json') }
# resources from sensu::client::config
it { should contain_file('/etc/sensu/conf.d/client.json') }
it { should contain_sensu_client_config('testfqdn.example.com').with_base_path('/etc/sensu/conf.d') }
end

context 'with sensu_etc_dir => /opt/etc/sensu' do
let(:params) { {:sensu_etc_dir => '/opt/etc/sensu' } }

# resources from sensu::package
it { should contain_file('/opt/etc/sensu/conf.d') }
it { should contain_file('/opt/etc/sensu/conf.d/handlers') }
it { should contain_file('/opt/etc/sensu/conf.d/checks') }
it { should contain_file('/opt/etc/sensu/conf.d/filters') }
it { should contain_file('/opt/etc/sensu/conf.d/extensions') }
it { should contain_file('/opt/etc/sensu/conf.d/mutators') }
it { should contain_file('/opt/etc/sensu/conf.d/contacts') }
it { should contain_file('/opt/etc/sensu/handlers') }
it { should contain_file('/opt/etc/sensu/extensions') }
it { should contain_file('/opt/etc/sensu/extensions/handlers') }
it { should contain_file('/opt/etc/sensu/mutators') }
it { should contain_file('/opt/etc/sensu/plugins') }
it { should contain_file('/opt/etc/sensu/config.json') }
# resources from sensu::rabbitmq::config
it { should_not contain_file('/opt/etc/sensu/ssl') }
it { should_not contain_file('/opt/etc/sensu/ssl/cert.pem').with_require('File[/opt/etc/sensu/ssl]') }
it { should_not contain_file('/opt/etc/sensu/ssl/key.pem').with_require('File[/opt/etc/sensu/ssl]') }
it { should contain_file('/opt/etc/sensu/conf.d/rabbitmq.json') }
it { should contain_sensu_rabbitmq_config('testfqdn.example.com').with_base_path('/opt/etc/sensu/conf.d') }
# resources from sensu::redis::config
it { should contain_file('/opt/etc/sensu/conf.d/redis.json') }
it { should contain_sensu_redis_config('testfqdn.example.com').with_base_path('/opt/etc/sensu/conf.d') }
# resources from sensu::api::config
it { should contain_file('/opt/etc/sensu/conf.d/api.json') }
it { should contain_sensu_api_config('testfqdn.example.com').with_base_path('/opt/etc/sensu/conf.d') }
# resources from sensu::enterprise::dashboard::config
it { should_not contain_file('/opt/etc/sensu/dashboard.json') }
# resources from sensu::subscription (positive tests are included in test for sensu::subscription itself)
it { should_not contain_file('/opt/etc/sensu/conf.d/subscriptiond.json') }
it { should_not contain_sensu_client_subscription('mysubscription').with_base_path('/opt/etc/sensu/conf.d') }
# resources from sensu::transport
it { should contain_file('/opt/etc/sensu/conf.d/transport.json') }
# resources from sensu::client::config
it { should contain_file('/opt/etc/sensu/conf.d/client.json') }
it { should contain_sensu_client_config('testfqdn.example.com').with_base_path('/opt/etc/sensu/conf.d') }

context 'when rabbitmq_ssl_cert_chain => puppet:///modules/sensu/cert.pem' do
let(:params) { {:sensu_etc_dir => '/opt/etc/sensu', :rabbitmq_ssl_cert_chain => 'puppet:///modules/sensu/cert.pem' } }
it { should contain_file('/opt/etc/sensu/ssl') }
it { should contain_file('/opt/etc/sensu/ssl/cert.pem').with_require('File[/opt/etc/sensu/ssl]') }
it { should_not contain_file('/opt/etc/sensu/ssl/key.pem') }
end

context 'when rabbitmq_ssl_private_key => puppet:///modules/sensu/key.pem' do
let(:params) { {:sensu_etc_dir => '/opt/etc/sensu', :rabbitmq_ssl_private_key => 'puppet:///modules/sensu/key.pem' } }
it { should contain_file('/opt/etc/sensu/ssl') }
it { should_not contain_file('/opt/etc/sensu/ssl/cert.pem') }
it { should contain_file('/opt/etc/sensu/ssl/key.pem').with_require('File[/opt/etc/sensu/ssl]') }
end

context 'when enterprise_dashboard => true (and enterprise_user & enterprise_pass set) ' do
let(:params) { {:sensu_etc_dir => '/opt/etc/sensu', :enterprise_dashboard => true, :enterprise_user => 'user', :enterprise_pass => 'pass' } }
it { should contain_file('/opt/etc/sensu/dashboard.json') }
end

context 'when enterprise_dashboard => true (and enterprise_user & enterprise_pass set) ' do
let(:params) { {:sensu_etc_dir => '/opt/etc/sensu', :enterprise_dashboard => true, :enterprise_user => 'user', :enterprise_pass => 'pass' } }
it { should contain_file('/opt/etc/sensu/dashboard.json') }
end
end

describe 'osfamily windows defaults' do
let(:facts) do
{
:osfamily => 'windows',
Expand All @@ -31,6 +136,106 @@
}
end

# FIXME: The following resource checks are only testing $sensu_etc_dir specific values
# resources from sensu::package
it { should contain_file('C:/opt/sensu/conf.d') }
it { should contain_file('C:/opt/sensu/conf.d/handlers') }
it { should contain_file('C:/opt/sensu/conf.d/checks') }
it { should contain_file('C:/opt/sensu/conf.d/filters') }
it { should contain_file('C:/opt/sensu/conf.d/extensions') }
it { should contain_file('C:/opt/sensu/conf.d/mutators') }
it { should contain_file('C:/opt/sensu/conf.d/contacts') }
it { should contain_file('C:/opt/sensu/handlers') }
it { should contain_file('C:/opt/sensu/extensions') }
it { should contain_file('C:/opt/sensu/extensions/handlers') }
it { should contain_file('C:/opt/sensu/mutators') }
it { should contain_file('C:/opt/sensu/plugins') }
it { should contain_file('C:/opt/sensu/config.json') }
# resources from sensu::rabbitmq::config
it { should_not contain_file('C:/opt/sensu/ssl') }
it { should_not contain_file('C:/opt/sensu/ssl/cert.pem').with_require('File[C:/opt/sensu/ssl]') }
it { should_not contain_file('C:/opt/sensu/ssl/key.pem').with_require('File[C:/opt/sensu/ssl]') }
it { should contain_file('C:/opt/sensu/conf.d/rabbitmq.json') }
it { should contain_sensu_rabbitmq_config('testfqdn.example.com').with_base_path('C:/opt/sensu/conf.d') }
# resources from sensu::redis::config
it { should contain_file('C:/opt/sensu/conf.d/redis.json') }
it { should contain_sensu_redis_config('testfqdn.example.com').with_base_path('C:/opt/sensu/conf.d') }
# resources from sensu::api::config
it { should contain_file('C:/opt/sensu/conf.d/api.json') }
it { should contain_sensu_api_config('testfqdn.example.com').with_base_path('C:/opt/sensu/conf.d') }
# resources from sensu::enterprise::dashboard::config
it { should_not contain_file('C:/opt/sensu/dashboard.json') }
# resources from sensu::transport
it { should contain_file('C:/opt/sensu/conf.d/transport.json') }
# resources from sensu::client::config
it { should contain_file('C:/opt/sensu/conf.d/client.json') }
it { should contain_sensu_client_config('testfqdn.example.com').with_base_path('C:/opt/sensu/conf.d') }

describe 'with manage_user => true' do
it { should_not contain_user('sensu') }
end

describe 'with manage_user => false' do
let(:params) { {:manage_user => false} }
it { should_not contain_user('sensu') }
end

context 'with sensu_etc_dir => C:/etc/sensu' do
let(:params) { {:sensu_etc_dir => 'C:/etc/sensu' } }
# resources from sensu::package
it { should contain_file('C:/etc/sensu/conf.d') }
it { should contain_file('C:/etc/sensu/conf.d/handlers') }
it { should contain_file('C:/etc/sensu/conf.d/checks') }
it { should contain_file('C:/etc/sensu/conf.d/filters') }
it { should contain_file('C:/etc/sensu/conf.d/extensions') }
it { should contain_file('C:/etc/sensu/conf.d/mutators') }
it { should contain_file('C:/etc/sensu/conf.d/contacts') }
it { should contain_file('C:/etc/sensu/handlers') }
it { should contain_file('C:/etc/sensu/extensions') }
it { should contain_file('C:/etc/sensu/extensions/handlers') }
it { should contain_file('C:/etc/sensu/mutators') }
it { should contain_file('C:/etc/sensu/plugins') }
it { should contain_file('C:/etc/sensu/config.json') }
# resources from sensu::rabbitmq::config
it { should_not contain_file('C:/etc/sensu/ssl') }
it { should_not contain_file('C:/etc/sensu/ssl/cert.pem').with_require('File[C:/etc/sensu/ssl]') }
it { should_not contain_file('C:/etc/sensu/ssl/key.pem').with_require('File[C:/etc/sensu/ssl]') }
it { should contain_file('C:/etc/sensu/conf.d/rabbitmq.json') }
it { should contain_sensu_rabbitmq_config('testfqdn.example.com').with_base_path('C:/etc/sensu/conf.d') }
# resources from sensu::redis::config
it { should contain_file('C:/etc/sensu/conf.d/redis.json') }
it { should contain_sensu_redis_config('testfqdn.example.com').with_base_path('C:/etc/sensu/conf.d') }
# resources from sensu::api::config
it { should contain_file('C:/etc/sensu/conf.d/api.json') }
it { should contain_sensu_api_config('testfqdn.example.com').with_base_path('C:/etc/sensu/conf.d') }
# resources from sensu::enterprise::dashboard::config
it { should_not contain_file('C:/etc/sensu/dashboard.json') }
# resources from sensu::transport
it { should contain_file('C:/etc/sensu/conf.d/transport.json') }
# resources from sensu::client::config
it { should contain_file('C:/etc/sensu/conf.d/client.json') }
it { should contain_sensu_client_config('testfqdn.example.com').with_base_path('C:/etc/sensu/conf.d') }

context 'when rabbitmq_ssl_cert_chain => puppet:///modules/sensu/cert.pem' do
let(:params) { {:sensu_etc_dir => 'C:/etc/sensu', :rabbitmq_ssl_cert_chain => 'puppet:///modules/sensu/cert.pem' } }
it { should contain_file('C:/etc/sensu/ssl') }
it { should contain_file('C:/etc/sensu/ssl/cert.pem').with_require('File[C:/etc/sensu/ssl]') }
it { should_not contain_file('C:/etc/sensu/ssl/key.pem') }
end

context 'when rabbitmq_ssl_private_key => puppet:///modules/sensu/key.pem' do
let(:params) { {:sensu_etc_dir => 'C:/etc/sensu', :rabbitmq_ssl_private_key => 'puppet:///modules/sensu/key.pem' } }
it { should contain_file('C:/etc/sensu/ssl') }
it { should_not contain_file('C:/etc/sensu/ssl/cert.pem') }
it { should contain_file('C:/etc/sensu/ssl/key.pem').with_require('File[C:/etc/sensu/ssl]') }
end

context 'when enterprise_dashboard => true (and enterprise_user & enterprise_pass set) ' do
let(:params) { {:sensu_etc_dir => 'C:/etc/sensu', :enterprise_dashboard => true, :enterprise_user => 'user', :enterprise_pass => 'pass' } }
it { should contain_file('C:/etc/sensu/dashboard.json') }
end
end

context 'with default setting' do
content = <<-END.gsub(/^\s+\|/, '')
|<!-- Windows service definition for Sensu -->
Expand Down Expand Up @@ -358,7 +563,7 @@

validations = {
'absolute_path' => {
:name => %w[log_dir path],
:name => %w[log_dir path sensu_etc_dir],
:valid => %w[/absolute/filepath /absolute/directory/],
:invalid => ['./relative/path', %w(array), { 'ha' => 'sh' }, 3, 2.42, true, false, nil],
:message => 'Evaluation Error: Error while evaluating a Resource Statement',
Expand Down
15 changes: 14 additions & 1 deletion spec/defines/sensu_subscription_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
let(:title) { 'mysubscription' }

context 'defaults' do
it { should contain_sensu_client_subscription('mysubscription') }
it { should contain_sensu_client_subscription('mysubscription').with_base_path('/etc/sensu/conf.d') }
end

context 'setting params' do
Expand All @@ -37,4 +37,17 @@

it { should contain_sensu_client_subscription('mysubscription').with(:notify => 'Class[Sensu::Client::Service]' ) }
end

describe 'when sensu::sensu_etc_dir => /opt/etc/sensu' do
let(:pre_condition) do
<<-'ENDofPUPPETcode'
class {'sensu':
sensu_etc_dir => '/opt/etc/sensu';
}
ENDofPUPPETcode
end
let(:title) { 'mysubscription' }
it { should contain_sensu_client_subscription('mysubscription').with_base_path('/opt/etc/sensu/conf.d') }
end

end
1 change: 1 addition & 0 deletions spec/spec_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
:ipaddress => '127.0.0.1',
:kernel => 'Linux',
:osfamily => 'RedHat',
:fqdn => 'testfqdn.example.com',
}
config.backtrace_exclusion_patterns = [
%r{/\.bundle/},
Expand Down

0 comments on commit 2c64888

Please sign in to comment.