Blob Blame History Raw
From 7b1da66dcb4606f7ba7de37c6082aabe0465cbce Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Martin=20M=C3=A1gr?= <mmagr@redhat.com>
Date: Mon, 22 Sep 2014 15:50:38 +0200
Subject: [PATCH] Add manage_service feature

puppet-swift lacks of disabling service managing. This patch adds
$manage_service and $enabled parameter to all relevant classes.

Closes-bug: #1359823
Change-Id: I3d632e3a26e9394d03d94089ae704904bf77aa51
---
 swift/manifests/proxy.pp                           | 136 ++++++++++++-------
 swift/manifests/storage/account.pp                 |  35 ++++-
 swift/manifests/storage/container.pp               |  42 ++++--
 swift/manifests/storage/generic.pp                 |  35 ++++-
 swift/manifests/storage/object.pp                  |  35 ++++-
 swift/spec/classes/swift_proxy_spec.rb             |  74 +++++++++++
 swift/spec/classes/swift_storage_account_spec.rb   | 118 ++++++++++++-----
 swift/spec/classes/swift_storage_container_spec.rb | 147 +++++++++++++--------
 swift/spec/classes/swift_storage_object_spec.rb    | 117 +++++++++++-----
 9 files changed, 551 insertions(+), 188 deletions(-)

diff --git a/swift/manifests/proxy.pp b/swift/manifests/proxy.pp
index ff7405c..d89fea9 100644
--- a/swift/manifests/proxy.pp
+++ b/swift/manifests/proxy.pp
@@ -6,37 +6,65 @@
 #
 # Installs and configures the swift proxy node.
 #
-# [*Parameters*]
-#
-# [*proxy_local_net_ip*] The address that the proxy will bind to.
-#   Required.
-# [*port*] The port to which the proxy server will bind.
-#   Optional. Defaults to 8080.
-# [*pipeline*] The list of elements of the swift proxy pipeline.
-#   Currently supports healthcheck, cache, proxy-server, and
-#   one of the following auth_types: tempauth, swauth, keystone.
-#   Each of the specified elements also need to be declared externally
-#   as a puppet class with the exception of proxy-server.
-#   Optional. Defaults to ['healthcheck', 'cache', 'tempauth', 'proxy-server']
-# [*workers*] Number of threads to process requests.
-#  Optional. Defaults to the number of processors.
-# [*allow_account_management*]
-#   Rather or not requests through this proxy can create and
-#   delete accounts. Optional. Defaults to true.
-# [*account_autocreate*] Rather accounts should automatically be created.
-#  Has to be set to true for tempauth. Optional. Defaults to true.
-# [*read_affinity*]
-#  Configures the read affinity of proxy-server. Optional. Defaults to undef.
-# [*write_affinity*]
-#  Configures the write affinity of proxy-server. Optional. Defaults to undef.
-# [*write_affinity_node_count*]
-#  Configures write_affinity_node_count for proxy-server.
-#  Optional but requires write_affinity to be set. Defaults to undef.
-# [*package_ensure*] Ensure state of the swift proxy package.
-#   Optional. Defaults to present.
-# [*log_name*]
-#  Configures log_name for swift proxy-server.
-#  Optional. Defaults to proxy-server
+# == Parameters
+#
+#  [*proxy_local_net_ip*]
+#    The address that the proxy will bind to.
+#
+#  [*port*]
+#    (optional) The port to which the proxy server will bind.
+#    Defaults to 8080.
+#
+#  [*pipeline*]
+#    (optional) The list of elements of the swift proxy pipeline.
+#    Currently supports healthcheck, cache, proxy-server, and
+#    one of the following auth_types: tempauth, swauth, keystone.
+#    Each of the specified elements also need to be declared externally
+#    as a puppet class with the exception of proxy-server.
+#    Defaults to ['healthcheck', 'cache', 'tempauth', 'proxy-server']
+#
+#  [*workers*]
+#    (optional) Number of threads to process requests.
+#    Defaults to the number of processors.
+#
+#  [*allow_account_management*]
+#    (optional) Rather or not requests through this proxy can create and
+#    delete accounts.
+#    Defaults to true.
+#
+#  [*account_autocreate*]
+#    (optional) Rather accounts should automatically be created.
+#    Has to be set to true for tempauth.
+#    Defaults to true.
+#
+#  [*read_affinity*]
+#    (optional) Configures the read affinity of proxy-server.
+#    Defaults to undef.
+#
+#  [*write_affinity*]
+#    (optional) Configures the write affinity of proxy-server.
+#    Defaults to undef.
+#
+#  [*write_affinity_node_count*]
+#    (optional) Configures write_affinity_node_count for proxy-server.
+#    Optional but requires write_affinity to be set.
+#    Defaults to undef.
+#
+#  [*enabled*]
+#    (optional) Should the service be enabled.
+#    Defaults to true
+#
+#  [*manage_service*]
+#    (optional) Whether the service should be managed by Puppet.
+#    Defaults to true.
+#
+#  [*package_ensure*]
+#    (optional) Ensure state of the swift proxy package.
+#    Defaults to present.
+#
+#  [*log_name*]
+#    Configures log_name for swift proxy-server.
+#    Optional. Defaults to proxy-server
 #
 # == Examples
 #
