require 'spec_helper'

describe 'glance::backend::s3' do
  let :facts do
    @default_facts.merge({
        :osfamily       => 'Debian',
    })
  end

  let :params do
    {
      :access_key => 'access',
      :secret_key => 'secret',
      :host       => 'host',
      :bucket     => 'bucket'
    }
  end

  describe 'when default parameters' do

    it 'configures glance-api.conf' do
      is_expected.to contain_glance_api_config('glance_store/default_store').with_value('s3')
      is_expected.to contain_glance_api_config('glance_store/s3_store_access_key').with_value('access')
      is_expected.to contain_glance_api_config('glance_store/s3_store_secret_key').with_value('secret')
      is_expected.to contain_glance_api_config('glance_store/s3_store_host').with_value('host')
      is_expected.to contain_glance_api_config('glance_store/s3_store_bucket').with_value('bucket')
      is_expected.to contain_glance_api_config('glance_store/s3_store_bucket_url_format').with_value('subdomain')
      is_expected.to contain_glance_api_config('glance_store/s3_store_create_bucket_on_put').with_value('false')
      is_expected.to contain_glance_api_config('glance_store/s3_store_large_object_size').with_value('100')
      is_expected.to contain_glance_api_config('glance_store/s3_store_large_object_chunk_size').with_value('10')
      is_expected.to contain_glance_api_config('glance_store/s3_store_object_buffer_dir').with_value(nil)
      is_expected.to contain_glance_api_config('glance_store/s3_store_thread_pools').with_value('10')
    end

  end

  describe 'when overriding parameters' do
    let :params do
      {
        :access_key               => 'access2',
        :secret_key               => 'secret2',
        :host                     => 'host2',
        :bucket                   => 'bucket2',
        :bucket_url_format        => 'path',
        :create_bucket_on_put     => true,
        :large_object_size        => 200,
        :large_object_chunk_size  => 20,
        :object_buffer_dir        => '/tmp',
        :thread_pools             => 20,
        :default_store            => false
      }
    end

    it 'configures glance-api.conf' do
      is_expected.to contain_glance_api_config('glance_store/s3_store_access_key').with_value('access2')
      is_expected.to contain_glance_api_config('glance_store/s3_store_secret_key').with_value('secret2')
      is_expected.to contain_glance_api_config('glance_store/s3_store_host').with_value('host2')
      is_expected.to contain_glance_api_config('glance_store/s3_store_bucket').with_value('bucket2')
      is_expected.to contain_glance_api_config('glance_store/s3_store_bucket_url_format').with_value('path')
      is_expected.to contain_glance_api_config('glance_store/s3_store_create_bucket_on_put').with_value('true')
      is_expected.to contain_glance_api_config('glance_store/s3_store_large_object_size').with_value('200')
      is_expected.to contain_glance_api_config('glance_store/s3_store_large_object_chunk_size').with_value('20')
      is_expected.to contain_glance_api_config('glance_store/s3_store_object_buffer_dir').with_value('/tmp')
      is_expected.to contain_glance_api_config('glance_store/s3_store_thread_pools').with_value('20')
      is_expected.to_not contain_glance_api_config('glance_store/default_store')
    end

  end

  describe 'with invalid bucket_url_format' do
    let :params do
      {
        :access_key               => 'access',
        :secret_key               => 'secret',
        :host                     => 'host',
        :bucket                   => 'bucket',
        :bucket_url_format        => 'invalid'
      }
    end

    it 'throws errors' do
      is_expected.to raise_error(Puppet::Error, /glance::backend::s3::bucket_url_format must be either "subdomain" or "path"/)
    end
  end

  describe 'with invalid large_object_chunk_size' do
    let :params do
      {
        :access_key               => 'access',
        :secret_key               => 'secret',
        :host                     => 'host',
        :bucket                   => 'bucket',
        :large_object_chunk_size  => 1
      }
    end

    it 'throws error' do
      is_expected.to raise_error(Puppet::Error, /glance::backend::s3::large_object_chunk_size must be an integer >= 5/)
    end
  end

  describe 'with non-integer large_object_chunk_size' do
    let :params do
      {
        :access_key               => 'access',
        :secret_key               => 'secret',
        :host                     => 'host',
        :bucket                   => 'bucket',
        :large_object_chunk_size  => 'string'
      }
    end

    it 'throws error' do
      is_expected.to raise_error(Puppet::Error, /glance::backend::s3::large_object_chunk_size must be an integer >= 5/)
    end
  end
end
