spec/lib/gdk/config_spec.rb (3,024 lines of code) (raw):
# frozen_string_literal: true
RSpec.describe GDK::Config do
let(:tmp_path) { Dir.mktmpdir('gdk-path', temp_path) }
let(:gdk_basepath) { Pathname.new('/home/git/gdk/') }
let(:nginx_enabled) { false }
let(:group_saml_enabled) { false }
let(:protected_config_files) { [] }
let(:overwrite_changes) { false }
let(:use_gitlab_sshd) { true }
let(:listen_address) { '127.0.0.1' }
let(:omniauth_config) { { 'group_saml' => { 'enabled' => group_saml_enabled } } }
let(:yaml) do
{
'gdk' => { 'protected_config_files' => protected_config_files, 'overwrite_changes' => overwrite_changes },
'nginx' => { 'enabled' => nginx_enabled },
'hostname' => 'gdk.example.com',
'omniauth' => omniauth_config,
'sshd' => { 'use_gitlab_sshd' => use_gitlab_sshd, 'listen_address' => listen_address }
}
end
let(:default_config) { described_class.new(yaml: {}) }
subject(:config) { described_class.new(yaml: yaml) }
describe 'common' do
describe 'ca_path' do
it 'is not set by default' do
expect(config.common.ca_path).to be('')
end
end
end
describe '__platform' do
it 'delegates to GDK::Machine.platform' do
expect(GDK::Machine).to receive(:platform).and_call_original
config.__platform
end
end
describe '__brew_prefix_path' do
before do
allow(GDK::Machine).to receive(:platform).and_return(fake_platform)
end
context 'on a Linux system' do
let(:fake_platform) { 'linux' }
it 'returns an empty string' do
expect(config.__brew_prefix_path.to_s).to eq('')
end
end
context 'on a macOS system' do
let(:fake_platform) { 'darwin' }
before do
allow(File).to receive(:exist?).and_return(false)
allow(File).to receive(:exist?).with(brew_path).and_return(true)
end
context 'with Apple Silicon' do
let(:brew_path) { '/opt/homebrew/bin/brew' }
it 'returns the brew prefix string' do
expect(config.__brew_prefix_path.to_s).to eq('/opt/homebrew')
end
end
context 'with Intel' do
let(:brew_path) { '/usr/local/bin/brew' }
it 'returns the brew prefix string' do
expect(config.__brew_prefix_path.to_s).to eq('/usr/local')
end
end
end
end
describe '__openssl_bin_path' do
before do
allow(GDK::Machine).to receive(:platform).and_return(fake_platform)
end
context 'on a Linux system' do
let(:fake_platform) { 'linux' }
it 'returns the location of the pathed openssl as a string', :hide_output do
allow(Utils).to receive(:find_executable).and_return('/usr/bin/openssl')
expect(config.__openssl_bin_path.to_s).to eq('/usr/bin/openssl')
end
end
context 'on a macOS system' do
let(:fake_platform) { 'darwin' }
it 'returns the location of the openssl bin as a string' do
allow(File).to receive(:exist?).and_call_original
allow(File).to receive(:exist?).with('/opt/homebrew/bin/brew').and_return(true)
expect(config.__openssl_bin_path.to_s).to eq('/opt/homebrew/opt/openssl/bin/openssl')
end
end
end
describe 'restrict_cpu_count' do
context 'when restrict_cpu_count is not set' do
it 'defaults to the number of CPUS on the running machine' do
allow(Etc).to receive(:nprocessors).and_return(6)
expect(config.restrict_cpu_count).to eq(6)
end
end
context 'when restrict_cpu_count is set' do
it 'returns the value set by restrict_cpu_count' do
yaml['restrict_cpu_count'] = 8
expect(config.restrict_cpu_count).to eq(8)
end
end
end
describe 'env' do
it 'merges variables' do
yaml['env'] = { 'ACTION_CABLE_IN_APP' => 'false' }
expect(config.env).to include({
'RAILS_ENV' => 'development',
'ACTION_CABLE_IN_APP' => 'false'
})
end
end
describe '__uri' do
context 'for defaults' do
it 'returns http://gdk.example.com:3000' do
expect(config.__uri.to_s).to eq('http://gdk.example.com:3000')
end
end
context 'when port is set to 1234' do
it 'returns http://gdk.example.com:1234' do
yaml['port'] = '1234'
expect(config.__uri.to_s).to eq('http://gdk.example.com:1234')
end
end
context 'when a relative_url_root is set' do
it 'returns http://gdk.example.com:3000/gitlab' do
yaml['relative_url_root'] = '/gitlab/'
expect(config.__uri.to_s).to eq('http://gdk.example.com:3000/gitlab')
end
end
context 'when https is enabled' do
before do
yaml['https'] = { 'enabled' => true }
end
it 'returns https://gdk.example.com:3000' do
expect(config.__uri.to_s).to eq('https://gdk.example.com:3000')
end
context 'and port is set to 443' do
it 'returns https://gdk.example.com/' do
yaml['port'] = '443'
expect(config.__uri.to_s).to eq('https://gdk.example.com')
end
end
end
end
describe 'elasticsearch' do
let(:checksum) { 'e7c22b994c59d9cf2b48e549b1e24666636045930d3da7c1acb299d1c3b7f931f94aae41edda2c2b207a36e10f8bcb8d45223e54878f5b316e7ce3b6bc019629' }
describe '#enabled' do
it 'defaults to false' do
expect(config.elasticsearch.enabled).to be(false)
end
context 'when enabled in config file' do
let(:yaml) do
{ 'elasticsearch' => { 'enabled' => true } }
end
it 'returns true' do
expect(config.elasticsearch.enabled).to be(true)
end
end
end
describe '#version' do
it 'has a default value' do
expect(config.elasticsearch.version).to match(/\d+.\d+.\d+/)
end
context 'when specified in config file' do
let(:version) { '7.8.0' }
let(:yaml) do
{ 'elasticsearch' => { 'version' => version } }
end
it 'returns the version from the config file' do
expect(config.elasticsearch.version).to eq(version)
end
end
end
describe '#__architecture' do
before do
allow(GDK::Machine).to receive(:architecture).and_return(fake_arch)
end
context 'when __architecture is x86_64' do
let(:fake_arch) { 'x86_64' }
it 'returns x86_64' do
expect(config.elasticsearch.__architecture).to eq('x86_64')
end
end
context 'when __architecture is arm64' do
let(:fake_arch) { 'arm64' }
it 'returns aarch64' do
expect(config.elasticsearch.__architecture).to eq('aarch64')
end
end
context 'when __architecture is amd64' do
let(:fake_arch) { 'amd64' }
it 'returns x86_64' do
expect(config.elasticsearch.__architecture).to eq('x86_64')
end
end
end
end
describe 'repositories' do
describe 'gitlab_ui' do
it 'returns the gitlab-ui repository URL' do
expect(config.repositories.gitlab_ui).to eq('https://gitlab.com/gitlab-org/gitlab-ui.git')
end
end
end
describe 'workhorse' do
describe '#__active_host' do
it 'returns the configured hostname' do
expect(config.workhorse.__active_host).to eq(config.hostname)
end
end
describe '#__listen_address' do
it 'is set to ip and default port' do
expect(config.workhorse.__listen_address).to eq('gdk.example.com:3333')
end
context 'when gitlab_http_router is disabled' do
before do
yaml['gitlab_http_router'] = { 'enabled' => false }
end
it 'is set to ip and port' do
expect(config.workhorse.__listen_address).to eq('gdk.example.com:3000')
end
end
end
describe '#__command_line_listen_addr' do
context 'when https is enabled' do
it 'is gdk.example.com:0' do
yaml['https'] = { 'enabled' => true }
expect(config.workhorse.__command_line_listen_addr).to eq('gdk.example.com:0')
end
end
context 'when https is not enabled' do
it 'is the same as #__listen_address' do
expect(config.workhorse.__command_line_listen_addr).to eq(config.workhorse.__listen_address)
end
end
end
end
describe '#__active_port' do
it 'returns 3333' do
expect(config.workhorse.__active_port).to eq(3333)
end
context 'when neither nginx nor gitlab_http_router is enabled' do
before do
yaml['gitlab_http_router'] = { 'enabled' => false }
yaml['nginx'] = { 'enabled' => false }
end
it 'returns 3000' do
expect(config.workhorse.__active_port).to eq(3000)
end
end
context 'when nginx is enabled' do
let(:nginx_enabled) { true }
it 'returns 3333' do
expect(config.workhorse.__active_port).to eq(3333)
end
end
end
describe 'openldap' do
%w[main alt].each do |server|
describe "##{server}" do
subject(:host) { config.openldap.public_send(server).host }
let(:custom_host) { 'ldap.example.com' }
it { expect(host).to eq('gdk.example.com') }
describe "with custom openldap.#{server}.host" do
before do
yaml['openldap'] = {
server => {
'host' => custom_host
}
}
end
it { expect(host).to eq(custom_host) }
end
end
end
end
describe 'sshd' do
describe '#__log_file' do
subject { config.sshd.__log_file }
context 'when gitlab-sshd is disabled' do
let(:use_gitlab_sshd) { false }
it { is_expected.to eq("#{config.gitlab_shell.dir}/gitlab-shell.log") }
end
context 'when gitlab-sshd is enabled' do
let(:use_gitlab_sshd) { true }
it { is_expected.to eq('/dev/stdout') }
end
end
describe '#__listen' do
subject { config.sshd.__listen }
context 'when listen address is IPv4' do
let(:listen_address) { '127.0.0.1' }
it { is_expected.to eq('127.0.0.1:2222') }
end
context 'when listen address is IPv6' do
let(:listen_address) { '::1' }
it { is_expected.to eq('[::1]:2222') }
end
context 'when listen address is a hostname' do
let(:listen_address) { 'localhost' }
it { is_expected.to eq('localhost:2222') }
end
end
describe '#host_keys' do
subject(:host_keys) { config.sshd.host_keys }
it 'defaults to rsa and ed25519 keys' do
expect(host_keys).to eq(['/home/git/gdk/openssh/ssh_host_rsa_key', '/home/git/gdk/openssh/ssh_host_ed25519_key'])
end
context 'with user configured host_key' do
let(:yaml) do
{
'sshd' => {
'host_key' => '/i/ve/got/the/key'
}
}
end
it 'includes the user defined key' do
expect(host_keys).to eq(['/home/git/gdk/openssh/ssh_host_rsa_key', '/home/git/gdk/openssh/ssh_host_ed25519_key', '/i/ve/got/the/key'])
end
end
context 'with user configured host_keys' do
let(:yaml) do
{
'sshd' => {
'host_keys' => ['/i/ve/got/the/key']
}
}
end
it 'matches the user defined keys' do
expect(host_keys).to eq(['/i/ve/got/the/key'])
end
end
end
describe '#web_listen' do
it 'defaults to a blank string' do
expect(config.sshd.web_listen).to eq('')
end
context 'when prometheus is enabled' do
let(:yaml) do
{
'prometheus' => {
'enabled' => true
}
}
end
it 'defaults to 127.0.0.1:9122' do
expect(config.sshd.web_listen).to eq('127.0.0.1:9122')
end
end
end
end
describe '#dump!' do
before do
stub_pg_bindir
end
it 'successfully dumps the config' do
expect do
expect(config.dump!).to be_a_kind_of(Hash)
end.not_to raise_error
end
it 'does not dump options intended for internal use only' do
expect(config).to respond_to(:__uri)
expect(config.dump!).not_to include('__uri')
end
it 'does not dump options based on question mark convenience methods' do
expect(config.gdk).to respond_to(:debug?)
expect(config.gdk.dump!).not_to include('debug?')
end
end
describe '#validate!' do
before do
stub_raw_gdk_yaml(raw_yaml)
end
context 'when gdk.yml is valid' do
let(:raw_yaml) { "---\ngdk:\n debug: true" }
it 'returns nil' do
expect(described_class.new.gdk.validate!).to be_nil
end
end
context 'with invalid YAML' do
let(:raw_yaml) { "---\ngdk:\n debug" }
it 'raises an exception' do
# Ruby 3.3 warns with 'an instance of String'
# Ruby 3.4 warns with 'fetch'
expect { described_class.load_from_file.gdk.validate! }.to raise_error(/undefined method ('|`)fetch' for ("debug":String|an instance of String)/)
end
end
context 'with partially invalid YAML' do
let(:raw_yaml) { "---\ngdk:\n debug: fals" }
it 'raises an exception' do
expect { described_class.load_from_file.gdk.validate! }.to raise_error(/Value 'fals' for setting 'gdk.debug' is not a valid bool/)
end
end
end
describe '#[]' do
before do
stub_raw_gdk_yaml(raw_yaml)
end
context 'when looking up a single slug' do
let(:raw_yaml) { "---\nrestrict_cpu_count: 4" }
it 'returns the value' do
expect(described_class.load_from_file['restrict_cpu_count'].to_s).to eq('4')
end
end
context 'when looking up a multiple slugs' do
let(:raw_yaml) { "---\ngdk:\n debug: true" }
it 'is not designed to return a value' do
expect(described_class.load_from_file['gdk.debug'].to_s).to eq('')
end
end
end
describe '#username' do
before do
allow(Etc).to receive_message_chain(:getpwuid, :name) { 'iamfoo' }
end
it 'returns the short login name of the current process uid' do
expect(config.username).to eq('iamfoo')
end
end
describe '#praefect' do
describe '#database' do
let(:yaml) do
{
'praefect' => {
'node_count' => 3,
'database' => {
'host' => 'localhost',
'port' => 1234
}
}
}
end
describe '#host' do
it { expect(default_config.praefect.database.host).to eq(default_config.postgresql.dir.to_s) }
context 'for a non-Geo setup' do
it 'returns configured value' do
expect(config.praefect.database.host).to eq('localhost')
end
end
context 'for a Geo secondary' do
let!(:yaml) do
{
'geo' => {
'enabled' => true,
'secondary' => true
}
}
end
it 'returns configured value' do
expect(config.praefect.database.host).to eq('/home/git/gdk/postgresql-geo')
end
end
end
describe '#port' do
it { expect(default_config.praefect.database.port).to eq(5432) }
context 'for a non-Geo setup' do
it 'returns configured value' do
expect(config.praefect.database.port).to eq(1234)
end
end
context 'for a Geo secondary' do
let!(:yaml) do
{
'geo' => {
'enabled' => true,
'secondary' => true
}
}
end
it 'returns configured value' do
expect(config.praefect.database.port).to eq(5431)
end
end
end
describe '#__storages' do
it 'has defaults' do
expect(default_config.praefect.__nodes.length).to eq(1)
expect(default_config.praefect.__nodes[0].__storages.length).to eq(1)
expect(default_config.praefect.__nodes[0].__storages[0].name).to eq('praefect-internal-0')
expect(default_config.praefect.__nodes[0].__storages[0].path).to eq(Pathname.new('/home/git/gdk/repositories'))
end
it 'returns the configured value' do
expect(config.praefect.__nodes.length).to eq(3)
expect(config.praefect.__nodes[0].__storages.length).to eq(1)
expect(config.praefect.__nodes[0].__storages[0].name).to eq('praefect-internal-0')
expect(config.praefect.__nodes[0].__storages[0].path).to eq(Pathname.new('/home/git/gdk/repositories'))
expect(config.praefect.__nodes[1].__storages.length).to eq(1)
expect(config.praefect.__nodes[1].__storages[0].name).to eq('praefect-internal-1')
expect(config.praefect.__nodes[1].__storages[0].path).to eq(Pathname.new('/home/git/gdk/repository_storages/praefect-gitaly-1/praefect-internal-1'))
expect(config.praefect.__nodes[2].__storages.length).to eq(1)
expect(config.praefect.__nodes[2].__storages[0].name).to eq('praefect-internal-2')
expect(config.praefect.__nodes[2].__storages[0].path).to eq(Pathname.new('/home/git/gdk/repository_storages/praefect-gitaly-2/praefect-internal-2'))
end
end
describe '#__praefect_build_bin_path' do
it '/home/git/gdk/gitaly/_build/bin/praefect' do
expect(config.praefect.__praefect_build_bin_path).to eq(Pathname.new('/home/git/gdk/gitaly/_build/bin/praefect'))
end
end
end
end
describe '#postgresql' do
let(:yaml) do
{
'postgresql' => {
'host' => 'localhost',
'port' => 1234,
'active_version' => '11.9',
'geo' => {
'host' => 'geo',
'port' => 5678
}
}
}
end
describe '#host' do
it { expect(default_config.postgresql.host).to eq(default_config.postgresql.dir.to_s) }
it 'returns configured value' do
expect(config.postgresql.host).to eq('localhost')
end
end
describe '#port' do
it { expect(default_config.postgresql.port).to eq(5432) }
it 'returns configured value' do
expect(config.postgresql.port).to eq(1234)
end
end
describe '#active_version' do
it { expect(default_config.postgresql.active_version).to eq('16.8') }
it 'returns configured value' do
expect(config.postgresql.active_version).to eq('11.9')
end
end
describe '#geo' do
describe '#host' do
it { expect(default_config.postgresql.host).to eq(default_config.postgresql.dir.to_s) }
it 'returns configured value' do
expect(config.postgresql.geo.host).to eq('geo')
end
end
describe '#port' do
it { expect(default_config.postgresql.geo.port).to eq(5431) }
it 'returns configured value' do
expect(config.postgresql.geo.port).to eq(5678)
end
end
end
end
describe "#cells" do
describe "#enabled" do
let(:yaml) do
{
'cells' => {
'enabled' => true
}
}
end
it { expect(default_config.cells.enabled).to be(false) }
it { expect(default_config.cells?).to be(false) }
it { expect(config.cells.enabled).to be(true) }
it { expect(config.cells?).to be(true) }
end
describe "#postgresql" do
context 'with default settings' do
it { expect(default_config.cells.postgresql_clusterwide.host).to eq(default_config.postgresql.host) }
it { expect(default_config.cells.postgresql_clusterwide.port).to eq(default_config.postgresql.port) }
end
context 'with custom settings' do
let(:yaml) do
{
'cells' => {
'postgresql_clusterwide' => {
'host' => '/tmp/another_gdk/postgres',
'port' => 5432
}
}
}
end
it { expect(config.cells.postgresql_clusterwide.host).to eq('/tmp/another_gdk/postgres') }
it { expect(config.cells.postgresql_clusterwide.port).to eq(5432) }
end
end
end
describe '#clickhouse' do
context 'with default settings' do
it { expect(default_config.clickhouse.enabled).to be(false) }
it { expect(default_config.clickhouse.dir).to eq(gdk_basepath.join('clickhouse')) }
it { expect(default_config.clickhouse.data_dir).to eq(gdk_basepath.join('clickhouse/data')) }
it { expect(default_config.clickhouse.log_dir).to eq(gdk_basepath.join('log/clickhouse')) }
it { expect(default_config.clickhouse.log_level).to eq('trace') }
it { expect(default_config.clickhouse.http_port).to eq(8123) }
it { expect(default_config.clickhouse.tcp_port).to eq(9001) }
it { expect(default_config.clickhouse.interserver_http_port).to eq(9009) }
it { expect(default_config.clickhouse.max_memory_usage).to eq(1_000_000_000) }
it { expect(default_config.clickhouse.max_thread_pool_size).to eq(1000) }
it { expect(default_config.clickhouse.max_server_memory_usage).to eq(2_000_000_000) }
it 'defaults bin to /usr/bin/clickhouse when no executable can be found' do
stub_env('PATH', tmp_path)
expect(default_config.clickhouse.bin).to eq(Pathname.new('/usr/bin/clickhouse'))
end
it 'returns bin full path based on find_executable' do
unstub_find_executable
stub_env('PATH', tmp_path)
custom_bin_path = Pathname.new(create_dummy_executable('clickhouse'))
expect(default_config.clickhouse.bin).to eq(custom_bin_path)
end
end
context 'with custom settings' do
let(:yaml) do
{
'clickhouse' => {
'enabled' => true,
'bin' => '/tmp/clickhouse/clickhouse-123',
'dir' => '/tmp/clickhouse',
'data_dir' => '/tmp/clickhouse/data-dir',
'log_dir' => '/tmp/clickhouse/log-dir',
'log_level' => 'warn',
'http_port' => 1234,
'tcp_port' => 5678,
'interserver_http_port' => 15678,
'max_memory_usage' => 10,
'max_thread_pool_size' => 20,
'max_server_memory_usage' => 30
}
}
end
it { expect(config.clickhouse.enabled).to be(true) }
it { expect(config.clickhouse.bin).to eq(Pathname.new('/tmp/clickhouse/clickhouse-123')) }
it { expect(config.clickhouse.dir).to eq(Pathname.new('/tmp/clickhouse')) }
it { expect(config.clickhouse.data_dir).to eq(Pathname.new('/tmp/clickhouse/data-dir')) }
it { expect(config.clickhouse.log_dir).to eq(Pathname.new('/tmp/clickhouse/log-dir')) }
it { expect(config.clickhouse.log_level).to eq('warn') }
it { expect(config.clickhouse.http_port).to eq(1234) }
it { expect(config.clickhouse.tcp_port).to eq(5678) }
it { expect(config.clickhouse.interserver_http_port).to eq(15678) }
it { expect(config.clickhouse.max_memory_usage).to eq(10) }
it { expect(config.clickhouse.max_thread_pool_size).to eq(20) }
it { expect(config.clickhouse.max_server_memory_usage).to eq(30) }
end
end
describe '#gitaly' do
let(:praefect_enabled) { false }
let(:storage_count) { 3 }
let(:yaml) do
{
'gitaly' => {
'storage_count' => storage_count
},
'praefect' => {
'enabled' => praefect_enabled
}
}
end
describe '#dir' do
it 'returns the gitaly directory' do
expect(config.gitaly.dir).to eq(Pathname.new('/home/git/gdk/gitaly'))
end
end
describe '#enabled' do
context 'when praefect is disabled' do
let(:storage_count) { 1 }
it { expect(config.gitaly).to be_enabled }
end
context 'when praefect is enabled' do
let(:praefect_enabled) { true }
context 'when there is 1 storage' do
let(:storage_count) { 1 }
it { expect(config.gitaly).not_to be_enabled }
end
context 'when there is more than 1 storage' do
it { expect(config.gitaly).to be_enabled }
end
end
end
describe '#__storages' do
it 'has defaults' do
expect(default_config.gitaly.__storages.length).to eq(1)
expect(default_config.gitaly.__storages[0].name).to eq('default')
expect(default_config.gitaly.__storages[0].path).to eq(Pathname.new('/home/git/gdk/repositories'))
end
it 'returns the configured value' do
expect(config.gitaly.__storages.length).to eq(3)
expect(config.gitaly.__storages[0].name).to eq('default')
expect(config.gitaly.__storages[0].path).to eq(Pathname.new('/home/git/gdk/repositories'))
expect(config.gitaly.__storages[1].name).to eq('gitaly-1')
expect(config.gitaly.__storages[1].path).to eq(Pathname.new('/home/git/gdk/repository_storages/gitaly/gitaly-1'))
expect(config.gitaly.__storages[2].name).to eq('gitaly-2')
expect(config.gitaly.__storages[2].path).to eq(Pathname.new('/home/git/gdk/repository_storages/gitaly/gitaly-2'))
end
end
describe 'auth_token' do
it 'is not set by default' do
expect(config.gitaly.auth_token).to be('')
end
end
describe 'gitconfig' do
it 'is not set by default' do
expect(config.gitaly.gitconfig).to eq([])
end
context 'with custom gitconfig' do
let(:gitconfig) do
[
{ key: 'core.threads', value: '1' },
{ key: 'core.logAllRefUpdates', value: 'true' }
]
end
let(:yaml) do
{
'gitaly' => {
'gitconfig' => gitconfig
}
}
end
it 'is set' do
expect(config.gitaly.gitconfig).to eq(
[
{ key: 'core.threads', value: '1' },
{ key: 'core.logAllRefUpdates', value: 'true' }
]
)
end
end
end
describe '#__build_path' do
it '/home/git/gdk/gitaly/_build' do
expect(config.gitaly.__build_path).to eq(Pathname.new('/home/git/gdk/gitaly/_build'))
end
end
describe '#__build_bin_path' do
it '/home/git/gdk/gitaly/_build/bin' do
expect(config.gitaly.__build_bin_path).to eq(Pathname.new('/home/git/gdk/gitaly/_build/bin'))
end
end
describe '#__build_bin_backup_path' do
it '/home/git/gdk/gitaly/_build/bin/gitaly-backup' do
expect(config.gitaly.__build_bin_backup_path).to eq(Pathname.new('/home/git/gdk/gitaly/_build/bin/gitaly-backup'))
end
end
describe '#__gitaly_build_bin_path' do
it '/home/git/gdk/gitaly/_build/bin/gitaly' do
expect(config.gitaly.__gitaly_build_bin_path).to eq(Pathname.new('/home/git/gdk/gitaly/_build/bin/gitaly'))
end
end
describe 'transactions' do
it 'is disabled by default' do
expect(config.gitaly.transactions.enabled).to be(false)
end
context 'when enabled' do
let(:yaml) do
{
'gitaly' => {
'transactions' => {
'enabled' => true
}
}
}
end
it 'is set' do
expect(config.gitaly.transactions.enabled).to be(true)
end
end
end
end
context 'geo' do
describe '#enabled' do
it 'returns false be default' do
expect(config.geo.enabled?).to be false
end
context 'when enabled in config file' do
let(:yaml) do
{ 'geo' => { 'enabled' => true } }
end
it 'returns true' do
expect(config.geo.enabled?).to be true
end
end
end
describe '#secondary?' do
it 'returns false be default' do
expect(config.geo.secondary?).to be false
end
context 'when enabled in config file' do
let(:yaml) do
{ 'geo' => { 'secondary' => true } }
end
it 'returns true' do
expect(config.geo.secondary?).to be true
end
end
end
describe '#registry_replication' do
describe '#enabled' do
it 'returns false be default' do
expect(config.geo.registry_replication.enabled).to be false
end
context 'when enabled in config file' do
let(:yaml) do
{
'geo' => { 'registry_replication' => { "enabled" => true } }
}
end
it 'returns true' do
expect(config.geo.registry_replication.enabled).to be true
end
end
end
describe '#primary_api_url' do
it 'returns default URL' do
expect(config.geo.registry_replication.primary_api_url).to eq('http://localhost:5100')
end
context 'when URL is specified' do
let(:yaml) do
{
'geo' => { 'registry_replication' => { "primary_api_url" => 'http://localhost:5101' } }
}
end
it 'returns URL from configuration file' do
expect(config.geo.registry_replication.primary_api_url).to eq('http://localhost:5101')
end
end
end
end
end
describe '#config_file_protected?' do
subject { config.config_file_protected?('foobar') }
context 'with full wildcard protected_config_files' do
let(:protected_config_files) { ['*'] }
it 'returns true' do
expect(config.config_file_protected?('foobar')).to be(true)
end
context 'but legacy overwrite_changes set to true' do
let(:overwrite_changes) { true }
it 'returns false' do
expect(config.config_file_protected?('foobar')).to be(false)
end
end
end
end
describe 'runner' do
describe '#enabled' do
it 'defaults to false' do
expect(config.runner.enabled).to be(false)
end
context 'when enabled in config file' do
let(:yaml) do
{ 'runner' => { 'enabled' => true } }
end
it 'returns true' do
expect(config.runner.enabled).to be(true)
end
end
end
describe '#concurrent' do
it 'defaults to 1' do
expect(config.runner.concurrent).to eq(1)
end
end
describe '#install_mode' do
it 'returns binary' do
expect(config.runner.install_mode).to eq('binary')
end
end
describe '#extra_hosts' do
it 'returns []' do
expect(config.runner.extra_hosts).to eq([])
end
end
describe '#docker_host' do
it 'returns the empty string' do
expect(config.runner.docker_host).to eq('')
end
end
describe '#image' do
it 'returns gitlab/gitlab-runner:latest' do
expect(config.runner.image).to eq('gitlab/gitlab-runner:latest')
end
end
describe '#docker_pull' do
it 'returns always' do
expect(config.runner.docker_pull).to eq('always')
end
end
describe '#pull_policy' do
it 'returns if-not-present' do
expect(config.runner.pull_policy).to eq('if-not-present')
end
end
describe '#bin' do
it 'returns gitlab-runner' do
found = Utils.find_executable('gitlab-runner')
path = found || '/usr/local/bin/gitlab-runner'
expect(config.runner.bin).to eq(Pathname.new(path))
end
end
describe 'network_mode_host' do
it 'is disabled by default' do
expect(config.runner.network_mode_host).to be(false)
end
end
describe '__network_mode_host' do
context 'when not set in gdk.yml' do
it 'is disabled by default' do
expect(config.runner.__network_mode_host).to be(false)
end
end
context 'when enabled in gdk.yml' do
before do
yaml['runner'] = {
'network_mode_host' => 'true'
}
allow(GDK::Machine).to receive(:platform).and_return(fake_platform)
end
context 'on a macOS system' do
let(:fake_platform) { 'darwin' }
it 'raise an exception' do
expect { config.runner.__network_mode_host }.to raise_error('runner.network_mode_host is only supported on Linux')
end
end
context 'on a Linux system' do
let(:fake_platform) { 'linux' }
it 'returns true' do
expect(config.runner.__network_mode_host).to be(true)
end
end
end
end
describe '__install_mode_binary' do
context 'when runner is not enabled' do
it 'returns false' do
expect(config.runner.__install_mode_binary).to be(false)
end
end
context 'when runner is enabled' do
before do
yaml['runner'] = {
'enabled' => 'true'
}
end
context 'when install_mode is unset' do
it 'returns true' do
expect(config.runner.__install_mode_binary).to be(true)
end
end
context 'when install_mode is binary' do
before do
yaml['runner']['install_mode'] = 'binary'
end
it 'returns true' do
expect(config.runner.__install_mode_binary).to be(true)
end
end
context 'when install_mode is docker' do
before do
yaml['runner']['install_mode'] = 'docker'
end
it 'returns false' do
expect(config.runner.__install_mode_binary).to be(false)
end
end
context 'when executor is docker' do
it 'returns docker' do
expect(config.runner.executor).to eq('docker')
end
end
context 'when executor is shell' do
before do
yaml['runner']['executor'] = 'shell'
end
it 'returns shell' do
expect(config.runner.executor).to eq('shell')
end
end
end
end
describe '__install_mode_docker' do
context 'when runner is not enabled' do
it 'returns false' do
expect(config.runner.__install_mode_docker).to be(false)
end
end
context 'when runner is enabled' do
before do
yaml['runner'] = {
'enabled' => 'true'
}
end
context 'when install_mode is unset' do
it 'returns false' do
expect(config.runner.__install_mode_docker).to be(false)
end
end
context 'when install_mode is binary' do
before do
yaml['runner']['install_mode'] = 'binary'
end
it 'returns false' do
expect(config.runner.__install_mode_docker).to be(false)
end
end
context 'when install_mode is docker' do
before do
yaml['runner']['install_mode'] = 'docker'
end
it 'returns true' do
expect(config.runner.__install_mode_docker).to be(true)
end
end
end
end
describe '__add_host_flags' do
before do
yaml['runner'] = {
'enabled' => 'true'
}
end
context 'when extra_hosts is empty' do
before do
yaml['runner']['extra_hosts'] = []
end
it 'returns an empty string' do
flags = config.runner.__add_host_flags
expect(flags).to be_a(String)
expect(flags).to be_empty
end
end
context 'when extra_hosts contains a single item' do
before do
yaml['runner']['extra_hosts'] = ['gdk.test:172.16.123.1']
end
it 'returns a single flag' do
expect(config.runner.__add_host_flags).to eq("--add-host='gdk.test:172.16.123.1'")
end
end
context 'when extra_hosts contains multiple items' do
before do
yaml['runner']['extra_hosts'] = ['gdk.test:172.16.123.1', 'gdk.test:192.168.65.2', 'registry.gdk.test:172.17.0.4']
end
it 'returns multiple flags separated by spaces' do
flags = config.runner.__add_host_flags
expect(flags).to eq("--add-host='gdk.test:172.16.123.1' --add-host='gdk.test:192.168.65.2' --add-host='registry.gdk.test:172.17.0.4'")
end
end
end
describe '__ssl_certificate' do
let(:yaml) do
{
'runner' => { 'enabled' => 'true' },
'nginx' => {
'ssl' => {
'certificate' => '/path/to/hostname.pem',
'key' => '/path/to/hostname.key'
}
}
}
end
it 'converts to a relative path' do
cert = config.runner.__ssl_certificate
expect(cert).to be_a(String)
expect(cert).to eq('hostname.crt')
end
context 'when __ssl_certificate is overriden' do
before do
yaml['runner']['__ssl_certificate'] = '/path/to/ssl/cert'
end
it 'returns an empty string' do
cert = config.runner.__ssl_certificate
expect(cert).to be_a(String)
expect(cert).to eq('/path/to/ssl/cert')
end
end
end
context 'when config_file exists' do
before do
yaml['runner'] = {
'config_file' => Tempfile.new
}
end
describe 'enabled' do
it 'is disabled by default' do
expect(config.runner.enabled).to be(false)
end
end
end
end
describe '#listen_address' do
it 'returns 127.0.0.1 by default' do
expect(config.listen_address).to eq('127.0.0.1')
end
end
describe 'license' do
describe 'customer_portal_url' do
it 'returns staging customer portal URL by default' do
expect(config.license.customer_portal_url).to eq('https://customers.staging.gitlab.com')
end
end
describe 'license_mode' do
it 'returns test by default' do
expect(config.license.license_mode).to eq('test')
end
end
end
describe 'gitlab' do
describe 'auto_update' do
it 'is enabled by default' do
expect(config.gitlab.auto_update).to be(true)
expect(config.gitlab.auto_update?).to be(true)
end
end
describe 'default_branch' do
it 'is set to master by default' do
expect(config.gitlab.default_branch).to be('master')
end
end
describe 'lefthook_enabled' do
it 'is enabled by default' do
expect(config.gitlab.lefthook_enabled?).to be(true)
end
end
describe '#dir' do
it 'returns the GitLab directory' do
expect(config.gitlab.dir).to eq(Pathname.new('/home/git/gdk/gitlab'))
end
end
describe '#log_dir' do
it 'returns the GitLab log directory' do
expect(config.gitlab.log_dir).to eq(Pathname.new('/home/git/gdk/gitlab/log'))
end
end
describe '#cache_classes' do
it 'returns if Ruby classes should be cached' do
expect(config.gitlab.cache_classes).to be(false)
end
end
describe '#gitaly_disable_request_limits' do
it 'returns if Gitaly request limit checks should be disabled' do
expect(config.gitlab.gitaly_disable_request_limits).to be(false)
end
end
describe 'rails' do
describe '#hostname' do
it 'returns gdk.example.com by default' do
expect(config.gitlab.rails.hostname).to eq('gdk.example.com')
end
end
describe '#port' do
it 'returns 3000 by default' do
expect(config.gitlab.rails.port).to eq(3000)
end
end
describe '#bootsnap' do
it 'returns true by default' do
expect(config.gitlab.rails.bootsnap?).to be(true)
end
end
context 'https' do
describe '#enabled' do
it 'returns false by default' do
expect(config.gitlab.rails.https.enabled).to be(false)
expect(config.gitlab.rails.https.enabled?).to be(false)
expect(config.gitlab.rails.https?).to be(false)
end
end
end
describe '#__socket_file' do
it 'returns the GitLab socket path' do
expect(config.gitlab.rails.__socket_file).to eq(Pathname.new('/home/git/gdk/gitlab.socket'))
end
end
describe '#__socket_file_escaped' do
it 'returns the GitLab socket path CGI escaped' do
expect(config.gitlab.rails.__socket_file_escaped.to_s).to eq('%2Fhome%2Fgit%2Fgdk%2Fgitlab.socket')
end
end
describe '#listen_settings' do
it 'defaults to UNIX socket' do
expect(config.gitlab.rails.address).to eq('')
expect(config.gitlab.rails.__bind).to eq('unix:///home/git/gdk/gitlab.socket')
expect(config.gitlab.rails.__workhorse_url).to eq('/home/git/gdk/gitlab.socket')
expect(config.gitlab.rails.__listen_settings.__protocol).to eq('unix')
expect(config.gitlab.rails.__listen_settings.__address).to eq('/home/git/gdk/gitlab.socket')
expect(config.workhorse.__listen_settings.__type).to eq('authSocket')
expect(config.workhorse.__listen_settings.__address).to eq('/home/git/gdk/gitlab.socket')
end
end
context 'with TCP address' do
before do
yaml['gitlab'] = {
'rails' => {
'address' => 'localhost:3443'
}
}
end
it 'sets listen_settings to HTTP port' do
expect(config.gitlab.rails.address).to eq('localhost:3443')
expect(config.gitlab.rails.__bind).to eq('tcp://localhost:3443')
expect(config.gitlab.rails.__workhorse_url).to eq('http://localhost:3443')
expect(config.gitlab.rails.__listen_settings.__protocol).to eq('tcp')
expect(config.gitlab.rails.__listen_settings.__address).to eq('localhost:3443')
expect(config.workhorse.__listen_settings.__type).to eq('authBackend')
expect(config.workhorse.__listen_settings.__address).to eq('http://localhost:3443')
end
end
describe 'bundle_gemfile' do
it 'is /home/git/gdk/gitlab/Gemfile by default' do
expect(config.gitlab.rails.bundle_gemfile).to eq('/home/git/gdk/gitlab/Gemfile')
end
end
describe 'multiple_databases' do
it 'is disabled by default' do
expect(config.gitlab.rails.multiple_databases).to be(false)
end
end
describe 'databases' do
describe 'ci' do
describe 'enabled' do
it 'is enabled by default' do
expect(config.gitlab.rails.databases.ci.enabled).to be(true)
end
end
describe 'use_main_database' do
it 'is disabled by default' do
expect(config.gitlab.rails.databases.ci.use_main_database).to be(false)
end
end
describe '__enabled' do
it 'is enabled by default' do
expect(config.gitlab.rails.databases.ci.__enabled).to be(true)
end
context 'when config.gitlab.rails.multiple_databases is true' do
before do
yaml['gitlab'] = {
'rails' => {
'multiple_databases' => true
}
}
end
it 'is enabled' do
expect(config.gitlab.rails.databases.ci.__enabled).to be(true)
end
end
context 'when config.gitlab.rails.databases.ci.enabled is true' do
before do
yaml['gitlab'] = {
'rails' => {
'databases' => {
'ci' => {
'enabled' => true
}
}
}
}
end
it 'is enabled' do
expect(config.gitlab.rails.databases.ci.__enabled).to be(true)
end
end
context 'when config.gitlab.rails.databases.ci.enabled is false' do
before do
yaml['gitlab'] = {
'rails' => {
'databases' => {
'ci' => {
'enabled' => false
}
}
}
}
end
it 'is disabled' do
expect(config.gitlab.rails.databases.ci.__enabled).to be(false)
end
end
end
describe '__use_main_database' do
it 'is disabled by default' do
expect(config.gitlab.rails.databases.ci.__use_main_database).to be(false)
end
context 'when config.gitlab.rails.multiple_databases is true' do
before do
yaml['gitlab'] = {
'rails' => {
'multiple_databases' => 'true'
}
}
end
it 'is disabled' do
expect(config.gitlab.rails.databases.ci.__use_main_database).to be(false)
end
end
context 'when config.gitlab.rails.databases.ci.enabled is true' do
before do
yaml['gitlab'] = {
'rails' => {
'databases' => {
'ci' => {
'enabled' => true
}
}
}
}
end
it 'is enabled' do
expect(config.gitlab.rails.databases.ci.__enabled).to be(true)
end
end
context 'when config.gitlab.rails.databases.ci.enabled is false' do
before do
yaml['gitlab'] = {
'rails' => {
'databases' => {
'ci' => {
'enabled' => false
}
}
}
}
end
it 'is disabled' do
expect(config.gitlab.rails.databases.ci.__enabled).to be(false)
end
end
end
end
describe 'sec' do
describe 'enabled' do
it 'is disabled by default' do
expect(config.gitlab.rails.databases.sec.enabled).to be(false)
end
end
describe 'use_main_database' do
it 'is enabled by default' do
expect(config.gitlab.rails.databases.sec.use_main_database).to be(true)
end
end
describe '__enabled' do
it 'is disabled by default' do
expect(config.gitlab.rails.databases.sec.__enabled).to be(false)
end
context 'when config.gitlab.rails.multiple_databases is true' do
before do
yaml['gitlab'] = {
'rails' => {
'multiple_databases' => true
}
}
end
it 'is enabled' do
expect(config.gitlab.rails.databases.sec.__enabled).to be(true)
end
end
context 'when config.gitlab.rails.databases.sec.enabled is true' do
before do
yaml['gitlab'] = {
'rails' => {
'databases' => {
'sec' => {
'enabled' => true
}
}
}
}
end
it 'is enabled' do
expect(config.gitlab.rails.databases.sec.__enabled).to be(true)
end
end
context 'when config.gitlab.rails.databases.sec.enabled is false' do
before do
yaml['gitlab'] = {
'rails' => {
'databases' => {
'sec' => {
'enabled' => false
}
}
}
}
end
it 'is disabled' do
expect(config.gitlab.rails.databases.sec.__enabled).to be(false)
end
end
end
describe '__use_main_database' do
it 'is enabled by default' do
expect(config.gitlab.rails.databases.sec.__use_main_database).to be(true)
end
context 'when config.gitlab.rails.multiple_databases is true' do
before do
yaml['gitlab'] = {
'rails' => {
'multiple_databases' => 'true'
}
}
end
it 'is enabled' do
expect(config.gitlab.rails.databases.sec.__use_main_database).to be(true)
end
end
context 'when config.gitlab.rails.databases.sec.enabled is true' do
before do
yaml['gitlab'] = {
'rails' => {
'databases' => {
'sec' => {
'enabled' => true
}
}
}
}
end
it 'is enabled' do
expect(config.gitlab.rails.databases.sec.__enabled).to be(true)
end
end
context 'when config.gitlab.rails.databases.sec.enabled is false' do
before do
yaml['gitlab'] = {
'rails' => {
'databases' => {
'sec' => {
'enabled' => false
}
}
}
}
end
it 'is disabled' do
expect(config.gitlab.rails.databases.sec.__enabled).to be(false)
end
end
end
end
end
describe 'topology_service' do
describe '#enabled' do
it 'defaults to true' do
expect(config.gitlab.topology_service.enabled).to be(true)
end
end
describe '#address' do
it 'defaults to the localhost:grpc_port' do
expect(config.gitlab.topology_service.address).to eq("gdk.example.com:9095")
end
end
describe 'certificate files' do
let(:certs_directory) { "/home/git/gdk/gitlab-topology-service/tmp/certs" }
it 'they default to the certificate files in the temp directory' do
expect(config.gitlab.topology_service.ca_file).to eq(Pathname.new(File.join(certs_directory, "ca-cert.pem")))
expect(config.gitlab.topology_service.certificate_file).to eq(Pathname.new(File.join(certs_directory, "client-cert.pem")))
expect(config.gitlab.topology_service.private_key_file).to eq(Pathname.new(File.join(certs_directory, "client-key.pem")))
end
end
end
describe 'cell' do
describe '#cell_id' do
it 'defaults to 1' do
expect(config.gitlab.cell.id).to eq(1)
end
end
end
describe 'puma' do
describe 'threads_min' do
it 'is 1 by default' do
expect(config.gitlab.rails.puma.threads_min).to be(1)
end
end
describe '__threads_min' do
context 'when running in clustered mode (workers > 0)' do
before do
yaml['gitlab'] = {
'rails' => {
'puma' => {
'workers' => 2
}
}
}
end
it 'is 1 by default' do
expect(config.gitlab.rails.puma.__threads_min).to be(1)
end
end
context 'when running in single mode (workers == 0)' do
before do
yaml['gitlab'] = {
'rails' => {
'puma' => {
'workers' => 0
}
}
}
end
it 'is equal to threads_max' do
expect(config.gitlab.rails.puma.__threads_min).to be(config.gitlab.rails.puma.threads_max)
end
end
end
describe 'threads_max' do
it 'is 4 by default' do
expect(config.gitlab.rails.puma.threads_max).to be(4)
end
end
describe '__threads_max' do
let(:threads_max) { nil }
before do
yaml['gitlab'] = {
'rails' => {
'puma' => {
'threads_min' => 2,
'threads_max' => threads_max
}
}
}
end
context 'when threads_max > threads_min' do
let(:threads_max) { 3 }
it 'is equal to threads_max' do
expect(config.gitlab.rails.puma.__threads_max).to be(config.gitlab.rails.puma.threads_max)
end
end
context 'when threads_max < threads_min' do
let(:threads_max) { 1 }
it 'is equal to threads_min' do
expect(config.gitlab.rails.puma.__threads_max).to be(config.gitlab.rails.puma.threads_min)
end
end
end
describe 'workers' do
it 'is 2 by default' do
expect(config.gitlab.rails.puma.workers).to be(2)
end
end
end
describe '#allowed_hosts' do
it 'returns empty array by default' do
expect(config.gitlab.rails.allowed_hosts).to eq([])
end
end
describe '#application_settings_cache_seconds' do
it 'defaults to 60' do
expect(config.gitlab.rails.application_settings_cache_seconds).to be(60)
end
end
end
describe 'rails_background_jobs' do
describe 'verbose' do
it 'is disabled by default' do
expect(config.gitlab.rails_background_jobs.verbose?).to be(false)
end
end
describe 'timeout' do
it 'is 10 (half of config.gdk.runit_wait_secs) by default' do
expect(config.gitlab.rails_background_jobs.timeout).to be(10)
end
context 'when customized' do
before do
yaml['gitlab'] = {
'rails_background_jobs' => {
'timeout' => 5
}
}
end
it 'is equal to 5' do
expect(config.gitlab.rails_background_jobs.timeout).to be(5)
end
end
end
describe '#sidekiq_exporter_enabled' do
it 'defaults to false' do
expect(config.gitlab.rails_background_jobs.sidekiq_exporter_enabled).to be(false)
end
end
describe '#sidekiq_exporter_port' do
it 'defaults to 3807' do
expect(config.gitlab.rails_background_jobs.sidekiq_exporter_port).to eq(3807)
end
end
describe '#sidekiq_health_check_enabled' do
it 'defaults to false' do
expect(config.gitlab.rails_background_jobs.sidekiq_health_check_enabled).to be(false)
end
end
describe '#sidekiq_health_check_port' do
it 'defaults to 3907' do
expect(config.gitlab.rails_background_jobs.sidekiq_health_check_port).to eq(3907)
end
end
describe '#sidekiq_routing_rules' do
it 'defaults to routing all to the default queue' do
expect(config.gitlab.rails_background_jobs.sidekiq_routing_rules).to eq([["*", "default"]])
end
end
end
end
describe 'k8s_agent' do
describe 'enabled' do
it 'is disabled by default' do
expect(config.gitlab_k8s_agent.enabled).to be(false)
end
end
describe 'auto_update' do
it 'is enabled by default' do
expect(config.gitlab_k8s_agent.auto_update).to be(true)
end
end
describe 'agent_listen_network' do
it 'is tcp by default' do
expect(config.gitlab_k8s_agent.agent_listen_network).to eq('tcp')
end
end
describe 'agent_listen_address' do
it 'is 127.0.0.1:8150 by default' do
expect(config.gitlab_k8s_agent.agent_listen_address).to eq('127.0.0.1:8150')
end
end
describe '__agent_listen_url_path' do
it 'is /-/kubernetes-agent by default' do
expect(config.gitlab_k8s_agent.__agent_listen_url_path).to eq('/-/kubernetes-agent')
end
end
describe 'private_api_listen_network' do
it 'is tcp by default' do
expect(config.gitlab_k8s_agent.private_api_listen_network).to eq('tcp')
end
end
describe 'private_api_listen_address' do
it 'is 127.0.0.1:8155 by default' do
expect(config.gitlab_k8s_agent.private_api_listen_address).to eq('127.0.0.1:8155')
end
end
describe 'k8s_api_listen_network' do
it 'is tcp by default' do
expect(config.gitlab_k8s_agent.k8s_api_listen_network).to eq('tcp')
end
end
describe 'k8s_api_listen_address' do
it 'is 127.0.0.1:8154 by default' do
expect(config.gitlab_k8s_agent.k8s_api_listen_address).to eq('127.0.0.1:8154')
end
end
describe '__k8s_api_listen_url_path' do
it 'is /-/k8s-proxy by default' do
expect(config.gitlab_k8s_agent.__k8s_api_listen_url_path).to eq('/-/k8s-proxy/')
end
end
describe '__gitlab_address' do
it 'is http://gdk.example.com:3333 by default' do
expect(config.gitlab_k8s_agent.__gitlab_address).to eq('http://gdk.example.com:3333')
end
context 'when gitlab_http_router is disabled' do
before do
yaml['gitlab_http_router'] = { 'enabled' => false }
end
it 'is http://gdk.example.com:3000 by default' do
expect(config.gitlab_k8s_agent.__gitlab_address).to eq('http://gdk.example.com:3000')
end
end
end
describe '__gitlab_external_url' do
let(:yaml) do
{
'nginx' => { 'enabled' => nginx_enabled }
}
end
context 'when nginx is enabled' do
let(:nginx_enabled) { true }
it { expect(config.gitlab_k8s_agent.__gitlab_external_url).to eq("http://#{config.nginx.__listen_address}") }
end
context 'when nginx is disabled' do
let(:nginx_enabled) { false }
it { expect(config.gitlab_k8s_agent.__gitlab_external_url).to eq(config.gitlab_k8s_agent.__gitlab_address) }
end
end
describe '__url_for_agentk' do
let(:https_enabled) { nil }
let(:yaml) do
{
'nginx' => { 'enabled' => nginx_enabled },
'https' => { 'enabled' => https_enabled }
}
end
context 'when nginx is not enabled' do
let(:nginx_enabled) { false }
it 'is grpc://127.0.0.1:8150' do
expect(config.gitlab_k8s_agent.__url_for_agentk).to eq('grpc://127.0.0.1:8150')
end
end
context 'when nginx is enabled' do
let(:nginx_enabled) { true }
context 'but https is not enabled' do
let(:https_enabled) { false }
it 'is ws://127.0.0.1:8080/-/kubernetes-agent' do
expect(config.gitlab_k8s_agent.__url_for_agentk).to eq('ws://127.0.0.1:8080/-/kubernetes-agent')
end
end
context 'and https is enabled' do
let(:https_enabled) { true }
it 'is wss://127.0.0.1:8080/-/kubernetes-agent' do
expect(config.gitlab_k8s_agent.__url_for_agentk).to eq('wss://127.0.0.1:8080/-/kubernetes-agent')
end
end
context 'when gitlab_http_router is disabled' do
before do
yaml['gitlab_http_router'] = { 'enabled' => false }
end
context 'but https is not enabled' do
let(:https_enabled) { false }
it 'is ws://127.0.0.1:3000/-/kubernetes-agent' do
expect(config.gitlab_k8s_agent.__url_for_agentk).to eq('ws://127.0.0.1:3000/-/kubernetes-agent')
end
end
context 'and https is enabled' do
let(:https_enabled) { true }
it 'is wss://127.0.0.1:3000/-/kubernetes-agent' do
expect(config.gitlab_k8s_agent.__url_for_agentk).to eq('wss://127.0.0.1:3000/-/kubernetes-agent')
end
end
end
end
end
describe 'internal_api_listen_network' do
it 'is tcp by default' do
expect(config.gitlab_k8s_agent.internal_api_listen_network).to eq('tcp')
end
end
describe 'internal_api_listen_address' do
it 'is 127.0.0.1:8153 by default' do
expect(config.gitlab_k8s_agent.internal_api_listen_address).to eq('127.0.0.1:8153')
end
end
describe '__internal_api_url' do
let(:yaml) do
{
'gitlab_k8s_agent' => { 'internal_api_listen_network' => internal_api_listen_network }
}
end
context 'when internal_api_listen_network is tcp' do
let(:internal_api_listen_network) { 'tcp' }
it 'is grpc://127.0.0.1:8153' do
expect(config.gitlab_k8s_agent.__internal_api_url).to eq('grpc://127.0.0.1:8153')
end
end
context 'when internal_api_listen_network is unix' do
let(:internal_api_listen_network) { 'unix' }
it 'is unix://127.0.0.1:8153' do
expect(config.gitlab_k8s_agent.__internal_api_url).to eq('unix://127.0.0.1:8153')
end
end
end
describe '__k8s_api_url' do
let(:https_enabled) { nil }
let(:yaml) do
{
'nginx' => { 'enabled' => nginx_enabled },
'https' => { 'enabled' => https_enabled }
}
end
context 'when nginx is not enabled' do
let(:nginx_enabled) { false }
it 'is http://127.0.0.1:8154' do
expect(config.gitlab_k8s_agent.__k8s_api_url).to eq('http://127.0.0.1:8154')
end
end
context 'when nginx is enabled' do
let(:nginx_enabled) { true }
context 'but https is not enabled' do
let(:https_enabled) { false }
it 'is http://127.0.0.1:8080/-/k8s-proxy/' do
expect(config.gitlab_k8s_agent.__k8s_api_url).to eq('http://127.0.0.1:8080/-/k8s-proxy/')
end
end
context 'and https is enabled' do
let(:https_enabled) { true }
it 'is https://127.0.0.1:8080/-/k8s-proxy/' do
expect(config.gitlab_k8s_agent.__k8s_api_url).to eq('https://127.0.0.1:8080/-/k8s-proxy/')
end
end
context 'when gitlab_http_router is disabled' do
before do
yaml['gitlab_http_router'] = { 'enabled' => false }
end
context 'but https is not enabled' do
let(:https_enabled) { false }
it 'is http://127.0.0.1:3000/-/k8s-proxy/' do
expect(config.gitlab_k8s_agent.__k8s_api_url).to eq('http://127.0.0.1:3000/-/k8s-proxy/')
end
end
context 'and https is enabled' do
let(:https_enabled) { true }
it 'is https://127.0.0.1:3000/-/k8s-proxy/' do
expect(config.gitlab_k8s_agent.__k8s_api_url).to eq('https://127.0.0.1:3000/-/k8s-proxy/')
end
end
end
end
end
describe '__command' do
subject { config.gitlab_k8s_agent.__command }
it { is_expected.to eq 'gitlab-k8s-agent/build/gdk/bin/kas_race' }
context 'when run_from_source is true' do
let(:yaml) { { 'gitlab_k8s_agent' => { 'run_from_source' => true } } }
it { is_expected.to eq('support/exec-cd gitlab-k8s-agent go run -race cmd/kas/main.go') }
end
end
describe '__websocket_token_secret_file' do
subject { config.gitlab_k8s_agent.__websocket_token_secret_file }
it { is_expected.to eq '/home/git/gdk/gitlab-kas-websocket-token-secret' }
end
describe '__autoflow_temporal_workflow_data_encryption_secret_file' do
subject { config.gitlab_k8s_agent.autoflow.temporal.workflow_data_encryption.__secret_key_file }
it { is_expected.to eq '/home/git/gdk/gitlab-kas-autoflow-temporal-workflow-data-encryption-secret' }
end
describe 'tracing' do
it 'is disabled by default' do
expect(config.gitlab_k8s_agent.otlp_endpoint).to eq('')
expect(config.gitlab_k8s_agent.otlp_token_secret_file).to eq('')
expect(config.gitlab_k8s_agent.otlp_ca_certificate_file).to be('')
end
end
describe 'autoflow' do
it 'is disabled by default' do
expect(config.gitlab_k8s_agent.autoflow.enabled).to be(false)
end
describe '__http_client' do
it 'allows listen address' do
expect(config.gitlab_k8s_agent.autoflow.__http_client.allowed_ips).to include('127.0.0.1')
end
it 'allows listen port' do
expect(config.gitlab_k8s_agent.autoflow.__http_client.allowed_ports).to include(3000)
end
it 'allows standard HTTP and HTTPS ports' do
expect(config.gitlab_k8s_agent.autoflow.__http_client.allowed_ports).to include(80, 443)
end
end
describe 'temporal' do
it 'configures Temporal dev server host port by default' do
expect(config.gitlab_k8s_agent.autoflow.temporal.host_port).to eq('localhost:7233')
end
it 'configures Temporal dev server namespace by default' do
expect(config.gitlab_k8s_agent.autoflow.temporal.namespace).to eq('default')
end
end
end
end
describe 'nginx' do
describe '#__listen_address' do
let(:yaml) do
{
'port' => 1234,
'nginx' => { 'listen_address' => 'localhost' }
}
end
it 'is set to ip and default nginx port' do
expect(config.nginx.__listen_address).to eq('localhost:8080')
end
context 'when gitlab_http_router is disabled' do
before do
yaml['gitlab_http_router'] = { 'enabled' => false }
end
it 'is set to ip and port' do
expect(config.nginx.__listen_address).to eq('localhost:1234')
end
end
end
describe '#__request_buffering_off_routes' do
it 'has some defailt routes' do
expected_routes = [
'/api/v\d/jobs/\d+/artifacts$',
'\.git/git-receive-pack$',
'\.git/ssh-upload-pack$',
'\.git/ssh-receive-pack$',
'\.git/gitlab-lfs/objects',
'\.git/info/lfs/objects/batch$'
]
expect(config.nginx.__request_buffering_off_routes).to eq(expected_routes)
end
end
end
describe 'smartcard' do
it 'is disabled by default' do
expect(config.smartcard.enabled).to be(false)
end
it 'has a hostname by default' do
expect(config.smartcard.hostname).to eq('smartcard.gdk.test')
end
it 'uses managed port by default' do
default_port = GDK::PortManager.new(config: config).default_port_for_service('smartcard_nginx')
expect(config.smartcard.port).to eq(default_port)
end
it 'uses san_extensions by default' do
expect(config.smartcard.san_extensions).to be(true)
end
describe 'ssl' do
it 'provides default cert' do
expect(config.smartcard.ssl.certificate).to eq('smartcard.gdk.test.pem')
end
it 'provides default key' do
expect(config.smartcard.ssl.key).to eq('smartcard.gdk.test-key.pem')
end
it 'provides example client cert CA' do
expect(config.smartcard.ssl.client_cert_ca).to eq('/mkcert/rootCA.pem')
end
end
end
describe 'gitlab_elasticsearch_indexer' do
describe '#__dir' do
it 'returns the GitLab directory' do
expect(config.gitlab_elasticsearch_indexer.__dir).to eq(Pathname.new('/home/git/gdk/gitlab-elasticsearch-indexer'))
end
end
end
describe 'load_balancing' do
it 'disabled by default' do
expect(config.load_balancing.enabled).to be false
end
end
describe 'gitlab_ui' do
describe 'enabled' do
it 'is disabled by default' do
expect(config.gitlab_ui.enabled).to be(false)
end
end
describe 'auto_update' do
it 'is enabled by default' do
expect(config.gitlab_ui.auto_update).to be(true)
end
end
end
describe 'rails_web' do
describe 'enabled' do
it 'is enabled by default' do
expect(config.rails_web.enabled).to be(true)
end
end
end
describe 'vite' do
describe '#enabled' do
it 'is false by default' do
expect(config.vite.enabled).to be false
end
end
describe '#port' do
it 'is 3038 by default' do
expect(config.vite.port).to be 3038
end
end
describe '#hot_module_reloading' do
it 'is enabled by default' do
expect(config.vite.hot_module_reloading?).to be true
end
end
end
describe 'webpack' do
describe '#enabled' do
it 'is true by default' do
expect(config.webpack.enabled).to be true
end
end
describe '#incremental' do
it 'is true by default' do
expect(config.webpack.incremental).to be true
end
end
describe '#incremental_ttl' do
it 'is 30 days by default' do
expect(config.webpack.incremental_ttl).to be 30
end
end
describe '#vendor_dll' do
it 'is false by default' do
expect(config.webpack.vendor_dll).to be false
end
end
describe '#static' do
it 'is false by default' do
expect(config.webpack.static).to be false
end
end
describe '#sourcemaps' do
it 'is true by default' do
expect(config.webpack.sourcemaps).to be true
end
end
describe '#live_reload' do
it 'is true by default' do
expect(config.webpack.live_reload).to be true
end
end
describe '#public_address' do
it 'is empty string by default' do
expect(config.webpack.public_address).to be ""
end
end
describe '#allowed_hosts' do
it 'returns empty array by default' do
expect(config.webpack.allowed_hosts).to eq []
end
end
describe '#__dev_server_public' do
context 'when live_reload is disabled' do
before do
yaml['webpack'] = { 'live_reload' => false }
end
it 'is empty string' do
expect(config.webpack.__dev_server_public).to be ""
end
end
context 'when public_address is set' do
before do
yaml['webpack'] = { 'public_address' => "wss://3808-example.gitpod.io/ws" }
end
it 'is equals the public_address value' do
expect(config.webpack.__dev_server_public).to be config.webpack.public_address
end
end
context 'when nginx is enabled (with http)' do
before do
yaml['nginx'] = { 'enabled' => true }
end
it 'is set to the nginx proxy with ws' do
expect(config.webpack.__dev_server_public).to eq "ws://#{config.nginx.__listen_address}/_hmr/"
end
end
context 'when nginx is enabled (with https)' do
before do
yaml['nginx'] = { 'enabled' => true }
yaml['https'] = { 'enabled' => true }
end
it 'is set to the nginx proxy with wss' do
expect(config.webpack.__dev_server_public).to eq "wss://#{config.nginx.__listen_address}/_hmr/"
end
end
end
end
describe 'action_cable' do
describe '#worker_pool_size' do
it 'returns 4 by deftault' do
expect(config.action_cable.worker_pool_size).to eq 4
end
end
end
describe 'registry' do
describe '#version' do
context 'when no version is specified' do
it 'returns the default version' do
expect(config.registry.version).to eq('v4.14.0-gitlab')
end
end
end
describe '#api_host' do
it 'returns the default hostname' do
expect(config.registry.api_host).to eq('gdk.example.com')
end
end
describe '#port' do
it 'returns 5100 by default' do
expect(config.registry.port).to eq(5100)
end
end
describe '#__listen' do
it 'returns gdk.example.com:5100 by default' do
expect(config.registry.__listen).to eq('gdk.example.com:5100')
end
end
describe '#listen_address' do
it 'returns 127.0.0.1 by default' do
expect(config.registry.listen_address).to eq('127.0.0.1')
end
end
describe '#notifications_enabled' do
it 'returns false' do
expect(config.registry.notifications_enabled).to be false
end
end
describe '#read_only_maintenance_enabled' do
it 'returns false' do
expect(config.registry.read_only_maintenance_enabled).to be false
end
end
describe '#__registry_build_bin_path' do
it 'is /home/git/gdk/container-registry/bin/registry by default' do
expect(config.registry.__registry_build_bin_path).to eq(Pathname.new('/home/git/gdk/container-registry/bin/registry'))
end
end
describe 'database' do
describe '#enabled' do
it 'is false by default' do
expect(config.registry.database.enabled).to be(false)
end
end
describe '#host' do
it 'is postgresql host by default' do
expect(config.registry.database.host).to eq(default_config.postgresql.dir.to_s)
end
context 'for a Geo secondary' do
let!(:yaml) do
{
'geo' => {
'enabled' => true,
'secondary' => true
}
}
end
it 'is default geo secondary postgresql host by default' do
expect(config.registry.database.host).to eq('/home/git/gdk/postgresql-geo')
end
end
end
describe '#port' do
it 'is 5432 by default' do
expect(config.registry.database.port).to eq(5432)
end
context 'for a Geo secondary' do
let!(:yaml) do
{
'geo' => {
'enabled' => true,
'secondary' => true
}
}
end
it 'is default geo secondary postgresql port by default' do
expect(config.registry.database.port).to eq(5431)
end
end
end
describe '#dbname' do
it 'is registry_dev by default' do
expect(config.registry.database.dbname).to eq('registry_dev')
end
end
describe '#sslmode' do
it 'is disabled by default' do
expect(config.registry.database.sslmode).to eq('disable')
end
end
end
end
describe 'object_store' do
describe '#host' do
it 'returns the default hostname' do
expect(config.object_store.host).to eq('127.0.0.1')
end
end
describe '#connection' do
context 'default settings' do
let(:default_connection) do
{
'provider' => 'AWS',
'aws_access_key_id' => 'minio',
'aws_secret_access_key' => 'gdk-minio',
'region' => 'gdk',
'endpoint' => "http://127.0.0.1:9000",
'path_style' => true
}
end
it 'returns the default Minio connection parameters' do
expect(config.object_store.connection).to eq(default_connection)
end
it 'configures Gitaly backup URL' do
expect(config.gitaly.backup.go_cloud_url).to eq("s3://gitaly-backups?awssdk=v2&disable_https=true&use_path_style=true®ion=gdk&endpoint=http%3A%2F%2F127.0.0.1%3A9000")
end
end
context 'with external S3 provider' do
let(:s3_connection) do
{
'provider' => 'AWS',
'aws_access_key_id' => 'test_access_key',
'aws_secret_access_key' => 'secret'
}
end
before do
yaml.merge!(
{
'object_store' => {
'enabled' => true,
'connection' => s3_connection
}
}
)
end
it 'configures the S3 provider' do
expect(config.object_store.enabled?).to be true
expect(config.object_store.connection).to eq(s3_connection)
end
it 'configures Gitaly backup URL' do
expect(config.gitaly.backup.go_cloud_url).to eq("s3://gitaly-backups?awssdk=v2&disable_https=false&use_path_style=false")
end
end
context 'with AzureRM provider' do
let(:azure_connection) do
{
'provider' => 'AzureRM',
'azure_storage_account_name' => 'azure-account',
'azure_storage_access_key' => '12345'
}
end
before do
yaml.merge!(
{
'object_store' => {
'enabled' => true,
'connection' => azure_connection
}
}
)
end
it 'configures the Azure provider' do
expect(config.object_store.enabled?).to be true
expect(config.object_store.connection).to eq(azure_connection)
end
it 'configures Gitaly backup URL' do
expect(config.gitaly.backup.go_cloud_url).to eq("azblob://gitaly-backups?storage_account=azure-account")
end
end
context 'with Google provider' do
let(:google_connection) do
{
'provider' => 'Google',
'google_application_default' => true
}
end
before do
yaml.merge!(
{
'object_store' => {
'enabled' => true,
'connection' => google_connection
}
}
)
end
it 'configures the Google provider' do
expect(config.object_store.enabled?).to be true
expect(config.object_store.connection).to eq(google_connection)
end
it 'configures Gitaly backup URL' do
expect(config.gitaly.backup.go_cloud_url).to eq("gs://gitaly-backups")
end
end
end
describe '#backup_remote_directory' do
it 'is empty by default' do
expect(config.object_store.backup_remote_directory).to eq('')
end
end
describe '#console_port' do
it 'is set to 9001 by default' do
expect(config.object_store.console_port).to eq(9002)
end
context 'with a custom port' do
before do
yaml.merge!('object_store' => { 'console_port' => 1337 })
end
it 'is set to the custom value' do
expect(config.object_store.console_port).to eq(1337)
end
end
end
end
describe 'omniauth' do
context 'defaults' do
it 'returns false' do
expect(config.omniauth.google_oauth2.enabled).to be false
expect(config.omniauth.group_saml.enabled).to be false
expect(config.omniauth.github.enabled).to be false
end
end
context 'when group SAML is disabled' do
it 'returns false' do
expect(config.omniauth.group_saml.enabled).to be false
end
end
context 'when group SAML is enabled' do
let(:group_saml_enabled) { true }
it 'returns true' do
expect(config.omniauth.group_saml.enabled).to be true
end
end
context 'when GitHub is enabled' do
let(:omniauth_config) { { 'github' => { 'enabled' => true, 'client_id' => '12345', 'client_secret' => 'mysecret' } } }
it 'returns true' do
expect(config.omniauth.github.enabled).to be true
expect(config.omniauth.github.client_id).to eq('12345')
expect(config.omniauth.github.client_secret).to eq('mysecret')
end
end
context 'when OpenID Connect is enabled' do
let(:omniauth_config) { { 'openid_connect' => { 'enabled' => true, 'args' => { 'scope' => 'openid' } } } }
it 'returns true' do
expect(config.omniauth.openid_connect.enabled).to be true
expect(config.omniauth.openid_connect.args).to eq({ 'scope' => 'openid' })
end
end
end
describe 'gitlab_pages' do
describe '#enabled' do
it 'defaults to false' do
expect(config.gitlab_pages.enabled).to be(false)
expect(config.gitlab_pages.enabled?).to be(false)
end
end
describe '#host' do
context 'when host is not specified' do
it 'returns the default hostname' do
expect(config.gitlab_pages.host).to eq('127.0.0.1.nip.io')
end
end
context 'when host is specified' do
let(:yaml) do
{
'gitlab_pages' => { 'host' => 'pages.localhost' }
}
end
it 'returns the configured hostname' do
expect(config.gitlab_pages.host).to eq('pages.localhost')
end
end
end
describe '#port' do
context 'when port is not specified' do
it 'returns the default port' do
expect(config.gitlab_pages.port).to eq(3010)
end
end
context 'when port is specified' do
let(:yaml) do
{
'gitlab_pages' => { 'port' => 5555 }
}
end
it 'returns the configured port' do
expect(config.gitlab_pages.port).to eq(5555)
end
end
describe '#verbose' do
it 'defaults to false' do
expect(config.gitlab_pages.verbose).to be(false)
expect(config.gitlab_pages.verbose?).to be(false)
end
context 'when verbose is specified' do
let(:yaml) do
{
'gitlab_pages' => { 'verbose' => true }
}
end
it 'returns the configured port' do
expect(config.gitlab_pages.verbose).to be(true)
end
end
end
describe '#propagate_correlation_id' do
it 'defaults to false' do
expect(config.gitlab_pages.propagate_correlation_id).to be(false)
expect(config.gitlab_pages.propagate_correlation_id?).to be(false)
end
context 'when propagate_correlation_id is specified' do
let(:yaml) do
{
'gitlab_pages' => { 'propagate_correlation_id' => true }
}
end
it 'returns the configured port' do
expect(config.gitlab_pages.propagate_correlation_id).to be(true)
end
end
end
end
describe '#__uri' do
it 'returns 127.0.0.1.nip.io:3010' do
expect(config.gitlab_pages.__uri.to_s).to eq('127.0.0.1.nip.io:3010')
end
end
describe '#access_control' do
it 'defaults to false' do
expect(config.gitlab_pages.access_control?).to be(false)
end
context 'when access_control is enabled' do
let(:yaml) do
{
'gitlab_pages' => { 'access_control' => true, 'auth_client_id' => 'client_id', 'auth_client_secret' => 'client_secret', 'auth_scope' => 'read_api' }
}
end
it 'configures auth correctly' do
expect(config.gitlab_pages.access_control?).to be(true)
expect(config.gitlab_pages.auth_client_id).to eq('client_id')
expect(config.gitlab_pages.auth_client_secret).to eq('client_secret')
expect(config.gitlab_pages.auth_scope).to eq('read_api')
expect(config.gitlab_pages.__auth_secret.length).to eq(32)
expect(config.gitlab_pages.__auth_redirect_uri).to eq('http://127.0.0.1.nip.io:3010/auth')
end
end
end
describe '#enable_custom_domains' do
it 'defaults to false' do
expect(config.gitlab_pages.enable_custom_domains?).to be(false)
end
context 'when enable_custom_domains is enabled' do
let(:yaml) do
{
'gitlab_pages' => { 'enable_custom_domains' => true }
}
end
it 'configures custom domains correctly' do
expect(config.gitlab_pages.enable_custom_domains?).to be(true)
end
end
end
describe '#auth_scope' do
it 'defaults to api' do
expect(config.gitlab_pages.auth_scope).to eq('api')
end
context 'when auth_scope is set' do
let(:yaml) do
{
'gitlab_pages' => { 'access_control' => true, 'auth_scope' => 'read_api' }
}
end
it 'configures auth scope' do
expect(config.gitlab_pages.auth_scope).to eq('read_api')
end
end
end
end
describe 'prometheus' do
describe '#enabled' do
it 'defaults to false' do
expect(config.prometheus.enabled).to be(false)
end
end
describe '#__uri' do
it 'returns http://gdk.example.com:9090 by default' do
expect(config.prometheus.__uri.to_s).to eq('http://gdk.example.com:9090')
end
end
describe '#port' do
it 'defaults to 9090' do
expect(config.prometheus.port).to eq(9090)
end
end
describe '#gitaly_exporter_port' do
it 'defaults to 9236' do
expect(config.prometheus.gitaly_exporter_port).to eq(9236)
end
end
describe '#praefect_exporter_port' do
it 'defaults to 10101' do
expect(config.prometheus.praefect_exporter_port).to eq(10101)
end
end
describe '#workhorse_exporter_port' do
it 'defaults to 9229' do
expect(config.prometheus.workhorse_exporter_port).to eq(9229)
end
end
describe '#gitlab_shell_exporter_port' do
it 'defaults to 9122' do
expect(config.prometheus.gitlab_shell_exporter_port).to eq(9122)
end
end
describe '#gitlab_ai_gateway_exporter_port' do
it 'defaults to 8082' do
expect(config.prometheus.gitlab_ai_gateway_exporter_port).to eq(8082)
end
end
describe '__add_host_flags' do
before do
yaml['prometheus'] = {
'enabled' => 'true'
}
end
context 'when extra_hosts is empty' do
before do
yaml['prometheus']['extra_hosts'] = []
end
it 'returns an empty string' do
flags = config.prometheus.__add_host_flags
expect(flags).to be_a(String)
expect(flags).to be_empty
end
end
context 'when extra_hosts contains a single item' do
before do
yaml['prometheus']['extra_hosts'] = ['gdk.test:172.16.123.1']
end
it 'returns a single flag' do
expect(config.prometheus.__add_host_flags).to eq("--add-host='gdk.test:172.16.123.1'")
end
end
context 'when extra_hosts contains multiple items' do
before do
yaml['prometheus']['extra_hosts'] =
['gdk.test:172.16.123.1', 'gdk.test:192.168.65.2', 'registry.gdk.test:172.17.0.4']
end
it 'returns multiple flags separated by spaces' do
flags = config.prometheus.__add_host_flags
expect(flags).to eq("--add-host='gdk.test:172.16.123.1' --add-host='gdk.test:192.168.65.2' --add-host='registry.gdk.test:172.17.0.4'")
end
end
end
end
describe 'grafana' do
describe '#enabled' do
it 'defaults to false' do
expect(config.grafana.enabled).to be(false)
expect(config.grafana.enabled?).to be(false)
end
end
describe '#__uri' do
it 'returns http://gdk.example.com:4000 by default' do
expect(config.grafana.__uri.to_s).to eq('http://gdk.example.com:4000')
end
end
describe '#port' do
it 'defaults to 4000' do
expect(config.grafana.port).to eq(4000)
end
end
end
describe 'gdk' do
describe '#debug' do
it 'defaults to false' do
expect(config.gdk.debug?).to be(false)
end
end
describe '#auto_reconfigure' do
it 'defaults to true' do
expect(config.gdk.auto_reconfigure).to be(true)
expect(config.gdk.auto_reconfigure?).to be(true)
end
end
describe '#auto_rebase_projects' do
it 'defaults to false' do
expect(config.gdk.auto_rebase_projects?).to be(false)
end
end
describe '#use_bash_shim' do
it 'defaults to false' do
expect(config.gdk.use_bash_shim?).to be(false)
end
end
describe '#runit_wait_secs' do
it 'is 20 secs by default' do
expect(config.gdk.runit_wait_secs).to eq(20)
end
end
describe '#start_hooks' do
describe '#before' do
it 'is an empty array by default' do
expect(config.gdk.start_hooks.before).to eq([])
end
context 'with custom hooks defined' do
let(:yaml) do
{ 'gdk' => { 'start_hooks' => { 'before' => ['uptime'] } } }
end
it 'replaces hooks with ours' do
expect(config.gdk.start_hooks.before).to eq(['uptime'])
end
end
end
describe '#after' do
it 'is an empty array by default' do
expect(config.gdk.start_hooks.after).to eq([])
end
context 'with custom hooks defined' do
let(:yaml) do
{ 'gdk' => { 'start_hooks' => { 'after' => ['uptime'] } } }
end
it 'replaces hooks with ours' do
expect(config.gdk.start_hooks.after).to eq(['uptime'])
end
end
end
end
describe '#stop_hooks' do
describe '#before' do
it 'is an empty array by default' do
expect(config.gdk.stop_hooks.before).to eq([])
end
context 'with custom hooks defined' do
let(:yaml) do
{ 'gdk' => { 'stop_hooks' => { 'before' => ['uptime'] } } }
end
it 'replaces hooks with ours' do
expect(config.gdk.stop_hooks.before).to eq(['uptime'])
end
end
end
describe '#after' do
it 'is an empty array by default' do
expect(config.gdk.stop_hooks.after).to eq([])
end
context 'with custom hooks defined' do
let(:yaml) do
{ 'gdk' => { 'stop_hooks' => { 'after' => ['uptime'] } } }
end
it 'replaces hooks with ours' do
expect(config.gdk.stop_hooks.after).to eq(['uptime'])
end
end
end
end
describe '#update_hooks' do
describe '#before' do
it 'has spring stop || true hook by default' do
expect(config.gdk.update_hooks.before).to eq(['support/exec-cd gitlab bin/spring stop || true'])
end
context 'with custom hooks defined' do
let(:yaml) do
{ 'gdk' => { 'update_hooks' => { 'before' => ['uptime'] } } }
end
it 'has spring stop || true hook and then our hooks also' do
expect(config.gdk.update_hooks.before).to eq(['uptime', 'support/exec-cd gitlab bin/spring stop || true'])
end
end
end
describe '#after' do
it 'is an empty array by default' do
expect(config.gdk.update_hooks.after).to eq([])
end
context 'with custom hooks defined' do
let(:yaml) do
{ 'gdk' => { 'update_hooks' => { 'after' => ['uptime'] } } }
end
it 'replaces hooks with ours' do
expect(config.gdk.update_hooks.after).to eq(['uptime'])
end
end
end
end
end
describe 'tracer' do
describe 'build_tags' do
it "is 'tracer_static tracer_static_jaeger' by default" do
expect(config.tracer.build_tags).to eq('tracer_static tracer_static_jaeger')
end
end
describe 'jaeger' do
subject(:jaeger) { config.tracer.jaeger }
describe 'enabled' do
it 'is disabled by default' do
expect(jaeger.enabled).to be(false)
expect(jaeger.enabled?).to be(false)
end
end
describe 'version' do
it 'is 1.21.0 by default' do
expect(jaeger.version).to eq('1.21.0')
end
end
describe 'listen_address' do
it 'is config.hostname by default' do
expect(jaeger.listen_address).to eq(config.hostname)
end
end
describe '__tracer_url' do
it { expect(jaeger.__tracer_url).to eq("opentracing://jaeger?http_endpoint=http%3A%2F%2F#{jaeger.listen_address}%3A14268%2Fapi%2Ftraces&sampler=const&sampler_param=1") }
end
describe '__search_url' do
it { expect(jaeger.__search_url).to eq("http://#{jaeger.listen_address}:16686/search?service={{ service }}&tags=%7B%22correlation_id%22%3A%22{{ correlation_id }}%22%7D") }
end
end
end
describe 'asdf' do
describe 'opt_out' do
it 'is disabled by default' do
expect(config.asdf.opt_out).to be(false)
expect(config.asdf.opt_out?).to be(false)
end
end
describe '__available?' do
let(:yaml) do
{ 'asdf' => { 'opt_out' => asdf_opt_out } }
end
before do
allow(GDK::Dependencies).to receive(:config).and_return(config)
end
context 'when asdf.opt_out? is true' do
let(:asdf_opt_out) { true }
it 'returns false' do
expect(config.asdf.__available?).to be(false)
end
end
context 'when asdf.opt_out? is false' do
let(:asdf_opt_out) { false }
before do
stub_env('ASDF_DIR', nil)
end
context 'but asdf is not installed / configured' do
it 'returns false' do
allow(GDK::Dependencies).to receive(:asdf_available?).and_return(false)
expect(config.asdf.__available?).to be(false)
end
end
context 'and asdf is installed / configured' do
it 'returns true' do
allow(GDK::Dependencies).to receive(:asdf_available?).and_return(true)
expect(config.asdf.__available?).to be(true)
end
end
end
end
end
describe 'docs_gitlab_com' do
describe 'enabled' do
it 'is disabled by default' do
expect(config.docs_gitlab_com.enabled).to be(false)
expect(config.docs_gitlab_com.enabled?).to be(false)
expect(config.docs_gitlab_com?).to be(false)
end
end
describe 'auto_update' do
it 'is enabled by default' do
expect(config.docs_gitlab_com.auto_update).to be(true)
expect(config.docs_gitlab_com.auto_update?).to be(true)
end
end
describe '#port' do
context 'when port is not specified' do
it 'returns the default port' do
expect(config.docs_gitlab_com.port).to eq(1313)
end
end
context 'when port is specified' do
let(:yaml) do
{
'docs_gitlab_com' => { 'port' => 5555 }
}
end
it 'returns the configured port' do
expect(config.docs_gitlab_com.port).to eq(5555)
end
end
end
describe 'gitlab_runner' do
describe 'enabled' do
it 'is disabled by default' do
expect(config.gitlab_runner.enabled).to be(false)
expect(config.gitlab_runner.enabled?).to be(false)
end
end
describe 'auto_update' do
it 'is enabled by default' do
expect(config.gitlab_runner.auto_update).to be(true)
expect(config.gitlab_runner.auto_update?).to be(true)
end
end
end
describe 'omnibus_gitlab' do
describe 'enabled' do
it 'is disabled by default' do
expect(config.omnibus_gitlab.enabled).to be(false)
expect(config.omnibus_gitlab.enabled?).to be(false)
end
end
describe 'auto_update' do
it 'is enabled by default' do
expect(config.omnibus_gitlab.auto_update).to be(true)
expect(config.omnibus_gitlab.auto_update?).to be(true)
end
end
end
describe 'charts_gitlab' do
describe 'enabled' do
it 'is disabled by default' do
expect(config.charts_gitlab.enabled).to be(false)
expect(config.charts_gitlab.enabled?).to be(false)
end
end
describe 'auto_update' do
it 'is enabled by default' do
expect(config.charts_gitlab.auto_update).to be(true)
expect(config.charts_gitlab.auto_update?).to be(true)
end
end
end
describe 'gitlab_operator' do
describe 'enabled' do
it 'is disabled by default' do
expect(config.gitlab_operator.enabled).to be(false)
expect(config.gitlab_operator.enabled?).to be(false)
end
end
describe 'auto_update' do
it 'is enabled by default' do
expect(config.gitlab_operator.auto_update).to be(true)
expect(config.gitlab_operator.auto_update?).to be(true)
end
end
end
end
describe 'packages' do
describe '__dpkg_deb_path' do
before do
allow(GDK::Machine).to receive(:platform).and_return(fake_platform)
end
context 'on a macOS system' do
let(:fake_platform) { 'darwin' }
before do
allow(File).to receive(:exist?).and_return(false)
allow(File).to receive(:exist?).with(brew_path).and_return(true)
end
context 'with Intel' do
let(:brew_path) { '/usr/local/bin/brew' }
it 'returns /usr/local/bin/dpkg-deb' do
expect(config.packages.__dpkg_deb_path.to_s).to eq('/usr/local/bin/dpkg-deb')
end
end
context 'with Apple Silicon' do
let(:brew_path) { '/opt/homebrew/bin/brew' }
it 'returns /opt/homebrew/bin/dpkg-deb' do
expect(config.packages.__dpkg_deb_path.to_s).to eq('/opt/homebrew/bin/dpkg-deb')
end
end
end
context 'on a Linux system' do
let(:fake_platform) { 'linux' }
it 'returns /usr/bin/dpkg-deb' do
expect(config.packages.__dpkg_deb_path.to_s).to eq('/usr/bin/dpkg-deb')
end
end
end
end
describe 'dev' do
describe 'checkmake' do
describe 'version' do
it 'returns 8915bd4 by default' do
expect(config.dev.checkmake.version).to eq('8915bd4')
end
end
end
end
describe 'redis' do
describe 'databases' do
describe 'development' do
describe 'rate_limiting' do
it 'is 4 by default' do
expect(config.redis.databases.development.rate_limiting).to eq(4)
end
end
describe 'sessions' do
it 'is 5 by default' do
expect(config.redis.databases.development.sessions).to eq(5)
end
end
describe 'repository_cache' do
it 'is 2 by default' do
expect(config.redis.databases.development.repository_cache).to eq(2)
end
end
end
describe 'test' do
describe 'rate_limiting' do
it 'is 14 by default' do
expect(config.redis.databases.test.rate_limiting).to eq(14)
end
end
describe 'sessions' do
it 'is 15 by default' do
expect(config.redis.databases.test.sessions).to eq(15)
end
end
describe 'repository_cache' do
it 'is 12 by default' do
expect(config.redis.databases.test.repository_cache).to eq(12)
end
end
end
end
describe '#dir' do
it 'returns the redis directory' do
expect(config.redis.dir).to eq(Pathname.new('/home/git/gdk/redis'))
end
end
end
describe 'snowplow_micro' do
describe '#enabled' do
it 'defaults to false' do
expect(config.snowplow_micro.enabled).to be(false)
end
end
describe '#port' do
it 'defaults to 9091' do
expect(config.snowplow_micro.port).to eq(9091)
end
end
describe '#image' do
it 'defaults to snowplow/snowplow-micro:latest' do
expect(config.snowplow_micro.image).to eq('snowplow/snowplow-micro:latest')
end
end
end
describe 'gitlab_shell' do
context 'lfs' do
describe '#pure_ssh_protocol_enabled' do
it 'defaults to false' do
expect(config.gitlab_shell.lfs.pure_ssh_protocol_enabled).to be(false)
end
end
end
context 'pat' do
it 'sets default values for pat' do
expect(config.gitlab_shell.pat.enabled).to be(true)
expect(config.gitlab_shell.pat.allowed_scopes).to eq([])
end
end
end
describe 'gitlab_ai_gateway' do
describe '#enabled' do
it 'defaults to false' do
expect(config.gitlab_ai_gateway.enabled).to be(false)
end
end
describe '#__listen' do
it "is 'http://gdk.example.com:5052'" do
expect(config.gitlab_ai_gateway.__listen.to_s).to eq('http://gdk.example.com:5052')
end
end
describe '#__service_command' do
it "is 'support/exec-cd gitlab-ai-gateway poetry run ai_gateway'" do
expect(config.gitlab_ai_gateway.__service_command).to eq('support/exec-cd gitlab-ai-gateway poetry run ai_gateway')
end
end
end
describe 'gitlab_http_router' do
describe '#enabled' do
it 'defaults to true' do
expect(config.gitlab_http_router.enabled).to be(true)
end
end
describe '#uses_different_port' do
it 'defaults to false' do
expect(config.gitlab_http_router.use_distinct_port?).to be(false)
end
end
describe '#gitlab_rules_config' do
it 'defaults to `session_prefix`' do
expect(config.gitlab_http_router.gitlab_rules_config).to eq('session_prefix')
end
end
describe '#port' do
it 'defaults to 9393' do
expect(config.gitlab_http_router.port).to eq(9393)
end
end
end
describe 'gitlab_topology_service' do
describe '#enabled' do
it 'defaults to true' do
expect(config.gitlab_topology_service.enabled).to be(true)
end
end
describe '#grpc_port' do
it 'defaults to 9095' do
expect(config.gitlab_topology_service.grpc_port).to eq(9095)
end
end
describe '#rest_port' do
it 'defaults to 9096' do
expect(config.gitlab_topology_service.rest_port).to eq(9096)
end
end
describe 'certificate files' do
let(:certs_directory) { "/home/git/gdk/gitlab-topology-service/tmp/certs" }
it 'they default to the certificate files in the temp directory' do
expect(config.gitlab.topology_service.ca_file).to eq(Pathname.new(File.join(certs_directory, "ca-cert.pem")))
expect(config.gitlab.topology_service.certificate_file).to eq(Pathname.new(File.join(certs_directory, "client-cert.pem")))
expect(config.gitlab.topology_service.private_key_file).to eq(Pathname.new(File.join(certs_directory, "client-key.pem")))
end
end
end
describe 'openbao' do
describe '#enabled' do
it 'is disabled by default' do
expect(config.openbao.enabled).to be(false)
expect(config.openbao.enabled?).to be(false)
expect(config.openbao?).to be(false)
end
end
describe '#bin' do
subject(:path) { default_config.openbao.bin }
it { is_expected.to eq(default_config.gdk_root.join('openbao', 'bin', 'bao')) }
end
describe '#__server_command' do
it 'defaults to dev mode' do
expect(config.openbao.__server_command).to eq("#{config.openbao.bin} server --config /home/git/gdk/openbao/config.hcl")
end
end
describe '#__listen' do
it 'defaults to gdk hostname on port 8200' do
expect(config.openbao.__listen).to eq("#{config.hostname}:8200")
end
end
describe '#port' do
it 'defaults to 8200' do
expect(config.openbao.port).to eq(8200)
end
end
end
describe 'openbao-proxy' do
describe '#enabled' do
it 'is disabled by default' do
expect(config.openbao.vault_proxy.enabled).to be(false)
expect(config.openbao.vault_proxy.enabled?).to be(false)
expect(config.openbao.vault_proxy?).to be(false)
end
end
describe '#__server_command' do
it 'defaults to dev mode' do
expect(config.openbao.vault_proxy.__server_command).to eq("#{config.openbao.vault_proxy.bin} proxy --config /home/git/gdk/openbao/proxy_config.hcl")
end
end
describe '#__listen' do
it 'defaults to gdk hostname on port 8100' do
expect(config.openbao.vault_proxy.__listen).to eq("#{config.hostname}:8100")
end
end
describe '#port' do
it 'defaults to 8100' do
expect(config.openbao.vault_proxy.port).to eq(8100)
end
end
end
def create_dummy_executable(name)
path = File.join(tmp_path, name)
FileUtils.touch(path)
File.chmod(0o755, path)
path
end
end