class Gitlab::QA::Component::GitalyCluster

def self.disable_other_omnibus_services

Helper configuration for omnibus config to disable all non GitalyCluster related omnibus services
def self.disable_other_omnibus_services
  <<~OMNIBUS
    postgresql['enable'] = false;
    redis['enable'] = false;
    nginx['enable'] = false;
    puma['enable'] = false;
    sidekiq['enable'] = false;
    gitlab_workhorse['enable'] = false;
    gitlab_rails['rake_cache_clear'] = false;
    gitlab_rails['auto_migrate'] = false;
    gitlab_exporter['enable'] = false;
    gitlab_kas['enable'] = false;
  OMNIBUS
end

def gitaly(gitaly_name, port, release) # rubocop:disable Metrics/AbcSize

rubocop:disable Metrics/AbcSize
def gitaly(gitaly_name, port, release) # rubocop:disable Metrics/AbcSize
  Component::Gitaly.new.tap do |gitaly|
    gitaly.cluster_config = config
    gitaly.release = release
    gitaly.name = gitaly_name
    gitaly.gitaly_port = port
    gitaly.airgapped_network = config.airgapped_network
    gitaly.network = config.network
    gitaly.gitlab_name = config.gitlab_name
    gitaly.instance(skip_teardown: true)
  end
end

def initialize(config = GitalyClusterConfig.new)

def initialize(config = GitalyClusterConfig.new)
  @spec_suite = 'Test::Instance::All'
  @env = {}
  @tag = 'gitaly_cluster'
  @release = 'EE'
  @config = config
end

def instance(parallel_gitaly = false)

Parameters:
  • parallel_gitaly (Boolean) -- controls whether we start gitaly nodes in parallel to improve startup time
def instance(parallel_gitaly = false)
  run_gitaly_cluster(QA::Release.new(release), parallel_gitaly)
end

def postgres

def postgres
  Component::PostgreSQL.new.tap do |sql|
    sql.name = config.database_node_name
    sql.airgapped_network = config.airgapped_network
    sql.network = config.network
    sql.instance(skip_teardown: true) do
      sql.run_psql '-d template1 -c "CREATE DATABASE praefect_production OWNER postgres"'
    end
  end
end

def praefect(release)

def praefect(release)
  Component::Praefect.new.tap do |praefect|
    praefect.cluster_config = config
    praefect.name = config.praefect_node_name
    praefect.airgapped_network = config.airgapped_network
    praefect.network = config.network
    praefect.release = release
    praefect.instance(skip_teardown: true)
  end
end

def run_gitaly_cluster(release, parallel_gitaly = false)

Parameters:
  • parallel_gitaly (Boolean) -- controls whether we start gitaly nodes in parallel to improve startup time
def run_gitaly_cluster(release, parallel_gitaly = false)
  # This also ensure that the docker network is created here, avoiding any potential race conditions later
  #  if the gitaly-cluster and GitLab containers attempt to create a network in parallel
  @database_node = postgres
  Thread.new do
    Thread.current.abort_on_exception = true
    start_gitaly_cluster(release, parallel_gitaly)
  end
end

def start_gitaly_cluster(release, parallel_gitaly = false) # rubocop:disable Metrics/AbcSize

Parameters:
  • parallel_gitaly (Boolean) -- controls whether we start gitaly nodes in parallel to improve startup time
def start_gitaly_cluster(release, parallel_gitaly = false) # rubocop:disable Metrics/AbcSize
  Runtime::Logger.info("Starting Gitaly Cluster")
  if parallel_gitaly
    threads = []
    threads << Thread.new do
      @gitaly_primary_node = gitaly(config.primary_node_name, config.primary_node_port, release)
    end
    threads << Thread.new do
      @gitaly_secondary_node = gitaly(config.secondary_node_name, config.secondary_node_port, release)
    end
    threads << Thread.new do
      @gitaly_tertiary_node = gitaly(config.tertiary_node_name, config.tertiary_node_port, release)
    end
    threads.each(&:join)
  else
    @gitaly_primary_node = gitaly(config.primary_node_name, config.primary_node_port, release)
    @gitaly_secondary_node = gitaly(config.secondary_node_name, config.secondary_node_port, release)
    @gitaly_tertiary_node = gitaly(config.tertiary_node_name, config.tertiary_node_port, release)
  end
  @praefect_node = praefect(release)
  config.praefect_ip = praefect_node.ip_address
  Runtime::Logger.info("Gitaly Cluster Ready")
end