setup_helper.rb 2.96 KB
Newer Older
1 2
# frozen_string_literal: true

3 4
require 'toml-rb'

5 6 7 8 9 10 11 12 13 14 15
module Gitlab
  module 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.
16
      def gitaly_configuration_toml(gitaly_dir, storage_paths, gitaly_ruby: true)
17 18 19 20 21 22 23 24 25 26 27 28 29 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']
          end

31
          storages << { name: key, path: storage_paths[key] }
32 33 34
        end

        if Rails.env.test?
35 36 37 38
          storage_path = Rails.root.join('tmp', 'tests', 'second_storage').to_s

          FileUtils.mkdir(storage_path) unless File.exist?(storage_path)
          storages << { name: 'test_second_storage', path: storage_path }
39 40
        end

41
        config = { socket_path: address.sub(/\Aunix:/, ''), storage: storages }
42 43 44 45
        config[:auth] = { token: 'secret' } if Rails.env.test?
        config[:'gitaly-ruby'] = { dir: File.join(gitaly_dir, 'ruby') } if gitaly_ruby
        config[:'gitlab-shell'] = { dir: Gitlab.config.gitlab_shell.path }
        config[:bin_dir] = Gitlab.config.gitaly.client_path
46 47 48 49 50 51 52

        if Rails.env.test?
          # 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
53

Ken's avatar
Ken committed
54
        TomlRB.dump(config)
55 56 57
      end

      # rubocop:disable Rails/Output
58
      def create_gitaly_configuration(dir, storage_paths, force: false)
59 60 61 62
        config_path = File.join(dir, 'config.toml')
        FileUtils.rm_f(config_path) if force

        File.open(config_path, File::WRONLY | File::CREAT | File::EXCL) do |f|
63
          f.puts gitaly_configuration_toml(dir, storage_paths)
64 65 66 67 68 69 70 71 72 73 74 75
        end
      rescue Errno::EEXIST
        puts "Skipping config.toml generation:"
        puts "A configuration file already exists."
      rescue ArgumentError => e
        puts "Skipping config.toml generation:"
        puts e.message
      end
      # rubocop:enable Rails/Output
    end
  end
end