spec/chef/cookbooks/gitlab/recipes/default_spec.rb (348 lines of code) (raw):

require 'chef_helper' RSpec.describe 'gitlab::default' do let(:chef_run) { ChefSpec::SoloRunner.converge('gitlab::default') } before do allow(Gitlab).to receive(:[]).and_call_original end it 'creates the user config directory' do expect(chef_run).to create_directory('/etc/gitlab').with( user: 'root', group: 'root', mode: '0775' ) end it 'creates the var opt data config directory' do expect(chef_run).to create_directory('Create /var/opt/gitlab').with( path: '/var/opt/gitlab', user: 'root', group: 'root', mode: '0755' ) end context 'with gitconfig' do shared_examples 'a rendered system-level gitconfig' do before do stub_gitlab_rb(gitlab_config) end it 'creates the system gitconfig directory' do expect(chef_run).to create_directory('/opt/gitlab/embedded/etc').with( user: 'root', group: 'root', mode: '0755' ) end it 'creates the gitconfig file' do expect(chef_run).to create_template('/opt/gitlab/embedded/etc/gitconfig').with( source: 'gitconfig-system.erb', variables: { gitconfig: expected_params }, mode: 0755 ) end it 'renders the gitconfig file' do expect(chef_run).to render_file('/opt/gitlab/embedded/etc/gitconfig').with_content { |content| expect(content).to match(expected_content) } end end context 'with default gitconfig' do let(:gitlab_config) { {} } let(:expected_params) { {} } let(:expected_content) { '' } it_behaves_like 'a rendered system-level gitconfig' end context 'with omnibus_gitconfig' do let(:gitlab_config) do { omnibus_gitconfig: { system: { receive: ["fsckObjects = true", "advertisePushOptions = true"], pack: ["threads = 2"] } } } end let(:expected_params) do { "receive" => ["fsckObjects = true", "advertisePushOptions = true"], "pack" => ["threads = 2"] } end let(:expected_content) do <<-EOF [receive] fsckObjects = true advertisePushOptions = true [pack] threads = 2 EOF end it_behaves_like 'a rendered system-level gitconfig' end context 'with empty section' do let(:gitlab_config) do { omnibus_gitconfig: { system: { transfer: [], } } } end let(:expected_params) do { "transfer" => [], } end let(:expected_content) do # rubocop:disable Layout/TrailingWhitespace <<-EOF [transfer] EOF # rubocop:enable Layout/TrailingWhitespace end it_behaves_like 'a rendered system-level gitconfig' end context 'with subsections' do let(:gitlab_config) do { omnibus_gitconfig: { system: { 'http "http://example.com"' => [ "proxy = http://proxy.example.com" ] } } } end let(:expected_params) do { 'http "http://example.com"' => [ "proxy = http://proxy.example.com", ] } end let(:expected_content) do <<-EOF [http "http://example.com"] proxy = http://proxy.example.com EOF end it_behaves_like 'a rendered system-level gitconfig' end end context 'with logrotate' do it 'runs logrotate directory and configuration recipe by default' do expect(chef_run).to include_recipe('logrotate::folders_and_configs') end it 'runs logrotate directory and configuration recipe when logrotate is disabled' do stub_gitlab_rb(logrotate: { enable: false }) expect(chef_run).to include_recipe('logrotate::folders_and_configs') end end context 'when manage_etc directory management is disabled' do before { stub_gitlab_rb(manage_storage_directories: { enable: true, manage_etc: false }) } it 'does not create the user config directory' do expect(chef_run).not_to create_directory('/etc/gitlab') end end context 'prometheus is enabled by default' do it 'includes the prometheus recipe' do expect(chef_run).to include_recipe('monitoring::prometheus') expect(chef_run).not_to include_recipe('monitoring::prometheus_disable') end end context 'with prometheus disabled' do before { stub_gitlab_rb(prometheus: { enable: false }) } it 'includes the prometheus_disable recipe' do expect(chef_run).to include_recipe('monitoring::prometheus_disable') expect(chef_run).not_to include_recipe('monitoring::prometheus') end end context 'with database reindexing and LetsEncrypt auto-renew disabled' do it 'disables crond' do expect(chef_run).to include_recipe('crond::disable') expect(chef_run).not_to include_recipe('crond::enable') end end context 'with database reindexing enabled' do before do stub_gitlab_rb(gitlab_rails: { database_reindexing: { enable: true } }) end it 'enables crond' do expect(chef_run).to include_recipe('crond::enable') expect(chef_run).not_to include_recipe('crond::disable') end end context 'with LetsEncrypt auto-renew enabled' do before do # Registry will be auto-enabled if LetsEncrypt is enabled stub_gitlab_rb(external_url: 'http://gitlab.example.com', registry: { enable: false }, letsencrypt: { enable: true, auto_renew: true }) end it 'enables crond' do expect(chef_run).to include_recipe('crond::enable') expect(chef_run).not_to include_recipe('crond::disable') end end shared_examples 'consistent exporter TLS settings' do |target| context 'when TLS is enabled' do context 'when certificate path is blank' do let(:exporter_settings) do { exporter_tls_enabled: true, exporter_tls_key_path: '/valid/path' } end it 'raises an error' do expect { chef_run }.to raise_error(/#{target} exporter_tls_enabled is true, but exporter_tls_cert_path is not set/) end end context 'when key path is blank' do let(:exporter_settings) do { exporter_tls_enabled: true, exporter_tls_cert_path: '/valid/path' } end it 'raises an error' do expect { chef_run }.to raise_error(/#{target} exporter_tls_enabled is true, but exporter_tls_key_path is not set/) end end end context 'when TLS is disabled' do let(:exporter_settings) do { exporter_tls_enabled: false } end it 'does not raise an error' do expect { chef_run }.not_to raise_error end end end context 'with dedicated Puma exporter settings' do context 'when exporter is enabled' do let(:puma_settings) do { exporter_enabled: true } end let(:exporter_settings) { {} } before do stub_gitlab_rb(puma: puma_settings.merge(exporter_settings)) end it_behaves_like 'consistent exporter TLS settings', 'Puma' end end context 'with dedicated Sidekiq exporter settings' do context 'when exporter is enabled' do let(:sidekiq_settings) do { metrics_enabled: true } end let(:exporter_settings) { {} } before do stub_gitlab_rb(sidekiq: sidekiq_settings.merge(exporter_settings)) end it_behaves_like 'consistent exporter TLS settings', 'Sidekiq' end context 'when exporter is not enabled' do before do stub_gitlab_rb( sidekiq: { metrics_enabled: false, listen_address: 'localhost', listen_port: 3807, health_checks_enabled: true, health_checks_listen_address: '127.0.0.1', health_checks_listen_port: 3807 } ) end it 'does not raise an error' do expect { chef_run }.not_to raise_error end end context 'when Sidekiq health checks is not enabled' do before do stub_gitlab_rb( sidekiq: { metrics_enabled: true, listen_address: 'localhost', listen_port: 3807, health_checks_enabled: false, health_checks_listen_address: '127.0.0.1', health_checks_listen_port: 3807 } ) end it 'does not raise an error' do expect { chef_run }.not_to raise_error end end context 'when both Sidekiq exporter and Sidekiq health checks are enabled' do context 'when Sidekiq exporter and Sidekiq health checks addresses are both loopback addresses and the ports are the same' do before do stub_gitlab_rb( sidekiq: { metrics_enabled: true, listen_address: 'localhost', listen_port: 3807, health_checks_enabled: true, health_checks_listen_address: '127.0.0.1', health_checks_listen_port: 3807 } ) end it 'raises an error' do expect { chef_run }.to raise_error("The Sidekiq metrics and health checks servers are binding the same address and port. This is unsupported in GitLab 15.0 and newer. See https://docs.gitlab.com/ee/administration/sidekiq.html for up-to-date instructions.") end end context 'when Sidekiq exporter and Sidekiq health checks port are the same' do before do stub_gitlab_rb( sidekiq: { metrics_enabled: true, listen_address: 'localhost', listen_port: 3807, health_checks_enabled: true, health_checks_listen_address: 'localhost', health_checks_listen_port: 3807 } ) end it 'raises an error' do expect { chef_run }.to raise_error("The Sidekiq metrics and health checks servers are binding the same address and port. This is unsupported in GitLab 15.0 and newer. See https://docs.gitlab.com/ee/administration/sidekiq.html for up-to-date instructions.") end end context 'when Sidekiq exporter and Sidekiq health checks port are different' do before do stub_gitlab_rb( sidekiq: { metrics_enabled: true, listen_address: 'localhost', listen_port: 3807, health_checks_enabled: true, health_checks_listen_address: 'localhost', health_checks_listen_port: 3907 } ) end it 'does not raise an error' do expect { chef_run }.not_to raise_error end end end end context 'with sidekiq exporter settings not set (default settings)' do it 'does not raise an error' do expect { chef_run }.not_to raise_error end end end