# HG changeset patch
# User Balasankar 'Balu' C <balasankar@gitlab.com>
# Date 1726701920 0
#      Wed Sep 18 23:25:20 2024 +0000
# Node ID a83e0fc76529f98db4f70a2b9a65c5da524d6d4e
# Parent  2be9e2b401fd841aa508bb140072ce200983f93d
Only Run GitLab Rails recipes when required

- Process roles that require GitLab Rails first.
- Do not automatically run GitLab Rails for all
  roles at installation or reconfigure.
- Ensure Patroni and Postgres roles can still
  perform the required database creation tasks.

Closes https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/8692

Changelog: changed

Signed-off-by: Balasankar 'Balu' C <balasankar@gitlab.com>

diff --git a/files/gitlab-cookbooks/package/libraries/config/gitlab.rb b/files/gitlab-cookbooks/package/libraries/config/gitlab.rb
--- a/files/gitlab-cookbooks/package/libraries/config/gitlab.rb
+++ b/files/gitlab-cookbooks/package/libraries/config/gitlab.rb
@@ -28,19 +28,21 @@
   git_data_dirs ConfigMash.new
 
   ## Roles
+
+  # Roles that depend on gitlab_rails['enable'] should be processed first
   role('application').use { ApplicationRole }
+  role('sidekiq').use { SidekiqRole }
+  role('postgres').use { PostgresRole }
+  role('patroni').use { PatroniRole }
   role('redis_sentinel').use { RedisSentinelRole }
   role('redis_master').use { RedisMasterRole }
   role('redis_replica')
   role('geo_primary',   manage_services: false).use { GeoPrimaryRole }
   role('geo_secondary', manage_services: false).use { GeoSecondaryRole }
   role('monitoring').use { MonitoringRole }
-  role('postgres').use { PostgresRole }
   role('pgbouncer').use { PgbouncerRole }
-  role('patroni').use { PatroniRole }
   role('consul').use { ConsulRole }
   role('pages').use { PagesRole }
-  role('sidekiq').use { SidekiqRole }
   role('spamcheck').use { SpamcheckRole }
 
   ## Attributes directly on the node
diff --git a/files/gitlab-cookbooks/package/libraries/config/roles/application.rb b/files/gitlab-cookbooks/package/libraries/config/roles/application.rb
--- a/files/gitlab-cookbooks/package/libraries/config/roles/application.rb
+++ b/files/gitlab-cookbooks/package/libraries/config/roles/application.rb
@@ -18,6 +18,7 @@
   def self.load_role
     return unless Gitlab['application_role']['enable']
 
+    # Run GitLab Rails related recipes unless explicitly disabled
     Gitlab['gitlab_rails']['enable'] = true if Gitlab['gitlab_rails']['enable'].nil?
     Gitlab['nginx']['enable'] = true if Gitlab['nginx']['enable'].nil?
 
diff --git a/files/gitlab-cookbooks/package/libraries/config/roles/consul.rb b/files/gitlab-cookbooks/package/libraries/config/roles/consul.rb
--- a/files/gitlab-cookbooks/package/libraries/config/roles/consul.rb
+++ b/files/gitlab-cookbooks/package/libraries/config/roles/consul.rb
@@ -18,6 +18,9 @@
   def self.load_role
     return unless Gitlab['consul_role']['enable']
 
+    # Do not run GitLab Rails related recipes unless explicitly enabled
+    Gitlab['gitlab_rails']['enable'] ||= false
+
     Services.enable_group('consul_role')
   end
 end
diff --git a/files/gitlab-cookbooks/package/libraries/config/roles/geo_secondary.rb b/files/gitlab-cookbooks/package/libraries/config/roles/geo_secondary.rb
--- a/files/gitlab-cookbooks/package/libraries/config/roles/geo_secondary.rb
+++ b/files/gitlab-cookbooks/package/libraries/config/roles/geo_secondary.rb
@@ -29,8 +29,13 @@
     Gitlab['postgresql']['max_standby_archive_delay'] ||= '60s'
     Gitlab['postgresql']['max_standby_streaming_delay'] ||= '60s'
     Gitlab['postgresql']['hot_standby'] ||= 'on'
+
+    # Run GitLab Rails related recipes only if required
+    Gitlab['gitlab_rails']['enable'] = rails_needed?
+
+    # Do not attempt to run DB migrations unless explicitly specified to
     Gitlab['gitlab_rails']['auto_migrate'] ||= false
-    Gitlab['gitlab_rails']['enable'] = rails_needed?
+
     Gitlab[WebServerHelper.service_name]['worker_processes'] ||= number_of_worker_processes
   end
 
diff --git a/files/gitlab-cookbooks/package/libraries/config/roles/monitoring.rb b/files/gitlab-cookbooks/package/libraries/config/roles/monitoring.rb
--- a/files/gitlab-cookbooks/package/libraries/config/roles/monitoring.rb
+++ b/files/gitlab-cookbooks/package/libraries/config/roles/monitoring.rb
@@ -18,7 +18,9 @@
   def self.load_role
     return unless Gitlab['monitoring_role']['enable']
 
-    Gitlab['gitlab_rails']['auto_migrate'] ||= false
+    # Do not run GitLab Rails related recipes unless explicitly enabled
+    Gitlab['gitlab_rails']['enable'] ||= false
+
     Services.enable_group('monitoring_role')
   end
 end
diff --git a/files/gitlab-cookbooks/package/libraries/config/roles/pages.rb b/files/gitlab-cookbooks/package/libraries/config/roles/pages.rb
--- a/files/gitlab-cookbooks/package/libraries/config/roles/pages.rb
+++ b/files/gitlab-cookbooks/package/libraries/config/roles/pages.rb
@@ -18,7 +18,7 @@
   def self.load_role
     return unless Gitlab['pages_role']['enable']
 
