diff --git a/config/gitlab.yml.example b/config/gitlab.yml.example index 291431aa23fcee3b8309cea4bb6575465196ac12..57788e55f8fa8651c852eda111c86929b4101c34 100644 --- a/config/gitlab.yml.example +++ b/config/gitlab.yml.example @@ -1386,7 +1386,7 @@ test: storages: default: path: tmp/tests/repositories/ - gitaly_address: unix:tmp/tests/gitaly/gitaly.socket + gitaly_address: unix:tmp/tests/gitaly/praefect.socket gitaly: client_path: tmp/tests/gitaly diff --git a/lib/gitlab/setup_helper.rb b/lib/gitlab/setup_helper.rb index f6e4c3bd58499395f71758610f7d9ad70168ae9c..48f204e0b86318530237ef97b4a3d063d5594d46 100644 --- a/lib/gitlab/setup_helper.rb +++ b/lib/gitlab/setup_helper.rb @@ -4,10 +4,10 @@ module Gitlab module SetupHelper - def create_configuration(dir, storage_paths, force: false) + def create_configuration(dir, storage_paths, force: false, options: {}) generate_configuration( - configuration_toml(dir, storage_paths), - get_config_path(dir), + configuration_toml(dir, storage_paths, options), + get_config_path(dir, options), force: force ) end @@ -31,7 +31,7 @@ def generate_configuration(toml_data, config_path, force: false) module Workhorse extend Gitlab::SetupHelper class << self - def configuration_toml(dir, _) + def configuration_toml(dir, _, _) config = { redis: { URL: redis_url } } TomlRB.dump(config) @@ -41,8 +41,8 @@ def redis_url Gitlab::Redis::SharedState.url end - def get_config_path(dir) - File.join(dir, 'config.toml') + def get_config_path(dir, _) + File.join(dir, 'config_path') end def compile_into(dir) @@ -76,7 +76,7 @@ class << self # because it uses a Unix socket. # For development and testing purposes, an extra storage is added to gitaly, # which is not known to Rails, but must be explicitly stubbed. - def configuration_toml(gitaly_dir, storage_paths, gitaly_ruby: true) + def configuration_toml(gitaly_dir, storage_paths, options, gitaly_ruby: true) storages = [] address = nil @@ -97,14 +97,20 @@ def configuration_toml(gitaly_dir, storage_paths, gitaly_ruby: true) config = { socket_path: address.sub(/\Aunix:/, '') } if Rails.env.test? + socket_filename = options[:gitaly_socket] || "gitaly.socket" + + config = { + # Override the set gitaly_address since Praefect is in the loop + socket_path: File.join(gitaly_dir, socket_filename), + auth: { token: 'secret' }, + # Compared to production, tests run in constrained environments. This + # number is meant to grow with the number of concurrent rails requests / + # sidekiq jobs, and concurrency will be low anyway in test. + git: { catfile_cache_size: 5 } + } + storage_path = Rails.root.join('tmp', 'tests', 'second_storage').to_s storages << { name: 'test_second_storage', path: storage_path } - - config[:auth] = { token: 'secret' } - # Compared to production, tests run in constrained environments. This - # number is meant to grow with the number of concurrent rails requests / - # sidekiq jobs, and concurrency will be low anyway in test. - config[:git] = { catfile_cache_size: 5 } end config[:storage] = storages @@ -124,8 +130,9 @@ def configuration_toml(gitaly_dir, storage_paths, gitaly_ruby: true) private - def get_config_path(dir) - File.join(dir, 'config.toml') + def get_config_path(dir, options) + config_filename = options[:config_filename] || 'config.toml' + File.join(dir, config_filename) end end end @@ -133,9 +140,11 @@ def get_config_path(dir) module Praefect extend Gitlab::SetupHelper class << self - def configuration_toml(gitaly_dir, storage_paths) + def configuration_toml(gitaly_dir, _, _) nodes = [{ storage: 'default', address: "unix:#{gitaly_dir}/gitaly.socket", primary: true, token: 'secret' }] - storages = [{ name: 'default', node: nodes }] + second_storage_nodes = [{ storage: 'test_second_storage', address: "unix:#{gitaly_dir}/gitaly2.socket", primary: true, token: 'secret' }] + + storages = [{ name: 'default', node: nodes }, { name: 'test_second_storage', node: second_storage_nodes }] failover = { enabled: false } config = { socket_path: "#{gitaly_dir}/praefect.socket", memory_queue_enabled: true, virtual_storage: storages, failover: failover } config[:token] = 'secret' if Rails.env.test? @@ -145,7 +154,7 @@ def configuration_toml(gitaly_dir, storage_paths) private - def get_config_path(dir) + def get_config_path(dir, _) File.join(dir, 'praefect.config.toml') end end diff --git a/scripts/gitaly-test-build b/scripts/gitaly-test-build index 5254d957afde9b221a18349d011a5125694706e6..00927646046986e2923edbc0c30267943b7df895 100755 --- a/scripts/gitaly-test-build +++ b/scripts/gitaly-test-build @@ -19,8 +19,10 @@ class GitalyTestBuild # Starting gitaly further validates its configuration gitaly_pid = start_gitaly + gitaly2_pid = start_gitaly2 praefect_pid = start_praefect Process.kill('TERM', gitaly_pid) + Process.kill('TERM', gitaly2_pid) Process.kill('TERM', praefect_pid) # Make the 'gitaly' executable look newer than 'GITALY_SERVER_VERSION'. diff --git a/scripts/gitaly-test-spawn b/scripts/gitaly-test-spawn index 8e16b2bb65678da58ba48645e212da0b66aa9db3..c2ff9cd08aaeb34c375b6e8c319638c19663da5d 100755 --- a/scripts/gitaly-test-spawn +++ b/scripts/gitaly-test-spawn @@ -15,6 +15,7 @@ class GitalyTestSpawn # In local development this pid file is used by rspec. IO.write(File.expand_path('../tmp/tests/gitaly.pid', __dir__), start_gitaly) + IO.write(File.expand_path('../tmp/tests/gitaly2.pid', __dir__), start_gitaly2) IO.write(File.expand_path('../tmp/tests/praefect.pid', __dir__), start_praefect) end end diff --git a/scripts/gitaly_test.rb b/scripts/gitaly_test.rb index 54bf07b377335234c963a008f94ae75075428ddc..559ad8f4345a1a2ce92ac1135aea64ad5487dcf9 100644 --- a/scripts/gitaly_test.rb +++ b/scripts/gitaly_test.rb @@ -62,21 +62,36 @@ def config_path(service) case service when :gitaly File.join(tmp_tests_gitaly_dir, 'config.toml') + when :gitaly2 + File.join(tmp_tests_gitaly_dir, 'gitaly2.config.toml') when :praefect File.join(tmp_tests_gitaly_dir, 'praefect.config.toml') end end + def service_binary(service) + case service + when :gitaly, :gitaly2 + 'gitaly' + when :praefect + 'praefect' + end + end + def start_gitaly start(:gitaly) end + def start_gitaly2 + start(:gitaly2) + end + def start_praefect start(:praefect) end def start(service) - args = ["#{tmp_tests_gitaly_dir}/#{service}"] + args = ["#{tmp_tests_gitaly_dir}/#{service_binary(service)}"] args.push("-config") if service == :praefect args.push(config_path(service)) pid = spawn(env, *args, [:out, :err] => "log/#{service}-test.log") diff --git a/spec/support/helpers/test_env.rb b/spec/support/helpers/test_env.rb index f54153a72f8d2a5528b03d7481f49755596c2c42..01571277a1d9c677568d002505640b6b981e110b 100644 --- a/spec/support/helpers/test_env.rb +++ b/spec/support/helpers/test_env.rb @@ -168,6 +168,11 @@ def setup_gitaly version: Gitlab::GitalyClient.expected_server_version, task: "gitlab:gitaly:install[#{install_gitaly_args}]") do Gitlab::SetupHelper::Gitaly.create_configuration(gitaly_dir, { 'default' => repos_path }, force: true) + Gitlab::SetupHelper::Gitaly.create_configuration( + gitaly_dir, + { 'default' => repos_path }, force: true, + options: { gitaly_socket: "gitaly2.socket", config_filename: "gitaly2.config.toml" } + ) Gitlab::SetupHelper::Praefect.create_configuration(gitaly_dir, { 'praefect' => repos_path }, force: true) end @@ -283,7 +288,7 @@ def with_workhorse(workhorse_dir, host, port, upstream, &blk) host = "[#{host}]" if host.include?(':') listen_addr = [host, port].join(':') - config_path = Gitlab::SetupHelper::Workhorse.get_config_path(workhorse_dir) + config_path = Gitlab::SetupHelper::Workhorse.get_config_path(workhorse_dir, {}) # This should be set up in setup_workhorse, but since # component_needs_update? only checks that versions are consistent,