# frozen_string_literal: truemoduleGitlabmoduleQAmoduleComponentclassGitalyClusterclassGitalyClusterConfigattr_accessor:gitlab_name,:network,:airgapped_network,:praefect_node_name,:praefect_port,:praefect_ip,:primary_node_name,:primary_node_port,:secondary_node_name,:secondary_node_port,:tertiary_node_name,:tertiary_node_port,:database_node_name,:database_portattr_reader:praefect_addr,:primary_node_addr,:secondary_node_addr,:tertiary_node_addr,:database_node_addrdefinitialize(params={})# rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity@gitlab_name=params[:gitlab_name]||'gitlab-gitaly-cluster'@network=params[:network]||'test'@airgapped_network=params[:airgapped_network]||false@praefect_node_name=params[:praefect_node_name]||'praefect'@praefect_port=params[:praefect_port]||2305@primary_node_name=params[:primary_node_name]||'gitaly1'@primary_node_port=params[:primary_node_port]||8075@secondary_node_name=params[:secondary_node_name]||'gitaly2'@secondary_node_port=params[:secondary_node_port]||8075@tertiary_node_name=params[:tertiary_node_name]||'gitaly3'@tertiary_node_port=params[:tertiary_node_port]||8075@database_node_name=params[:database_node_name]||'postgres'@database_port=params[:database_port]||5432@praefect_addr="#{praefect_node_name}.#{network}"@primary_node_addr="#{primary_node_name}.#{network}"@secondary_node_addr="#{secondary_node_name}.#{network}"@tertiary_node_addr="#{tertiary_node_name}.#{network}"@database_node_addr="#{database_node_name}.#{network}"endendincludeScenario::ActableusingRainbowattr_accessor:release,:exec_commands,:gitlab_name,:configattr_reader:gitaly_primary_node,:gitaly_secondary_node,:gitaly_tertiary_node,:praefect_node,:database_nodedefinitialize(config=GitalyClusterConfig.new)@spec_suite='Test::Instance::All'@env={}@tag='gitaly_cluster'@release='EE'@config=configend# @param [Boolean] parallel_gitaly controls whether we start gitaly nodes in parallel to improve startup timedefinstance(parallel_gitaly=false)run_gitaly_cluster(QA::Release.new(release),parallel_gitaly)end# @param [Boolean] parallel_gitaly controls whether we start gitaly nodes in parallel to improve startup timedefrun_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=postgresThread.newdoThread.current.abort_on_exception=truestart_gitaly_cluster(release,parallel_gitaly)endend# @param [Boolean] parallel_gitaly controls whether we start gitaly nodes in parallel to improve startup timedefstart_gitaly_cluster(release,parallel_gitaly=false)# rubocop:disable Metrics/AbcSizeRuntime::Logger.info("Starting Gitaly Cluster")ifparallel_gitalythreads=[]threads<<Thread.newdo@gitaly_primary_node=gitaly(config.primary_node_name,config.primary_node_port,release)endthreads<<Thread.newdo@gitaly_secondary_node=gitaly(config.secondary_node_name,config.secondary_node_port,release)endthreads<<Thread.newdo@gitaly_tertiary_node=gitaly(config.tertiary_node_name,config.tertiary_node_port,release)endthreads.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_addressRuntime::Logger.info("Gitaly Cluster Ready")enddefpostgresComponent::PostgreSQL.new.tapdo|sql|sql.name=config.database_node_namesql.airgapped_network=config.airgapped_networksql.network=config.networksql.instance(skip_teardown: true)dosql.run_psql'-d template1 -c "CREATE DATABASE praefect_production OWNER postgres"'endendenddefgitaly(gitaly_name,port,release)# rubocop:disable Metrics/AbcSizeComponent::Gitaly.new.tapdo|gitaly|gitaly.cluster_config=configgitaly.release=releasegitaly.name=gitaly_namegitaly.gitaly_port=portgitaly.airgapped_network=config.airgapped_networkgitaly.network=config.networkgitaly.gitlab_name=config.gitlab_namegitaly.instance(skip_teardown: true)endenddefpraefect(release)Component::Praefect.new.tapdo|praefect|praefect.cluster_config=configpraefect.name=config.praefect_node_namepraefect.airgapped_network=config.airgapped_networkpraefect.network=config.networkpraefect.release=releasepraefect.instance(skip_teardown: true)endend# Helper configuration for omnibus config to disable all non GitalyCluster related omnibus servicesdefself.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;
OMNIBUSendendendendend