-    # Turning off GitLab Rails unless explicitly enabled.
+    # Do not run GitLab Rails related recipes unless explicitly enabled
     Gitlab['gitlab_rails']['enable'] ||= false
 
     Services.enable_group('pages_role')
diff --git a/files/gitlab-cookbooks/package/libraries/config/roles/patroni.rb b/files/gitlab-cookbooks/package/libraries/config/roles/patroni.rb
--- a/files/gitlab-cookbooks/package/libraries/config/roles/patroni.rb
+++ b/files/gitlab-cookbooks/package/libraries/config/roles/patroni.rb
@@ -18,6 +18,11 @@
   def self.load_role
     return unless Gitlab['patroni_role']['enable']
 
+    # We need to set Gitlab['gitlab_rails']['enable'] to true because DB
+    # creation in database_objects resource is gated on whether Rails is
+    # enabled or not.
+    Gitlab['gitlab_rails']['enable'] = true if Gitlab['gitlab_rails']['enable'].nil?
+
     Services.enable_group('patroni_role')
   end
 end
diff --git a/files/gitlab-cookbooks/package/libraries/config/roles/pgbouncer.rb b/files/gitlab-cookbooks/package/libraries/config/roles/pgbouncer.rb
--- a/files/gitlab-cookbooks/package/libraries/config/roles/pgbouncer.rb
+++ b/files/gitlab-cookbooks/package/libraries/config/roles/pgbouncer.rb
@@ -18,6 +18,9 @@
   def self.load_role
     return unless Gitlab['pgbouncer_role']['enable']
 
+    # Do not run GitLab Rails related recipes unless explicitly enabled
+    Gitlab['gitlab_rails']['enable'] ||= false
+
     Services.enable_group('pgbouncer_role')
   end
 end
diff --git a/files/gitlab-cookbooks/package/libraries/config/roles/postgres.rb b/files/gitlab-cookbooks/package/libraries/config/roles/postgres.rb
--- a/files/gitlab-cookbooks/package/libraries/config/roles/postgres.rb
+++ b/files/gitlab-cookbooks/package/libraries/config/roles/postgres.rb
@@ -18,6 +18,11 @@
   def self.load_role
     return unless Gitlab['postgres_role']['enable']
 
+    # We need to set Gitlab['gitlab_rails']['enable'] to true because DB
+    # creation in database_objects resource is gated on whether Rails is
+    # enabled or not.
+    Gitlab['gitlab_rails']['enable'] = true if Gitlab['gitlab_rails']['enable'].nil?
+
     Services.enable_group('postgres_role')
   end
 end
diff --git a/files/gitlab-cookbooks/package/libraries/config/roles/redis_master.rb b/files/gitlab-cookbooks/package/libraries/config/roles/redis_master.rb
--- a/files/gitlab-cookbooks/package/libraries/config/roles/redis_master.rb
+++ b/files/gitlab-cookbooks/package/libraries/config/roles/redis_master.rb
@@ -19,8 +19,13 @@
     master_role = Gitlab['redis_master_role']['enable']
     replica_role = Gitlab['redis_replica_role']['enable']
 
+    return unless master_role || replica_role
+
     raise 'Cannot define both redis_master_role and redis_replica_role in the same machine.' if master_role && replica_role
 
+    # Do not run GitLab Rails related recipes unless explicitly enabled
+    Gitlab['gitlab_rails']['enable'] ||= false
+
     Services.enable_group('redis_node') if master_role || replica_role
   end
 end
diff --git a/files/gitlab-cookbooks/package/libraries/config/roles/redis_sentinel.rb b/files/gitlab-cookbooks/package/libraries/config/roles/redis_sentinel.rb
--- a/files/gitlab-cookbooks/package/libraries/config/roles/redis_sentinel.rb
+++ b/files/gitlab-cookbooks/package/libraries/config/roles/redis_sentinel.rb
@@ -16,6 +16,11 @@
 
 module RedisSentinelRole
   def self.load_role
-    Services.enable('sentinel') if Gitlab['redis_sentinel_role']['enable']
+    return unless Gitlab['redis_sentinel_role']['enable']
+
+    # Do not run GitLab Rails related recipes unless explicitly enabled
+    Gitlab['gitlab_rails']['enable'] ||= false
+
+    Services.enable('sentinel')
   end
 end
diff --git a/files/gitlab-cookbooks/package/libraries/config/roles/sidekiq.rb b/files/gitlab-cookbooks/package/libraries/config/roles/sidekiq.rb
--- a/files/gitlab-cookbooks/package/libraries/config/roles/sidekiq.rb
+++ b/files/gitlab-cookbooks/package/libraries/config/roles/sidekiq.rb
@@ -18,7 +18,9 @@
   def self.load_role
     return unless Gitlab['sidekiq_role']['enable']
 
+    # Do not run any DB migrations
     Gitlab['gitlab_rails']['auto_migrate'] ||= false
+
     Services.enable_group('sidekiq_role')
   end
 end
diff --git a/files/gitlab-cookbooks/package/libraries/config/roles/spamcheck.rb b/files/gitlab-cookbooks/package/libraries/config/roles/spamcheck.rb
--- a/files/gitlab-cookbooks/package/libraries/config/roles/spamcheck.rb
+++ b/files/gitlab-cookbooks/package/libraries/config/roles/spamcheck.rb
@@ -18,7 +18,7 @@
   def self.load_role
     return unless Gitlab['spamcheck_role']['enable']
 
-    # Turning off GitLab Rails unless explicitly enabled.
+    # Do not run GitLab Rails related recipes unless explicitly enabled
     Gitlab['gitlab_rails']['enable'] ||= false
 
     Services.enable_group('spamcheck_role')