debian-mirror-gitlab/lib/gitlab/setup_helper.rb

198 lines
7 KiB
Ruby
Raw Normal View History

2018-12-13 13:39:08 +05:30
# frozen_string_literal: true
2018-11-20 20:47:30 +05:30
require 'toml-rb'
2018-03-17 18:26:18 +05:30
module Gitlab
module SetupHelper
2021-02-22 17:27:13 +05:30
def create_configuration(dir, storage_paths, force: false, options: {})
2020-04-22 19:07:51 +05:30
generate_configuration(
2021-02-22 17:27:13 +05:30
configuration_toml(dir, storage_paths, options),
get_config_path(dir, options),
2020-04-22 19:07:51 +05:30
force: force
)
end
# rubocop:disable Rails/Output
def generate_configuration(toml_data, config_path, force: false)
FileUtils.rm_f(config_path) if force
File.open(config_path, File::WRONLY | File::CREAT | File::EXCL) do |f|
f.puts toml_data
end
rescue Errno::EEXIST
puts 'Skipping config.toml generation:'
2021-10-27 15:23:28 +05:30
puts "A configuration file for #{config_path} already exists."
2020-04-22 19:07:51 +05:30
rescue ArgumentError => e
puts 'Skipping config.toml generation:'
puts e.message
end
# rubocop:enable Rails/Output
2020-11-24 15:15:51 +05:30
module Workhorse
extend Gitlab::SetupHelper
class << self
2021-02-22 17:27:13 +05:30
def configuration_toml(dir, _, _)
2021-10-27 15:23:28 +05:30
config = { redis: { URL: redis_url, DB: redis_db } }
2020-11-24 15:15:51 +05:30
TomlRB.dump(config)
end
def redis_url
Gitlab::Redis::SharedState.url
end
2021-10-27 15:23:28 +05:30
def redis_db
Gitlab::Redis::SharedState.params.fetch(:db, 0)
end
2021-02-22 17:27:13 +05:30
def get_config_path(dir, _)
File.join(dir, 'config_path')
end
def compile_into(dir)
command = %W[#{make} -C #{Rails.root.join('workhorse')} install PREFIX=#{File.absolute_path(dir)}]
make_out, make_status = Gitlab::Popen.popen(command)
unless make_status == 0
warn make_out
raise 'workhorse make failed'
end
# 'make install' puts the binaries in #{dir}/bin but the init script expects them in dir
FileUtils.mv(Dir["#{dir}/bin/*"], dir)
end
def make
_, which_status = Gitlab::Popen.popen(%w[which gmake])
which_status == 0 ? 'gmake' : 'make'
2020-11-24 15:15:51 +05:30
end
end
end
2020-04-22 19:07:51 +05:30
module Gitaly
extend Gitlab::SetupHelper
class << self
# We cannot create config.toml files for all possible Gitaly configuations.
# For instance, if Gitaly is running on another machine then it makes no
# sense to write a config.toml file on the current machine. This method will
# only generate a configuration for the most common and simplest case: when
# we have exactly one Gitaly process and we are sure it is running locally
# 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.
2021-02-22 17:27:13 +05:30
def configuration_toml(gitaly_dir, storage_paths, options, gitaly_ruby: true)
2020-04-22 19:07:51 +05:30
storages = []
address = nil
Gitlab.config.repositories.storages.each do |key, val|
if address
if address != val['gitaly_address']
raise ArgumentError, "Your gitlab.yml contains more than one gitaly_address."
end
elsif URI(val['gitaly_address']).scheme != 'unix'
raise ArgumentError, "Automatic config.toml generation only supports 'unix:' addresses."
else
address = val['gitaly_address']
2018-03-17 18:26:18 +05:30
end
2020-04-22 19:07:51 +05:30
storages << { name: key, path: storage_paths[key] }
2018-03-17 18:26:18 +05:30
end
2022-06-21 17:19:12 +05:30
config = { socket_path: address.delete_prefix('unix:') }
2018-03-17 18:26:18 +05:30
2020-04-22 19:07:51 +05:30
if Rails.env.test?
2021-02-22 17:27:13 +05:30
socket_filename = options[:gitaly_socket] || "gitaly.socket"
2021-04-29 21:17:54 +05:30
prometheus_listen_addr = options[:prometheus_listen_addr]
2021-02-22 17:27:13 +05:30
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.
2021-04-29 21:17:54 +05:30
git: {
catfile_cache_size: 5,
2022-04-04 11:22:00 +05:30
use_bundled_binaries: true
2021-12-11 22:18:48 +05:30
},
2021-04-29 21:17:54 +05:30
prometheus_listen_addr: prometheus_listen_addr
}.compact
2021-02-22 17:27:13 +05:30
2020-04-22 19:07:51 +05:30
storage_path = Rails.root.join('tmp', 'tests', 'second_storage').to_s
storages << { name: 'test_second_storage', path: storage_path }
end
2018-03-17 18:26:18 +05:30
2020-04-22 19:07:51 +05:30
config[:storage] = storages
2019-12-26 22:10:19 +05:30
2022-06-21 17:19:12 +05:30
runtime_dir = options[:runtime_dir] || File.join(gitaly_dir, 'run')
FileUtils.mkdir(runtime_dir) unless File.exist?(runtime_dir)
config[:runtime_dir] = runtime_dir
2019-12-26 22:10:19 +05:30
2020-04-22 19:07:51 +05:30
config[:'gitaly-ruby'] = { dir: File.join(gitaly_dir, 'ruby') } if gitaly_ruby
config[:'gitlab-shell'] = { dir: Gitlab.config.gitlab_shell.path }
2022-04-04 11:22:00 +05:30
config[:bin_dir] = File.expand_path(File.join(gitaly_dir, '_build', 'bin')) # binaries by default are in `_build/bin`
2020-06-23 00:09:42 +05:30
config[:gitlab] = { url: Gitlab.config.gitlab.url }
2021-01-29 00:20:46 +05:30
config[:logging] = { dir: Rails.root.join('log').to_s }
2018-03-17 18:26:18 +05:30
2020-04-22 19:07:51 +05:30
TomlRB.dump(config)
2019-09-04 21:01:54 +05:30
end
2020-04-22 19:07:51 +05:30
private
2021-02-22 17:27:13 +05:30
def get_config_path(dir, options)
config_filename = options[:config_filename] || 'config.toml'
File.join(dir, config_filename)
2020-04-22 19:07:51 +05:30
end
2018-03-17 18:26:18 +05:30
end
2020-04-22 19:07:51 +05:30
end
module Praefect
extend Gitlab::SetupHelper
class << self
2022-07-16 23:28:13 +05:30
def configuration_toml(gitaly_dir, _storage_paths, options)
raise 'This configuration is only intended for test' unless Rails.env.test?
2020-04-22 19:07:51 +05:30
nodes = [{ storage: 'default', address: "unix:#{gitaly_dir}/gitaly.socket", primary: true, token: 'secret' }]
2021-02-22 17:27:13 +05:30
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 }]
2022-07-16 23:28:13 +05:30
2021-09-04 01:27:46 +05:30
config = {
socket_path: "#{gitaly_dir}/praefect.socket",
virtual_storage: storages,
2022-07-16 23:28:13 +05:30
token: 'secret'
2021-09-04 01:27:46 +05:30
}
2022-07-16 23:28:13 +05:30
if options[:per_repository]
failover = { enabled: true, election_strategy: 'per_repository' }
database = { host: options.fetch(:pghost),
port: options.fetch(:pgport).to_i,
user: options.fetch(:pguser),
dbname: options.fetch(:dbname, 'praefect_test') }
config.merge!(database: database,
failover: failover)
else
failover = { enabled: false, election_strategy: 'local' }
config.merge!(
i_understand_my_election_strategy_is_unsupported_and_will_be_removed_without_warning: true,
memory_queue_enabled: true,
failover: failover
)
end
2020-04-22 19:07:51 +05:30
TomlRB.dump(config)
end
2018-03-17 18:26:18 +05:30
2020-04-22 19:07:51 +05:30
private
2018-03-17 18:26:18 +05:30
2022-07-16 23:28:13 +05:30
def get_config_path(dir, options)
config_filename = options[:config_filename] || 'praefect.config.toml'
File.join(dir, config_filename)
2018-03-17 18:26:18 +05:30
end
end
end
end
end