spec/chef/cookbooks/gitlab/recipes/gitlab-workhorse_spec.rb (708 lines of code) (raw):
require 'chef_helper'
RSpec.describe 'gitlab::gitlab-workhorse' do
let(:node_cpus) { 1 }
let(:chef_run) do
ChefSpec::SoloRunner.new(step_into: %w(runit_service)) do |node|
node.automatic['cpu']['total'] = node_cpus
end.converge('gitlab::default')
end
let(:default_vars) do
{
'SSL_CERT_DIR' => '/opt/gitlab/embedded/ssl/certs/',
'HOME' => '/var/opt/gitlab',
'PATH' => '/opt/gitlab/bin:/opt/gitlab/embedded/bin:/bin:/usr/bin'
}
end
let(:config_file) { '/var/opt/gitlab/gitlab-workhorse/config.toml' }
before do
allow(Gitlab).to receive(:[]).and_call_original
end
context 'by default' do
it 'creates a default VERSION file and restarts service' do
expect(chef_run).to create_version_file('Create version file for Workhorse').with(
version_file_path: '/var/opt/gitlab/gitlab-workhorse/VERSION',
version_check_cmd: '/opt/gitlab/embedded/bin/gitlab-workhorse --version'
)
expect(chef_run.version_file('Create version file for Workhorse')).to notify('runit_service[gitlab-workhorse]').to(:restart)
end
it 'includes both authSocket and authBackend arguments' do
expect(chef_run).to render_file("/opt/gitlab/sv/gitlab-workhorse/run").with_content { |content|
expect(content).to match(%r(-authSocket /var/opt/gitlab/gitlab-rails/sockets/gitlab.socket))
expect(content).to match(%r(-authBackend http://localhost:8080))
}
end
it 'does not include alternate document root' do
expect(chef_run).to render_file(config_file).with_content { |content|
expect(content).not_to match(/alt_document_root/)
}
end
it 'does not include shutdown timeout' do
expect(chef_run).to render_file(config_file).with_content { |content|
expect(content).not_to match(/shutdown_timeout/)
}
end
it 'does not include object storage configs' do
expect(chef_run).to render_file(config_file).with_content { |content|
expect(content).not_to match(/object_storage/)
}
end
it 'does not propagate correlation ID' do
expect(chef_run).to render_file(config_file).with_content { |content|
expect(content).not_to match(/propagateCorrelationID/)
}
end
it 'does not include config_command' do
expect(chef_run).to render_file(config_file).with_content { |content|
expect(content).not_to match(/config_command/)
}
end
it 'does not include metadata section' do
expect(chef_run).to render_file(config_file).with_content { |content|
expect(content).not_to match(/\[metadata\]/)
}
end
end
context 'user and group' do
context 'default values' do
it_behaves_like "enabled runit service", "gitlab-workhorse", "root", "root"
it_behaves_like 'enabled logged service', 'gitlab-workhorse', true, { log_directory_owner: 'git' }
end
context 'custom values' do
before do
stub_gitlab_rb(
user: {
username: 'foo',
group: 'bar'
}
)
end
it_behaves_like "enabled runit service", "gitlab-workhorse", "root", "root"
end
end
context 'log directory and runit group' do
context 'default values' do
it_behaves_like 'enabled logged service', 'gitlab-workhorse', true, { log_directory_owner: 'git' }
end
context 'custom values' do
before do
stub_gitlab_rb(
gitlab_workhorse: {
log_group: 'fugee'
}
)
end
it_behaves_like 'configured logrotate service', 'gitlab-workhorse', 'git', 'fugee'
it_behaves_like 'enabled logged service', 'gitlab-workhorse', true, { log_directory_owner: 'git', log_group: 'fugee' }
end
end
context 'with environment variables' do
context 'by default' do
it 'creates necessary env variable files' do
expect(chef_run).to create_env_dir('/opt/gitlab/etc/gitlab-workhorse/env').with_variables(default_vars)
end
context 'when a custom env variable is specified' do
before do
stub_gitlab_rb(gitlab_workhorse: { env: { 'IAM' => 'CUSTOMVAR' } })
end
it 'creates necessary env variable files' do
expect(chef_run).to create_env_dir('/opt/gitlab/etc/gitlab-workhorse/env').with_variables(
default_vars.merge(
{
'IAM' => 'CUSTOMVAR'
}
)
)
end
end
end
end
context 'with alternate document root' do
before do
stub_gitlab_rb(gitlab_workhorse: { alt_document_root: '/tmp/test' })
end
it 'includes alternate document root setting' do
expect(chef_run).to render_file(config_file).with_content { |content|
expect(content).to match(%r(alt_document_root = "/tmp/test"))
}
end
end
context 'with shutdown timeout' do
before do
stub_gitlab_rb(gitlab_workhorse: { shutdown_timeout: '60s' })
end
it 'includes alternate document root setting' do
expect(chef_run).to render_file(config_file).with_content { |content|
expect(content).to match(%r(shutdown_timeout = "60s"))
}
end
end
context 'auth_socket and auth_backend' do
context 'with only auth_socket specified' do
context "auth_socket set to legacy '' value" do
before do
stub_gitlab_rb(gitlab_workhorse: { auth_socket: "''" })
end
it 'includes both authSocket and authBackend arguments' do
expect(chef_run).to render_file("/opt/gitlab/sv/gitlab-workhorse/run").with_content { |content|
expect(content).to match(%r(-authSocket /var/opt/gitlab/gitlab-rails/sockets/gitlab.socket))
expect(content).to match(%r(-authBackend http://localhost:8080))
}
end
end
end
context 'with only auth_backend specified' do
before do
stub_gitlab_rb(gitlab_workhorse: { auth_backend: 'https://test.example.com:8080' })
end
it 'omits authSocket argument' do
expect(chef_run).to render_file("/opt/gitlab/sv/gitlab-workhorse/run").with_content { |content|
expect(content).not_to match(/\-authSocket/)
expect(content).to match(%r(-authBackend https://test.example.com:8080))
}
end
end
context "with nil auth_socket" do
before do
stub_gitlab_rb(gitlab_workhorse: { auth_socket: nil })
end
it 'includes both authSocket and authBackend arguments' do
expect(chef_run).to render_file("/opt/gitlab/sv/gitlab-workhorse/run").with_content { |content|
expect(content).to match(%r(-authSocket /var/opt/gitlab/gitlab-rails/sockets/gitlab.socket))
expect(content).to match(%r(-authBackend http://localhost:8080))
}
end
context 'with auth_backend specified' do
before do
stub_gitlab_rb(gitlab_workhorse: { auth_socket: nil, auth_backend: 'https://test.example.com:8080' })
end
it 'omits authSocket argument' do
expect(chef_run).to render_file("/opt/gitlab/sv/gitlab-workhorse/run").with_content { |content|
expect(content).not_to match(/\-authSocket/)
expect(content).to match(%r(-authBackend https://test.example.com:8080))
}
end
end
end
context 'with auth_backend and auth_socket set' do
before do
stub_gitlab_rb(gitlab_workhorse: { auth_socket: '/tmp/test.socket', auth_backend: 'https://test.example.com:8080' })
end
it 'includes both authSocket and authBackend arguments' do
expect(chef_run).to render_file("/opt/gitlab/sv/gitlab-workhorse/run").with_content { |content|
expect(content).to match(%r(-authSocket /tmp/test.socket))
expect(content).to match(%r(-authBackend https://test.example.com:8080))
}
end
end
end
context 'consolidated object store settings' do
using RSpec::Parameterized::TableSyntax
include_context 'object storage config'
before do
stub_gitlab_rb(
gitlab_rails: {
object_store: {
enabled: true,
connection: connection_hash,
objects: object_config
}
}
)
end
context 'with S3 config' do
where(:access_key, :secret) do
"" | ""
nil | nil
"AKIAKIAKI" | 'secret123'
'3_FTW\s3.test1234' | 'T_PW\s3.test1234'
end
with_them do
let(:connection_hash) do
{
'provider' => 'AWS',
'region' => 'eu-west-1',
'aws_access_key_id' => access_key,
'aws_secret_access_key' => secret
}
end
let(:expected_access_key) { (access_key || '').to_json }
let(:expected_secret) { (secret || '').to_json }
it 'includes S3 credentials' do
expect(chef_run).to render_file(config_file).with_content { |content|
expect(content).to include(%([object_storage]\n provider = "AWS"\n))
expect(content).to include(%([object_storage.s3]\n aws_access_key_id = #{expected_access_key}\n aws_secret_access_key = #{expected_secret}\n))
}
end
end
end
context 'with Azure config' do
where(:account_name, :access_key) do
# Azure doesn't yet support Managed Identities (https://gitlab.com/gitlab-org/gitlab/-/issues/242245), but
# handle nil values gracefully.
"" | ""
nil | nil
"testaccount" | "1234abcd"
'3_FTW\s3.test1234' | 'T_PW\s3.test1234'
end
with_them do
let(:connection_hash) do
{
'provider' => 'AzureRM',
'azure_storage_account_name' => account_name,
'azure_storage_access_key' => access_key
}
end
let(:expected_account_name) { (account_name || '').to_json }
let(:expected_access_key) { (access_key || '').to_json }
it 'includes Azure credentials' do
expect(chef_run).to render_file(config_file).with_content { |content|
expect(content).to include(%([object_storage]\n provider = "AzureRM"\n))
expect(content).to include(%([object_storage.azurerm]\n azure_storage_account_name = #{expected_account_name}\n azure_storage_access_key = #{expected_access_key}\n))
}
end
end
end
context 'with Google Cloud config' do
where(:parameter_name, :parameter_value) do
'google_application_default' | true
'google_application_default' | ''
'google_application_default' | nil
'google_json_key_string' | 'test'
'google_json_key_string' | ''
'google_json_key_string' | nil
'google_json_key_location' | 'test'
'google_json_key_location' | ''
'google_json_key_location' | nil
end
with_them do
let(:connection_hash) do
{
'provider' => 'Google',
parameter_name => parameter_value
}
end
let(:expected_parameter_value) do
if parameter_name == 'google_json_key_string'
"'''#{parameter_value}'''"
else
parameter_value.to_json
end
end
if params[:parameter_value].nil?
it 'does not include object storage config' do
expect(chef_run).to render_file(config_file).with_content { |content|
expect(content).not_to include(%([object_storage]))
}
end
else
it 'includes the proper google configuration' do
expect(chef_run).to render_file(config_file).with_content { |content|
expect(content).to include(%([object_storage]\n provider = "Google"\n))
expect(content).to include(%([object_storage.google]\n #{parameter_name} = #{expected_parameter_value}))
}
end
end
end
end
end
context 'without api rate limiting' do
it 'correctly renders out the workhorse service file' do
expect(chef_run).not_to render_file("/opt/gitlab/sv/gitlab-workhorse/run").with_content(/\-apiLimit/)
expect(chef_run).not_to render_file("/opt/gitlab/sv/gitlab-workhorse/run").with_content(/\-apiQueueDuration/)
expect(chef_run).not_to render_file("/opt/gitlab/sv/gitlab-workhorse/run").with_content(/\-apiQueueLimit/)
end
end
context 'with api rate limiting' do
before do
stub_gitlab_rb(gitlab_workhorse: { api_limit: 3, api_queue_limit: 6, api_queue_duration: '1m' })
end
it 'correctly renders out the workhorse service file' do
expect(chef_run).to render_file("/opt/gitlab/sv/gitlab-workhorse/run").with_content(/\-apiLimit 3 \\/)
expect(chef_run).to render_file("/opt/gitlab/sv/gitlab-workhorse/run").with_content(/\-apiQueueDuration 1m \\/)
expect(chef_run).to render_file("/opt/gitlab/sv/gitlab-workhorse/run").with_content(/\-apiQueueLimit 6 \\/)
end
end
context 'without prometheus listen address' do
before do
stub_gitlab_rb(gitlab_workhorse: { prometheus_listen_addr: '' })
end
it 'correctly renders out the workhorse service file' do
expect(chef_run).to render_file("/opt/gitlab/sv/gitlab-workhorse/run")
expect(chef_run).not_to render_file("/opt/gitlab/sv/gitlab-workhorse/run").with_content(/\-prometheusListenAddr/)
end
end
context 'with prometheus listen address' do
before do
stub_gitlab_rb(gitlab_workhorse: { prometheus_listen_addr: ':9229' })
end
it 'correctly renders out the workhorse service file' do
expect(chef_run).to render_file("/opt/gitlab/sv/gitlab-workhorse/run").with_content(/\-prometheusListenAddr :9229 \\/)
end
end
context 'without api ci long polling duration defined' do
it 'correctly renders out the workhorse service file' do
expect(chef_run).not_to render_file("/opt/gitlab/sv/gitlab-workhorse/run").with_content(/\-apiCiLongPollingDuration/)
end
end
context 'with api ci long polling duration defined' do
before do
stub_gitlab_rb(gitlab_workhorse: { api_ci_long_polling_duration: "60s" })
end
it 'correctly renders out the workhorse service file' do
expect(chef_run).to render_file("/opt/gitlab/sv/gitlab-workhorse/run").with_content(/\-apiCiLongPollingDuration 60s/)
end
end
context 'with propagate_correlation_id enabled' do
before do
stub_gitlab_rb(gitlab_workhorse: { propagate_correlation_id: true })
end
it 'correctly renders out the workhorse service file' do
expect(chef_run).to render_file("/opt/gitlab/sv/gitlab-workhorse/run").with_content(/\-propagateCorrelationID/)
end
context 'with trusted_cidrs_for_propagation defined' do
before do
stub_gitlab_rb(gitlab_workhorse: {
propagate_correlation_id: true,
trusted_cidrs_for_propagation: %w(127.0.0.1/32 192.168.0.1/8)
})
end
it 'correctly renders out the workhorse service file' do
expect(chef_run).to render_file("/opt/gitlab/sv/gitlab-workhorse/run").with_content(/\-propagateCorrelationID/)
end
it 'should generate an array in the config file' do
expect(chef_run).to render_file("/var/opt/gitlab/gitlab-workhorse/config.toml").with_content { |content|
expect(content).to include(%(trusted_cidrs_for_propagation = ["127.0.0.1/32","192.168.0.1/8"]))
expect(content).not_to include(%(trusted_cidrs_for_x_forwarded_for))
}
end
end
context 'with trusted_cidrs_for_propagation and trusted_cidrs_for_x_forwarded_for defined' do
before do
stub_gitlab_rb(gitlab_workhorse: {
propagate_correlation_id: true,
trusted_cidrs_for_propagation: %w(127.0.0.1/32 192.168.0.1/8),
trusted_cidrs_for_x_forwarded_for: %w(1.2.3.4/16 5.6.7.8/24)
})
end
it 'correctly renders out the workhorse service file' do
expect(chef_run).to render_file("/opt/gitlab/sv/gitlab-workhorse/run").with_content(/\-propagateCorrelationID/)
end
it 'should generate arrays in the config file' do
expect(chef_run).to render_file("/var/opt/gitlab/gitlab-workhorse/config.toml").with_content { |content|
expect(content).to include(%(trusted_cidrs_for_propagation = ["127.0.0.1/32","192.168.0.1/8"]))
expect(content).to include(%(trusted_cidrs_for_x_forwarded_for = ["1.2.3.4/16","5.6.7.8/24"]))
}
end
end
end
context 'with log format defined as json' do
before do
stub_gitlab_rb(gitlab_workhorse: { log_format: "json" })
end
it 'correctly renders out the workhorse service file' do
expect(chef_run).to render_file("/opt/gitlab/sv/gitlab-workhorse/run").with_content(/\-logFormat json/)
end
it 'renders svlogd file which will not prepend timestamp' do
expect(chef_run).not_to render_file("/opt/gitlab/sv/gitlab-workhorse/log/run").with_content(/\-tt/)
end
end
context 'with log format defined as text' do
before do
stub_gitlab_rb(gitlab_workhorse: { log_format: "text" })
end
it 'correctly renders out the workhorse service file' do
expect(chef_run).to render_file("/opt/gitlab/sv/gitlab-workhorse/run").with_content(/\-logFormat text/)
end
it 'renders svlogd file which will prepend timestamp' do
expect(chef_run).to render_file("/opt/gitlab/sv/gitlab-workhorse/log/run").with_content(/\-tt/)
end
end
context 'with default value for working directory' do
it 'should generate config file in the correct directory' do
expect(chef_run).to render_file(config_file)
end
end
context 'with working directory specified' do
before do
stub_gitlab_rb(gitlab_workhorse: { dir: "/home/random/dir" })
end
it 'should generate config file in the correct directory' do
expect(chef_run).to render_file("/home/random/dir/config.toml")
end
end
context 'with default values for redis' do
it 'should generate config file' do
content_url = 'URL = "unix:///var/opt/gitlab/redis/redis.socket"'
expect(chef_run).to render_file(config_file).with_content(content_url)
expect(chef_run).not_to render_file(config_file).with_content(/Sentinel/)
end
it 'should pass config file to workhorse' do
expect(chef_run).to render_file("/opt/gitlab/sv/gitlab-workhorse/run").with_content(/\-config config.toml/)
end
end
context 'with host/port/password values for redis specified and socket disabled' do
before do
stub_gitlab_rb(
gitlab_rails: {
redis_host: "10.0.15.1",
redis_port: "1234",
redis_password: 'examplepassword'
}
)
end
it 'should generate config file with the specified values' do
content_url = 'URL = "redis://:examplepassword@10.0.15.1:1234/"'
content_password = 'Password = "examplepassword"'
content_sentinel = 'Sentinel'
content_sentinel_master = 'SentinelMaster'
expect(chef_run).to render_file("/var/opt/gitlab/gitlab-workhorse/config.toml").with_content(content_url)
expect(chef_run).to render_file("/var/opt/gitlab/gitlab-workhorse/config.toml").with_content(content_password)
expect(chef_run).not_to render_file("/var/opt/gitlab/gitlab-workhorse/config.toml").with_content(content_sentinel)
expect(chef_run).not_to render_file("/var/opt/gitlab/gitlab-workhorse/config.toml").with_content(content_sentinel_master)
end
end
context 'with socket for redis specified' do
before do
stub_gitlab_rb(gitlab_rails: { redis_socket: "/home/random/path.socket", redis_password: 'examplepassword' })
end
it 'should generate config file with the specified values' do
content_url = 'URL = "unix://:examplepassword@/home/random/path.socket"'
content_password = 'Password = "examplepassword"'
expect(chef_run).to render_file("/var/opt/gitlab/gitlab-workhorse/config.toml").with_content(content_url)
expect(chef_run).to render_file("/var/opt/gitlab/gitlab-workhorse/config.toml").with_content(content_password)
expect(chef_run).not_to render_file("/var/opt/gitlab/gitlab-workhorse/config.toml").with_content(/Sentinel/)
expect(chef_run).not_to render_file("/var/opt/gitlab/gitlab-workhorse/config.toml").with_content(/SentinelMaster/)
end
end
context 'with Sentinels specified with default master' do
before do
stub_gitlab_rb(
gitlab_rails: {
redis_sentinels: [
{ 'host' => '127.0.0.1', 'port' => 2637 },
{ 'host' => '127.0.8.1', 'port' => 1234 }
]
}
)
end
it 'should generate config file with the specified values' do
content = 'Sentinel = ["redis://127.0.0.1:2637","redis://127.0.8.1:1234"]'
content_url = 'URL ='
content_sentinel_master = 'SentinelMaster = "gitlab-redis"'
expect(chef_run).to render_file("/var/opt/gitlab/gitlab-workhorse/config.toml").with_content(content)
expect(chef_run).to render_file("/var/opt/gitlab/gitlab-workhorse/config.toml").with_content(content_sentinel_master)
expect(chef_run).not_to render_file("/var/opt/gitlab/gitlab-workhorse/config.toml").with_content(content_url)
end
end
context 'with Sentinels and master specified' do
before do
stub_gitlab_rb(
gitlab_rails: {
redis_sentinels: [
{ 'host' => '127.0.0.1', 'port' => 26379 },
{ 'host' => '127.0.8.1', 'port' => 12345 }
]
},
redis: {
master_name: 'examplemaster',
master_password: 'examplepassword'
}
)
end
it 'should generate config file with the specified values' do
content = 'Sentinel = ["redis://127.0.0.1:26379","redis://127.0.8.1:12345"]'
content_sentinel_master = 'SentinelMaster = "examplemaster"'
content_sentinel_password = 'Password = "examplepassword"'
content_url = 'URL ='
expect(chef_run).to render_file("/var/opt/gitlab/gitlab-workhorse/config.toml").with_content(content)
expect(chef_run).to render_file("/var/opt/gitlab/gitlab-workhorse/config.toml").with_content(content_sentinel_master)
expect(chef_run).to render_file("/var/opt/gitlab/gitlab-workhorse/config.toml").with_content(content_sentinel_password)
expect(chef_run).not_to render_file("/var/opt/gitlab/gitlab-workhorse/config.toml").with_content(content_url)
end
end
context 'with Sentinels password specified' do
before do
stub_gitlab_rb(
gitlab_rails: {
redis_sentinels: [
{ 'host' => '127.0.0.1', 'port' => 26379 },
{ 'host' => '127.0.8.1', 'port' => 12345 }
],
redis_sentinels_password: 'some pass'
},
redis: {
master_name: 'examplemaster',
master_password: 'examplepassword'
}
)
end
it 'should generate config file with the specified values' do
content = 'Sentinel = ["redis://:some%20pass@127.0.0.1:26379","redis://:some%20pass@127.0.8.1:12345"]'
content_sentinel_master = 'SentinelMaster = "examplemaster"'
content_password = 'Password = "examplepassword"'
content_sentinel_password = 'SentinelPassword = "some pass"'
content_url = 'URL ='
expect(chef_run).to render_file("/var/opt/gitlab/gitlab-workhorse/config.toml").with_content(content)
expect(chef_run).to render_file("/var/opt/gitlab/gitlab-workhorse/config.toml").with_content(content_password)
expect(chef_run).to render_file("/var/opt/gitlab/gitlab-workhorse/config.toml").with_content(content_sentinel_master)
expect(chef_run).to render_file("/var/opt/gitlab/gitlab-workhorse/config.toml").with_content(content_sentinel_password)
expect(chef_run).not_to render_file("/var/opt/gitlab/gitlab-workhorse/config.toml").with_content(content_url)
end
end
context 'with separate workhorse redis details specified' do
context 'with standalone redis defined' do
before do
stub_gitlab_rb(
gitlab_rails: {
redis_sentinels: [
{ 'host' => '127.0.0.1', 'port' => 26379 },
{ 'host' => '127.0.8.1', 'port' => 12345 }
],
redis_workhorse_instance: "unix:/home/random/path.socket",
redis_workhorse_password: 'some pass'
},
redis: {
master_name: 'examplemaster',
master_password: 'examplepassword'
}
)
end
it 'should generate config file with the specified values' do
content_url = 'URL = "unix://:some%20pass@/home/random/path.socket"'
content_password = 'Password = "some pass"'
expect(chef_run).to render_file("/var/opt/gitlab/gitlab-workhorse/config.toml").with_content(content_url)
expect(chef_run).to render_file("/var/opt/gitlab/gitlab-workhorse/config.toml").with_content(content_password)
expect(chef_run).not_to render_file("/var/opt/gitlab/gitlab-workhorse/config.toml").with_content(/Sentinel/)
expect(chef_run).not_to render_file("/var/opt/gitlab/gitlab-workhorse/config.toml").with_content(/SentinelMaster/)
end
end
context 'with sentinels defined' do
before do
stub_gitlab_rb(
gitlab_rails: {
redis_sentinels: [
{ 'host' => '127.0.0.1', 'port' => 26379 },
{ 'host' => '127.0.8.1', 'port' => 12345 }
],
redis_sentinels_password: 'some pass',
redis_workhorse_sentinels: [
{ 'host' => '127.0.0.2', 'port' => 26379 },
{ 'host' => '127.0.8.2', 'port' => 12345 }
],
redis_workhorse_sentinels_password: 'some workhorse pass',
redis_workhorse_sentinel_master: 'worhorse.master'
},
redis: {
master_name: 'examplemaster',
master_password: 'examplepassword'
}
)
end
it 'should generate config file with the specified values' do
content = 'Sentinel = ["redis://:some%20workhorse%20pass@127.0.0.2:26379","redis://:some%20workhorse%20pass@127.0.8.2:12345"]'
content_sentinel_master = 'SentinelMaster = "worhorse.master"'
content_sentinel_password = 'Password = "some workhorse pass"'
content_url = 'URL ='
expect(chef_run).to render_file("/var/opt/gitlab/gitlab-workhorse/config.toml").with_content(content)
expect(chef_run).to render_file("/var/opt/gitlab/gitlab-workhorse/config.toml").with_content(content_sentinel_master)
expect(chef_run).to render_file("/var/opt/gitlab/gitlab-workhorse/config.toml").with_content(content_sentinel_password)
expect(chef_run).not_to render_file("/var/opt/gitlab/gitlab-workhorse/config.toml").with_content(content_url)
end
end
end
context 'image scaler' do
context 'with default values' do
it 'sets the default maximum file size' do
expect(chef_run).to render_file(config_file).with_content { |content|
expect(content).to match(/\[image_resizer\]\n max_scaler_procs = \d+\n max_filesize = 250000/m)
}
end
context 'when reported CPU cores are at least 4' do
let(:node_cpus) { 4 }
it 'sets default max procs to half the number of cores' do
expect(chef_run).to render_file(config_file).with_content { |content|
expect(content).to match(/\[image_resizer\]\n max_scaler_procs = 2/m)
}
end
end
context 'when reported CPU cores are less than 4' do
let(:node_cpus) { 3 }
it 'pins default max procs to 2' do
expect(chef_run).to render_file(config_file).with_content { |content|
expect(content).to match(/\[image_resizer\]\n max_scaler_procs = 2/m)
}
end
end
end
context 'with custom values' do
before do
stub_gitlab_rb(
gitlab_workhorse: {
image_scaler_max_procs: 5,
image_scaler_max_filesize: 1024
}
)
end
it 'should generate config file with the specified values' do
expect(chef_run).to render_file(config_file).with_content { |content|
expect(content).to match(/\[image_resizer\]\n max_scaler_procs = 5\n max_filesize = 1024/m)
}
end
end
end
context 'with workhorse keywatcher enabled' do
before do
stub_gitlab_rb(
gitlab_workhorse: {
workhorse_keywatcher: true,
}
)
end
it 'should generate redis block in the configuration file' do
expect(chef_run).to render_file(config_file).with_content { |content|
expect(content).to match(/\[redis\]/m)
}
end
end
context 'with workhorse keywatcher disabled' do
before do
stub_gitlab_rb(
gitlab_workhorse: {
workhorse_keywatcher: false,
}
)
end
it 'should not generate redis block in the configuration file' do
expect(chef_run).to render_file(config_file).with_content { |content|
expect(content).not_to match(/\[redis\]/m)
}
end
end
context 'with config_command specified' do
before do
stub_gitlab_rb(
gitlab_workhorse: {
extra_config_command: "/opt/workhorse-redis-config.sh"
}
)
end
it 'specifies config_command in the config file' do
expect(chef_run).to render_file(config_file).with_content { |content|
expect(content).to match(%r(config_command = "/opt/workhorse-redis-config.sh"))
}
end
end
context 'with metadata_zip_reader_limit_bytes specified' do
before do
stub_gitlab_rb(
gitlab_workhorse: {
metadata_zip_reader_limit_bytes: 209715200
}
)
end
it 'specifies zip_reader_limit_bytes in the config file' do
expect(chef_run).to render_file(config_file).with_content { |content|
expect(content).to match(%r(\[metadata\]\n zip_reader_limit_bytes = 209715200))
}
end
end
include_examples "consul service discovery", "gitlab_workhorse", "workhorse"
end