require 'spec_helper'

describe 'swift::storage::container' do
  let :pre_condition do
    "class { 'swift': swift_hash_suffix => 'foo' }
     class { 'swift::storage': storage_local_net_ip => '10.0.0.1' }"
  end

  let :params do
    { :package_ensure => 'present',
      :enabled        => true,
      :manage_service => true }
  end

  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 { is_expected.to contain_swift__storage__generic('container').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 is_expected.to 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|
            is_expected.to contain_service(service_alias).with(
              :name    => service_name,
              :ensure  => (param_hash[:manage_service] && param_hash[:enabled]) ? 'running' : 'stopped',
              :enable  => param_hash[:enabled],
              :tag     => 'swift-service',
            )
          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|
          is_expected.to contain_service(service_alias).with(
            :ensure    => nil,
            :name      => service_name,
            :enable    => false,
            :tag       => 'swift-service',
          )
        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
        is_expected.to contain_service('swift-container-sync').with(
          :ensure   => 'running',
          :enable   => true,
          :provider => 'upstart',
          :require  => ['File[/etc/init/swift-container-sync.conf]', 'File[/etc/init.d/swift-container-sync]']
        )
        is_expected.to contain_file('/etc/init/swift-container-sync.conf').with(
          :source  => 'puppet:///modules/swift/swift-container-sync.conf.upstart',
          :require => 'Package[swift-container]'
        )
        is_expected.to contain_file('/etc/init.d/swift-container-sync').with(
          :ensure => 'link',
          :target => '/lib/init/upstart-job'
        )
      end
    end
  end

  context 'on RedHat platforms' do
    let :facts do
      { :osfamily        => 'RedHat',
        :operatingsystem => 'RedHat' }
    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_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

      let :pre_condition do
         "class { 'swift': swift_hash_suffix => 'foo' }
         class { 'swift::storage::all': storage_local_net_ip => '10.0.0.1' }"
      end

      let :fragment_file do
        "/var/lib/puppet/concat/_etc_swift_container-server.conf/fragments/00_swift-container-6001"
      end

      it {
        is_expected.to contain_file(fragment_file).with_content(/^allowed_sync_hosts = 127.0.0.1,10.1.0.1,10.1.0.2$/)
      }
    end
  end
end