Files
puppet-swift/spec/defines/swift_storage_server_spec.rb
Adam Vinsh 5a7d18975f Manage swift with swiftinit service provider
The 'swiftinit' provider is a custom provider of the service type
that manages swift services using swift-init.

Use of the swiftinit service provider is optional, the default is
to use service providers specified in params file. This provider
also manages swift services starting at boot by adding or removing
a templated init or services file and making systemctl calls.
See README for more detail.

A wrapper defined type 'swift::service' has been created to simplify
use of the swiftinit provider without adding logic to every class.
this wrapper also aids in input validation and testing of the
swiftinit provider.

Two extra runs of apply_manifest have been added to the
basic_swift_spec acceptance test. The service_provider
is set to "swiftinit".  The first run catches any errors upgrading
to the swiftinit service provider and the second run tests
idempotency.

This patch is an initial step towards using swift-init to manage
multiple swift services out of different configuration files such
as is needed to run a separate replication network.

Change-Id: I2f71c82c7a6c463f8c76a193409c0a17daa15bda
2015-12-07 16:00:50 -05:00

188 lines
7.3 KiB
Ruby

require 'spec_helper'
describe 'swift::storage::server' do
let :facts do
{
:operatingsystem => 'Ubuntu',
:osfamily => 'Debian',
:processorcount => 1
}
end
let :pre_condition do
"class { 'swift': swift_hash_suffix => 'foo' }
class { 'swift::storage': storage_local_net_ip => '10.0.0.1' }"
end
let :default_params do
{
:devices => '/srv/node',
:owner => 'swift',
:group => 'swift',
:incoming_chmod => '0644',
:outgoing_chmod => '0644',
:max_connections => '25',
:log_requests => true
}
end
describe 'with an invalid title' do
let :params do
{:storage_local_net_ip => '127.0.0.1',
:type => 'object'}
end
let :title do
'foo'
end
it_raises 'a Puppet::Error', /does not match/
end
['account', 'object', 'container'].each do |t|
describe "for type #{t}" do
let :title do
'8000'
end
let :req_params do
{:storage_local_net_ip => '10.0.0.1', :type => t}
end
let :params do
req_params
end
it { is_expected.to contain_package("swift-#{t}").with_ensure('present') }
it { is_expected.to contain_service("swift-#{t}-server").with(
:ensure => 'running',
:enable => true,
:hasstatus => true,
)}
let :fragment_file do
"/var/lib/puppet/concat/_etc_swift_#{t}-server.conf/fragments/00_swift-#{t}-#{title}"
end
describe 'when parameters are overridden' do
{
:devices => '/tmp/foo',
:user => 'dan',
:mount_check => true,
:workers => 7,
:pipeline => ['foo'],
}.each do |k,v|
describe "when #{k} is set" do
let :params do req_params.merge({k => v}) end
it { is_expected.to contain_file(fragment_file) \
.with_content(
/^#{k.to_s}\s*=\s*#{v.is_a?(Array) ? v.join(' ') : v}\s*$/
)
}
end
end
describe "when pipeline is passed an array" do
let :params do req_params.merge({:pipeline => ['healthcheck','recon','test']}) end
it { is_expected.to contain_concat__fragment("swift-#{t}-#{title}").with(
:content => /^pipeline\s*=\s*healthcheck recon test\s*$/,
:before => ["Swift::Storage::Filter::Healthcheck[#{t}]", "Swift::Storage::Filter::Recon[#{t}]", "Swift::Storage::Filter::Test[#{t}]"]
)}
end
describe "when pipeline is not passed an array" do
let :params do req_params.merge({:pipeline => 'not an array'}) end
it_raises 'a Puppet::Error', /is not an Array/
end
describe "when replicator_concurrency is set" do
let :params do req_params.merge({:replicator_concurrency => 42}) end
it { is_expected.to contain_file(fragment_file) \
.with_content(/\[#{t}-replicator\]\nconcurrency\s*=\s*42\s*$/m)
}
end
if t != 'account'
describe "when updater_concurrency is set" do
let :params do req_params.merge({:updater_concurrency => 73}) end
it { is_expected.to contain_file(fragment_file) \
.with_content(/\[#{t}-updater\]\nconcurrency\s*=\s*73\s*$/m)
}
end
else
describe "when reaper_concurrency is set" do
let :params do req_params.merge({:reaper_concurrency => 4682}) end
it { is_expected.to contain_file(fragment_file) \
.with_content(/\[#{t}-reaper\]\nconcurrency\s*=\s*4682\s*$/m)
}
end
end
if t == 'container'
describe "when allow_versioning is set" do
let :params do req_params.merge({ :allow_versions => false, }) end
it { is_expected.to contain_file(fragment_file).with_content(/\[app:container-server\]\nallow_versions\s*=\s*false\s*$/m)}
end
end
describe "when log_udp_port is set" do
context 'and log_udp_host is not set' do
let :params do req_params.merge({ :log_udp_port => 514}) end
it_raises 'a Puppet::Error', /log_udp_port requires log_udp_host to be set/
end
context 'and log_udp_host is set' do
let :params do req_params.merge(
{ :log_udp_host => '127.0.0.1',
:log_udp_port => '514'})
end
it { is_expected.to contain_file(fragment_file).with_content(/^log_udp_host\s*=\s*127\.0\.0\.1\s*$/) }
it { is_expected.to contain_file(fragment_file).with_content(/^log_udp_port\s*=\s*514\s*$/) }
end
end
describe "when using swift_#{t}_config resource" do
let :pre_condition do
"
class { 'swift': swift_hash_suffix => 'foo' }
class { 'swift::storage': storage_local_net_ip => '10.0.0.1' }
swift_#{t}_config { 'foo/bar': value => 'foo' }
"
end
it { is_expected.to contain_concat("/etc/swift/#{t}-server.conf").that_comes_before("Swift_#{t}_config[foo/bar]") }
end
describe "when log_requests is turned off" do
let :params do req_params.merge({:log_requests => false}) end
it { is_expected.to contain_file(fragment_file) \
.with_content(/^set log_requests\s*=\s*false\s*$/)
}
end
end
describe 'with all allowed defaults' do
let :params do
req_params
end
it { is_expected.to contain_rsync__server__module("#{t}").with(
:path => '/srv/node',
:lock_file => "/var/lock/#{t}.lock",
:uid => 'swift',
:gid => 'swift',
:incoming_chmod => '0644',
:outgoing_chmod => '0644',
:max_connections => 25,
:read_only => false
)}
# verify template lines
it { is_expected.to contain_file(fragment_file).with_content(/^devices\s*=\s*\/srv\/node\s*$/) }
it { is_expected.to contain_file(fragment_file).with_content(/^bind_ip\s*=\s*10\.0\.0\.1\s*$/) }
it { is_expected.to contain_file(fragment_file).with_content(/^bind_port\s*=\s*#{title}\s*$/) }
it { is_expected.to contain_file(fragment_file).with_content(/^mount_check\s*=\s*false\s*$/) }
it { is_expected.to contain_file(fragment_file).with_content(/^user\s*=\s*swift\s*$/) }
it { is_expected.to contain_file(fragment_file).with_content(/^set log_name\s*=\s*#{t}-server\s*$/) }
it { is_expected.to contain_file(fragment_file).with_content(/^set log_facility\s*=\s*LOG_LOCAL2\s*$/) }
it { is_expected.to contain_file(fragment_file).with_content(/^set log_level\s*=\s*INFO\s*$/) }
it { is_expected.to contain_file(fragment_file).with_content(/^set log_address\s*=\s*\/dev\/log\s*$/) }
it { is_expected.to contain_file(fragment_file).with_content(/^set log_requests\s*=\s*true\s*$/) }
it { is_expected.to contain_file(fragment_file).with_content(/^workers\s*=\s*1\s*$/) }
it { is_expected.to contain_file(fragment_file).with_content(/^concurrency\s*=\s*1\s*$/) }
it { is_expected.to contain_file(fragment_file).with_content(/^pipeline\s*=\s*#{t}-server\s*$/) }
end
end
end
end