@@ -50,23 +78,25 @@
 #
 class swift::proxy(
   $proxy_local_net_ip,
-  $port = '8080',
-  $pipeline = ['healthcheck', 'cache', 'tempauth', 'proxy-server'],
-  $workers = $::processorcount,
-  $allow_account_management = true,
-  $account_autocreate = true,
-  $log_headers = 'False',
-  $log_udp_host = '',
-  $log_udp_port = '',
-  $log_address = '/dev/log',
-  $log_level = 'INFO',
-  $log_facility = 'LOG_LOCAL1',
-  $log_handoffs = true,
-  $log_name = 'proxy-server',
-  $read_affinity = undef,
-  $write_affinity = undef,
+  $port                      = '8080',
+  $pipeline                  = ['healthcheck', 'cache', 'tempauth', 'proxy-server'],
+  $workers                   = $::processorcount,
+  $allow_account_management  = true,
+  $account_autocreate        = true,
+  $log_headers               = 'False',
+  $log_udp_host              = '',
+  $log_udp_port              = '',
+  $log_address               = '/dev/log',
+  $log_level                 = 'INFO',
+  $log_facility              = 'LOG_LOCAL1',
+  $log_handoffs              = true,
+  $log_name                  = 'proxy-server',
+  $read_affinity             = undef,
+  $write_affinity            = undef,
   $write_affinity_node_count = undef,
-  $package_ensure = 'present'
+  $manage_service            = true,
+  $enabled                   = true,
+  $package_ensure            = 'present'
 ) {
 
   include swift::params
@@ -130,10 +160,18 @@ class swift::proxy(
     before  => Class[$required_classes],
   }
 
+  if $manage_service {
+    if $enabled {
+      $service_ensure = 'running'
+    } else {
+      $service_ensure = 'stopped'
+    }
+  }
+
   service { 'swift-proxy':
-    ensure    => running,
+    ensure    => $service_ensure,
     name      => $::swift::params::proxy_service_name,
-    enable    => true,
+    enable    => $enabled,
     provider  => $::swift::params::service_provider,
     hasstatus => true,
     subscribe => Concat['/etc/swift/proxy-server.conf'],
diff --git a/swift/manifests/storage/account.pp b/swift/manifests/storage/account.pp
index 1ce6865..a4398c3 100644
--- a/swift/manifests/storage/account.pp
+++ b/swift/manifests/storage/account.pp
@@ -1,24 +1,51 @@
+# Class swift::storage::account
+#
+# == Parameters
+#  [*enabled*]
+#    (optional) Should the service be enabled.
+#    Defaults to true
+#
+#  [*manage_service*]
+#    (optional) Whether the service should be managed by Puppet.
+#    Defaults to true.
+#
+#  [*package_ensure*]
+#    (optional) Value of package resource parameter 'ensure'.
+#    Defaults to 'present'.
+#
 class swift::storage::account(
+  $manage_service = true,
+  $enabled        = true,
   $package_ensure = 'present'
 ) {
   swift::storage::generic { 'account':
+    manage_service => $manage_service,
+    enabled        => $enabled,
     package_ensure => $package_ensure,
   }
 
   include swift::params
 
+  if $manage_service {
+    if $enabled {
+      $service_ensure = 'running'
+    } else {
+      $service_ensure = 'stopped'
+    }
+  }
+
   service { 'swift-account-reaper':
-    ensure    => running,
+    ensure    => $service_ensure,
     name      => $::swift::params::account_reaper_service_name,
-    enable    => true,
+    enable    => $enabled,
     provider  => $::swift::params::service_provider,
     require   => Package['swift-account'],
   }
 
   service { 'swift-account-auditor':
-    ensure    => running,
+    ensure    => $service_ensure,
     name      => $::swift::params::account_auditor_service_name,
-    enable    => true,
+    enable    => $enabled,
     provider  => $::swift::params::service_provider,
     require   => Package['swift-account'],
   }
diff --git a/swift/manifests/storage/container.pp b/swift/manifests/storage/container.pp
index a4002d8..741dcba 100644
--- a/swift/manifests/storage/container.pp
+++ b/swift/manifests/storage/container.pp
@@ -1,31 +1,55 @@
 #
 # === Parameters
+#  [*enabled*]
+#    (optional) Should the service be enabled.
+#    Defaults to true
 #
-# [*allowed_sync_hosts*] A list of hosts allowed in the X-Container-Sync-To
-#   field for containers. Defaults to one entry list '127.0.0.1'.
+#  [*manage_service*]
+#    (optional) Whether the service should be managed by Puppet.
+#    Defaults to true.
+#
+#  [*package_ensure*]
+#    (optional) Value of package resource parameter 'ensure'.
+#    Defaults to 'present'.
+#
+#  [*allowed_sync_hosts*]
+#    (optional) A list of hosts allowed in the X-Container-Sync-To
+#    field for containers. Defaults to one entry list '127.0.0.1'.
 #
 class swift::storage::container(
-  $package_ensure = 'present',
+  $manage_service     = true,
+  $enabled            = true,
+  $package_ensure     = 'present',
   $allowed_sync_hosts = ['127.0.0.1'],
 ) {
   swift::storage::generic { 'container':
+    manage_service => $manage_service,
+    enabled        => $enabled,
     package_ensure => $package_ensure
   }
 
   include swift::params
 
+  if $manage_service {
+    if $enabled {
+      $service_ensure = 'running'
+    } else {
+      $service_ensure = 'stopped'
+    }
+  }
+
   service { 'swift-container-updater':
-    ensure    => running,
+    ensure    => $service_ensure,
     name      => $::swift::params::container_updater_service_name,
-    enable    => true,
+    enable    => $enabled,
     provider  => $::swift::params::service_provider,
     require   => Package['swift-container'],
   }
 
   service { 'swift-container-auditor':
-    ensure    => running,
+    ensure    => $service_ensure,
     name      => $::swift::params::container_auditor_service_name,
-    enable    => true,
+    enable    => $enabled,
     provider  => $::swift::params::service_provider,
     require   => Package['swift-container'],
   }
@@ -41,8 +65,8 @@ class swift::storage::container(
       target => '/lib/init/upstart-job',
     }
     service { 'swift-container-sync':
-      ensure    => running,
-      enable    => true,
+      ensure    => $service_ensure,
+      enable    => $enabled,
       provider  => $::swift::params::service_provider,
       require   => File['/etc/init/swift-container-sync.conf', '/etc/init.d/swift-container-sync']
     }
diff --git a/swift/manifests/storage/generic.pp b/swift/manifests/storage/generic.pp
index 2f84f2e..341bc5a 100644
--- a/swift/manifests/storage/generic.pp
+++ b/swift/manifests/storage/generic.pp
@@ -2,9 +2,20 @@
 # needed to deploy each type of storage server.
 #
 # == Parameters
-#  [*package_ensure*] The desired ensure state of the swift storage packages.
-#    Optional. Defaults to present.
-#  [*service_provider*] The provider to use for the service
+#  [*enabled*]
+#    (optional) Should the service be enabled.
+#    Defaults to true
+#
+#  [*manage_service*]
+#    (optional) Whether the service should be managed by Puppet.
+#    Defaults to true.
+#
+#  [*package_ensure*]
+#    (optional) The desired ensure state of the swift storage packages.
+#    Defaults to present.
+#
+#  [*service_provider*]
+#    (optional) The provider to use for the service
 #
 # == Dependencies
 #  Requires Class[swift::storage]
@@ -18,6 +29,8 @@
 #
 # Copyright 2011 Puppetlabs Inc, unless otherwise noted.
 define swift::storage::generic(
+  $manage_service   = true,
+  $enabled          = true,
   $package_ensure   = 'present',
   $service_provider = $::swift::params::service_provider
 ) {
@@ -42,19 +55,27 @@ define swift::storage::generic(
     group  => 'swift',
   }
 
+  if $manage_service {
+    if $enabled {
+      $service_ensure = 'running'
+    } else {
+      $service_ensure = 'stopped'
+    }
+  }
+
   service { "swift-${name}":
-    ensure    => running,
+    ensure    => $service_ensure,
     name      => inline_template("<%= scope.lookupvar('::swift::params::${name}_service_name') %>"),
-    enable    => true,
+    enable    => $enabled,
     hasstatus => true,
     provider  => $service_provider,
     subscribe => Package["swift-${name}"],
   }
 
   service { "swift-${name}-replicator":
-    ensure    => running,
+    ensure    => $service_ensure,
     name      => inline_template("<%= scope.lookupvar('::swift::params::${name}_replicator_service_name') %>"),
-    enable    => true,
+    enable    => $enabled,
     hasstatus => true,
     provider  => $service_provider,
     subscribe => Package["swift-${name}"],
diff --git a/swift/manifests/storage/object.pp b/swift/manifests/storage/object.pp
index 1e49101..587c60a 100644
--- a/swift/manifests/storage/object.pp
+++ b/swift/manifests/storage/object.pp
@@ -1,24 +1,51 @@
+# Class swift::storage::object
+#
+# == Parameters
+#  [*enabled*]
+#    (optional) Should the service be enabled.
+#    Defaults to true
+#
+#  [*manage_service*]
+#    (optional) Whether the service should be managed by Puppet.
+#    Defaults to true.
+#
+#  [*package_ensure*]
+#    (optional) Value of package resource parameter 'ensure'.
+#    Defaults to 'present'.
+#
 class swift::storage::object(
+  $manage_service = true,
+  $enabled        = true,
   $package_ensure = 'present'
 ) {
   swift::storage::generic { 'object':
+    manage_service => $manage_service,
+    enabled        => $enabled,
     package_ensure => $package_ensure
   }
 
   include swift::params
 
+  if $manage_service {
+    if $enabled {
+      $service_ensure = 'running'
+    } else {
+      $service_ensure = 'stopped'
+    }
+  }
+
   service { 'swift-object-updater':
-    ensure    => running,
+    ensure    => $service_ensure,
     name      => $::swift::params::object_updater_service_name,
-    enable    => true,
+    enable    => $enabled,
     provider  => $::swift::params::service_provider,
     require   => Package['swift-object'],
   }
 
   service { 'swift-object-auditor':
-    ensure    => running,
+    ensure    => $service_ensure,
     name      => $::swift::params::object_auditor_service_name,
-    enable    => true,
+    enable    => $enabled,
     provider  => $::swift::params::service_provider,
     require   => Package['swift-object'],
   }
diff --git a/swift/spec/classes/swift_proxy_spec.rb b/swift/spec/classes/swift_proxy_spec.rb
index a0b6f64..4dfe8b0 100644
--- a/swift/spec/classes/swift_proxy_spec.rb
+++ b/swift/spec/classes/swift_proxy_spec.rb
@@ -151,6 +151,80 @@ describe 'swift::proxy' do
         end
       end
     end
+  end
+
+  shared_examples_for 'swift-proxy' do
+    let :params do
+      { :proxy_local_net_ip => '127.0.0.1' }
+    end
+
+    [{ :enabled => true, :manage_service => true },
+     { :enabled => false, :manage_service => true }].each do |param_hash|
+      context "when service should be #{param_hash[:enabled] ? 'enabled' : 'disabled'}" do
+        before do
+          params.merge!(param_hash)
+        end
+
+        it 'configures swift-proxy service' do
+          should contain_service('swift-proxy').with(
+            :ensure    => (param_hash[:manage_service] && param_hash[:enabled]) ? 'running' : 'stopped',
+            :name      => platform_params[:service_name],
+            :provider  => platform_params[:service_provider],
+            :enable    => param_hash[:enabled],
+            :hasstatus => true,
+            :subscribe => 'Concat[/etc/swift/proxy-server.conf]'
+          )
+        end
+      end
+    end
+
+    context 'with disabled service managing' do
+      before do
+        params.merge!({
+          :manage_service => false,
+          :enabled        => false })
+      end
+
+      it 'configures swift-proxy service' do
+        should contain_service('swift-proxy').with(
+          :ensure    => nil,
+          :name      => platform_params[:service_name],
+          :provider  => platform_params[:service_provider],
+          :enable    => false,
+          :hasstatus => true,
+          :subscribe => 'Concat[/etc/swift/proxy-server.conf]'
+        )
+      end
+    end
+  end
+
+  context 'on Debian platforms' do
+    let :facts do
+      { :operatingsystem => 'Ubuntu',
+        :osfamily        => 'Debian',
+        :concat_basedir  => '/var/lib/puppet/concat' }
+    end
+
+    let :platform_params do
+      { :service_name     => 'swift-proxy',
+        :service_provider => 'upstart' }
+    end
+
+    it_configures 'swift-proxy'
+  end
+
+  context 'on RedHat platforms' do
+    let :facts do
+      { :osfamily        => 'RedHat',
+        :operatingsystem => 'RedHat',
+        :concat_basedir  => '/var/lib/puppet/concat' }
+    end
+
+    let :platform_params do
+      { :service_name     => 'openstack-swift-proxy',
+        :service_provider => nil }
+    end
 
+    it_configures 'swift-proxy'
   end
 end
diff --git a/swift/spec/classes/swift_storage_account_spec.rb b/swift/spec/classes/swift_storage_account_spec.rb
index 0623cc4..115fd6c 100644
--- a/swift/spec/classes/swift_storage_account_spec.rb
+++ b/swift/spec/classes/swift_storage_account_spec.rb
@@ -1,52 +1,106 @@
 require 'spec_helper'
-describe 'swift::storage::account' do
-
-  let :facts do
-    {
-      :operatingsystem => 'Ubuntu',
-      :osfamily        => 'Debian'
-    }
-  end
 
+describe 'swift::storage::account' do
   let :pre_condition do
     "class { 'ssh::server::install': }
      class { 'swift': swift_hash_suffix => 'foo' }
      class { 'swift::storage': storage_local_net_ip => '10.0.0.1' }"
   end
 
-  let :default_params do
-    {:package_ensure => 'present'}
+  let :params do
+    { :package_ensure => 'present',
+      :enabled        => true,
+      :manage_service => true }
   end
 
-  [{},
-   {:package_ensure => 'latest'}
-  ].each do |param_set|
-    describe "when #{param_set == {} ? "using default" : "specifying"} class parameters" do
-      let :param_hash do
-        default_params.merge(param_set)
+  shared_examples_for 'swift-storage-account' do
+
+    [{},
+     {:package_ensure => 'latest'}
+    ].each do |param_set|
+      describe "when #{param_set == {} ? "using default" : "specifying"} class parameters" do
+        before do
+          params.merge!(param_set)
+        end
+
+        it { should contain_swift__storage__generic('account').with_package_ensure(params[:package_ensure]) }
+      end
+    end
+
+    [{ :enabled => true, :manage_service => true },
+     { :enabled => false, :manage_service => true }].each do |param_hash|
+      context "when service should be #{param_hash[:enabled] ? 'enabled' : 'disabled'}" do
+        before do
+          params.merge!(param_hash)
+        end
+
+        it 'configures services' do
+          platform_params[:service_names].each do |service_alias, service_name|
+            should contain_service(service_alias).with(
+              :name    => service_name,
+              :ensure  => (param_hash[:manage_service] && param_hash[:enabled]) ? 'running' : 'stopped',
+              :enable  => param_hash[:enabled]
+            )
+          end
+        end
       end
-      let :params do
-        param_set
+    end
+
+    context 'with disabled service managing' do
+      before do
+        params.merge!({
+          :manage_service => false,
+          :enabled        => false })
+      end
+
+      it 'configures services' do
+        platform_params[:service_names].each do |service_alias, service_name|
+          should contain_service(service_alias).with(
+            :ensure    => nil,
+            :name      => service_name,
+            :enable    => false
+          )
+        end
       end
-      it { should contain_swift__storage__generic('account').with_package_ensure(param_hash[:package_ensure]) }
     end
   end
-  describe 'on rhel' do
+
+  context 'on Debian platforms' do
     let :facts do
-      {
-        :operatingsystem => 'RedHat',
-        :osfamily        => 'RedHat'
+      {:operatingsystem => 'Ubuntu',
+       :osfamily        => 'Debian' }
+
+    end
+
+    let :platform_params do
+      { :service_names => {
+          'swift-account'            => 'swift-account',
+          'swift-account-replicator' => 'swift-account-replicator',
+          'swift-account-reaper'     => 'swift-account-reaper',
+          'swift-account-auditor'    => 'swift-account-auditor'
+        }
       }
     end
-    it 'should have some support services' do
-      ['swift-account-reaper', 'swift-account-auditor'].each do |service|
-        should contain_service(service).with(
-          :name     => "openstack-#{service}",
-          :ensure   => 'running',
-          :enable   => true,
-          :require  => 'Package[swift-account]'
-        )
-      end
+
+    it_configures 'swift-storage-account'
+  end
+
+  context 'on RedHat platforms' do
+    let :facts do
+      { :osfamily        => 'RedHat',
+        :operatingsystem => 'RedHat' }
+    end
+
+    let :platform_params do
+      { :service_names => {
+          'swift-account'            => 'openstack-swift-account',
+          'swift-account-replicator' => 'openstack-swift-account-replicator',
+          'swift-account-reaper'     => 'openstack-swift-account-reaper',
+          'swift-account-auditor'    => 'openstack-swift-account-auditor'
+        }
+      }
     end
+
+    it_configures 'swift-storage-account'
   end
 end
diff --git a/swift/spec/classes/swift_storage_container_spec.rb b/swift/spec/classes/swift_storage_container_spec.rb
index 38c80b9..8551b97 100644
--- a/swift/spec/classes/swift_storage_container_spec.rb
+++ b/swift/spec/classes/swift_storage_container_spec.rb
@@ -1,43 +1,91 @@
 require 'spec_helper'
-describe 'swift::storage::container' do
-
-  let :facts do
-    {
-      :operatingsystem => 'Ubuntu',
-      :osfamily        => 'Debian'
-    }
-  end
 
+describe 'swift::storage::container' do
   let :pre_condition do
     "class { 'ssh::server::install': }
      class { 'swift': swift_hash_suffix => 'foo' }
      class { 'swift::storage': storage_local_net_ip => '10.0.0.1' }"
   end
 
-  let :default_params do
-    {:package_ensure => 'present'}
+  let :params do
+    { :package_ensure => 'present',
+      :enabled        => true,
+      :manage_service => true }
   end
 
-  [{},
-   {:package_ensure => 'latest'}
-  ].each do |param_set|
-    describe "when #{param_set == {} ? "using default" : "specifying"} class parameters" do
-      let :param_hash do
-        default_params.merge(param_set)
+  shared_examples_for 'swift-storage-container' do
+    [{},
+     {:package_ensure => 'latest'}
+    ].each do |param_set|
+      describe "when #{param_set == {} ? "using default" : "specifying"} class parameters" do
+        before do
+          params.merge!(param_set)
+        end
+
+        it { should contain_swift__storage__generic('container').with_package_ensure(params[:package_ensure]) }
       end
-      let :params do
-        param_set
+    end
+
+
+    [{ :enabled => true, :manage_service => true },
+     { :enabled => false, :manage_service => true }].each do |param_hash|
+      context "when service should be #{param_hash[:enabled] ? 'enabled' : 'disabled'}" do
+        before do
+          params.merge!(param_hash)
+        end
+
+        it 'configures services' do
+          platform_params[:service_names].each do |service_alias, service_name|
+            should contain_service(service_alias).with(
+              :name    => service_name,
+              :ensure  => (param_hash[:manage_service] && param_hash[:enabled]) ? 'running' : 'stopped',
+              :enable  => param_hash[:enabled]
+            )
+          end
+        end
       end
-      it { should contain_swift__storage__generic('container').with_package_ensure(param_hash[:package_ensure]) }
-      it 'should have some other services' do
-        ['swift-container-updater', 'swift-container-auditor'].each do |service|
-          should contain_service(service).with(
-            :ensure   => 'running',
-            :enable   => true,
-            :provider => 'upstart',
-            :require  => 'Package[swift-container]'
+    end
+
+    context 'with disabled service managing' do
+      before do
+        params.merge!({
+          :manage_service => false,
+          :enabled        => false })
+      end
+
+      it 'configures services' do
+        platform_params[:service_names].each do |service_alias, service_name|
+          should contain_service(service_alias).with(
+            :ensure    => nil,
+            :name      => service_name,
+            :enable    => false
           )
         end
+      end
+    end
+  end
+
+  context 'on Debian platforms' do
+    let :facts do
+      {:operatingsystem => 'Ubuntu',
+       :osfamily        => 'Debian' }
+
+    end
+
+    let :platform_params do
+      { :service_names => {
+          'swift-container'            => 'swift-container',
+          'swift-container-replicator' => 'swift-container-replicator',
+          'swift-container-updater'    => 'swift-container-updater',
+          'swift-container-auditor'    => 'swift-container-auditor'
+        }
+      }
+    end
+
+    it_configures 'swift-storage-container'
+
+    context 'Ubuntu specific resources' do
+      it 'configures sync' do
         should contain_service('swift-container-sync').with(
           :ensure   => 'running',
           :enable   => true,
@@ -56,26 +104,30 @@ describe 'swift::storage::container' do
     end
   end
 
-  describe 'on rhel' do
+  context 'on RedHat platforms' do
     let :facts do
-      {
+      { :osfamily        => 'RedHat',
         :operatingsystem => 'RedHat',
-        :osfamily        => 'RedHat',
-        :concat_basedir => '/var/lib/puppet/concat'
+        :concat_basedir => '/var/lib/puppet/concat' }
+    end
+
+    let :platform_params do
+      { :service_names => {
+          'swift-container'            => 'openstack-swift-container',
+          'swift-container-replicator' => 'openstack-swift-container-replicator',
+          'swift-container-updater'    => 'openstack-swift-container-updater',
+          'swift-container-auditor'    => 'openstack-swift-container-auditor'
+        }
       }
     end
-    it 'should have some support services' do
-      ['swift-container-updater', 'swift-container-auditor'].each do |service|
-        should contain_service(service).with(
-          :name     => "openstack-#{service}",
-          :ensure   => 'running',
-          :enable   => true,
-          :require  => 'Package[swift-container]'
-        )
+
+    it_configures 'swift-storage-container'
+
+    context 'RedHat specific resources' do
+      before do
+        params.merge!({ :allowed_sync_hosts => ['127.0.0.1', '10.1.0.1', '10.1.0.2'] })
       end
-    end
 
-    describe 'configuration file' do
       let :pre_condition do
         "class { 'ssh::server::install': }
          class { 'swift': swift_hash_suffix => 'foo' }
@@ -86,18 +138,9 @@ describe 'swift::storage::container' do
         "/var/lib/puppet/concat/_etc_swift_container-server.conf/fragments/00_swift-container-6001"
       end
 
-      it { should contain_file(fragment_file).with_content(/^allowed_sync_hosts = 127.0.0.1$/) }
-
-      describe 'with allowed_sync_hosts' do
-
-        let :params do
-          { :allowed_sync_hosts => ['127.0.0.1', '10.1.0.1', '10.1.0.2'], }
-        end
-
-        it {
-          should contain_file(fragment_file).with_content(/^allowed_sync_hosts = 127.0.0.1,10.1.0.1,10.1.0.2$/)
-        }
-      end
+      it {
+        should contain_file(fragment_file).with_content(/^allowed_sync_hosts = 127.0.0.1,10.1.0.1,10.1.0.2$/)
+      }
     end
   end
 end
diff --git a/swift/spec/classes/swift_storage_object_spec.rb b/swift/spec/classes/swift_storage_object_spec.rb
index 3309ea3..d98f948 100644
--- a/swift/spec/classes/swift_storage_object_spec.rb
+++ b/swift/spec/classes/swift_storage_object_spec.rb
@@ -1,12 +1,6 @@
 require 'spec_helper'
-describe 'swift::storage::object' do
 
-  let :facts do
-    {
-      :operatingsystem => 'Ubuntu',
-      :osfamily        => 'Debian'
-    }
-  end
+describe 'swift::storage::object' do
 
   let :pre_condition do
     "class { 'ssh::server::install': }
@@ -14,39 +8,100 @@ describe 'swift::storage::object' do
      class { 'swift::storage': storage_local_net_ip => '10.0.0.1' }"
   end
 
-  let :default_params do
-    {:package_ensure => 'present'}
+  let :params do
+    { :package_ensure => 'present',
+      :enabled        => true,
+      :manage_service => true }
   end
 
-  [{},
-   {:package_ensure => 'latest'}
-  ].each do |param_set|
-    describe "when #{param_set == {} ? "using default" : "specifying"} class parameters" do
-      let :param_hash do
-        default_params.merge(param_set)
+  shared_examples_for 'swift-storage-object' do
+
+    [{},
+     { :package_ensure => 'latest' }
+    ].each do |param_set|
+      describe "when #{param_set == {} ? "using default" : "specifying"} class parameters" do
+        before do
+          params.merge!(param_set)
+        end
+
+        it { should contain_swift__storage__generic('object').with_package_ensure(params[:package_ensure]) }
       end
-      let :params do
-        param_set
+    end
+
+    [{ :enabled => true, :manage_service => true },
+     { :enabled => false, :manage_service => true }].each do |param_hash|
+      context "when service should be #{param_hash[:enabled] ? 'enabled' : 'disabled'}" do
+        before do
+          params.merge!(param_hash)
+        end
+
+        it 'configures services' do
+          platform_params[:service_names].each do |service_alias, service_name|
+            should contain_service(service_alias).with(
+              :name    => service_name,
+              :ensure  => (param_hash[:manage_service] && param_hash[:enabled]) ? 'running' : 'stopped',
+              :enable  => param_hash[:enabled]
+            )
+          end
+        end
+      end
+    end
+
+    context 'with disabled service managing' do
+      before do
+        params.merge!({
+          :manage_service => false,
+          :enabled        => false })
+      end
+
+      it 'configures services' do
+        platform_params[:service_names].each do |service_alias, service_name|
+          should contain_service(service_alias).with(
+            :ensure    => nil,
+            :name      => service_name,
+            :enable    => false
+          )
+        end
       end
-      it { should contain_swift__storage__generic('object').with_package_ensure(param_hash[:package_ensure]) }
     end
   end
-  describe 'on rhel' do
+
+  context 'on Debian platforms' do
     let :facts do
-      {
-        :operatingsystem => 'RedHat',
-        :osfamily        => 'RedHat'
+      {:operatingsystem => 'Ubuntu',
+       :osfamily        => 'Debian' }
+
+    end
+
+    let :platform_params do
+      { :service_names => {
+          'swift-object'            => 'swift-object',
+          'swift-object-replicator' => 'swift-object-replicator',
+          'swift-object-updater'    => 'swift-object-updater',
+          'swift-object-auditor'    => 'swift-object-auditor'
+        }
       }
     end
-    it 'should have some support services' do
-      ['swift-object-updater', 'swift-object-auditor'].each do |service|
-        should contain_service(service).with(
-          :name     => "openstack-#{service}",
-          :ensure   => 'running',
-          :enable   => true,
-          :require  => 'Package[swift-object]'
-        )
-      end
+
+    it_configures 'swift-storage-object'
+  end
+
+  context 'on RedHat platforms' do
+    let :facts do
+      { :osfamily        => 'RedHat',
+        :operatingsystem => 'RedHat' }
+    end
+
+    let :platform_params do
+      { :service_names => {
+          'swift-object'            => 'openstack-swift-object',
+          'swift-object-replicator' => 'openstack-swift-object-replicator',
+          'swift-object-updater'    => 'openstack-swift-object-updater',
+          'swift-object-auditor'    => 'openstack-swift-object-auditor'
+        }
+      }
     end
+
+    it_configures 'swift-storage-object'
   end
 end