lib/gdk/task_helpers/config_tasks.rb (148 lines of code) (raw):
# frozen_string_literal: true
module GDK
module TaskHelpers
# A rake or make task
Task = Struct.new(:name, :make_dependencies, :rake_dependencies, :template,
:erb_extra_args, :post_render, :generate_makefile_target,
:no_op_condition, :timed, :hide_diff, keyword_init: true) do
def initialize(attributes)
super
template = "support/templates/#{self[:name]}.erb"
self[:template] ||= template
self[:rake_dependencies] = attributes[:rake_dependencies] || []
self[:make_dependencies] = (attributes[:make_dependencies] || []).join(' ')
self[:erb_extra_args] ||= {}
self[:generate_makefile_target] = attributes.fetch(:generate_makefile_target, true)
self[:timed] = false if self[:timed].nil?
# Turn no_op_condition: 'gitlab_topology_service_enabled', into `config.gitlab_topology_service.enabled`.
@enabled = self[:no_op_condition] ? GDK.config.dig(self[:no_op_condition].delete_suffix('_enabled'), 'enabled') : true
end
def enabled?
@enabled
end
end
# Class to handle config tasks templates and make targets
class ConfigTasks
def self.build
@tasks ||= new.tap do |tasks|
define_template_tasks(tasks)
define_make_tasks(tasks)
# This should be the last task.
define_makefile_config_task(tasks)
end
end
# rubocop:disable Metrics/AbcSize -- A set of definitions which could be split up per component later
def self.define_template_tasks(tasks)
tasks.add_template(name: 'Procfile')
tasks.add_template(name: 'gitlab/config/cable.yml')
tasks.add_template(name: 'gitlab/config/database.yml')
tasks.add_template(name: 'gitlab/config/gitlab.yml')
tasks.add_template(name: 'gitlab/config/puma.rb')
tasks.add_template(name: 'gitlab/config/redis.queues.yml', template: 'support/templates/gitlab/config/redis.sessions.yml.erb', erb_extra_args: { cluster: :queues })
tasks.add_template(name: 'gitlab/config/resque.yml', template: 'support/templates/gitlab/config/redis.sessions.yml.erb', erb_extra_args: { cluster: :shared_state })
tasks.add_template(name: 'gitlab/config/session_store.yml')
tasks.add_template(name: 'gitaly/gitaly.config.toml', erb_extra_args: { node: GDK.config.gitaly }, post_render: lambda do |_task|
GDK.config.gitaly.__storages.each do |storage|
FileUtils.mkdir_p(storage.path)
end
FileUtils.mkdir_p(GDK.config.gitaly.log_dir)
FileUtils.mkdir_p(GDK.config.gitaly.runtime_dir)
FileUtils.mkdir_p(GDK.config.gdk_root.join('gitaly-custom-hooks'))
end)
tasks.add_template(name: 'gitaly/praefect.config.toml', post_render: lambda do |_task|
GDK.config.praefect.__nodes.each_with_index do |node, _|
Rake::Task[node['config_file']].invoke
end
end)
GDK.config.praefect.__nodes.each do |node|
tasks.add_template(name: node['config_file'], template: 'support/templates/gitaly/gitaly.config.toml.erb', erb_extra_args: { node: node }, generate_makefile_target: false, post_render: lambda do |_task|
node.__storages.each do |storage|
FileUtils.mkdir_p(storage.path)
end
FileUtils.mkdir_p(node['log_dir'])
FileUtils.mkdir_p(node['runtime_dir'])
end)
end
%i[rate_limiting cache repository_cache sessions shared_state trace_chunks].each do |name|
kwargs = if GDK.config.redis_cluster.enabled?
{
name: "gitlab/config/redis.#{name}.yml",
template: 'support/templates/gitlab/config/redis.cluster.yml.erb'
}
else
{
name: "gitlab/config/redis.#{name}.yml",
template: 'support/templates/gitlab/config/redis.sessions.yml.erb',
erb_extra_args: { cluster: name }
}
end
tasks.add_template(**kwargs)
end
tasks.add_template(name: 'gitlab-topology-service/config.toml', no_op_condition: 'gitlab_topology_service_enabled')
tasks.add_template(name: 'gitlab/config/vite.gdk.json')
tasks.add_template(name: 'gitlab/workhorse/config.toml')
tasks.add_template(name: 'gitlab-k8s-agent-config.yml')
tasks.add_template(name: 'gitlab-kas-websocket-token-secret', hide_diff: true)
tasks.add_template(name: 'gitlab-kas-autoflow-temporal-workflow-data-encryption-secret', hide_diff: true)
tasks.add_template(name: 'gitlab-pages/gitlab-pages.conf', make_dependencies: ['gitlab-pages/.git/pull'])
tasks.add_template(name: 'gitlab-pages-secret', hide_diff: true)
tasks.add_template(name: 'gitlab-runner-config.toml', no_op_condition: 'runner_enabled')
tasks.add_template(name: 'gitlab-shell/config.yml', make_dependencies: ['gitlab-shell/.git'])
tasks.add_template(name: 'grafana/grafana.ini')
tasks.add_template(name: 'nginx/conf/nginx.conf')
tasks.add_template(name: 'openbao/config.hcl', no_op_condition: 'openbao_enabled')
tasks.add_template(name: 'openbao/proxy_config.hcl', no_op_condition: 'openbao_enabled')
tasks.add_template(name: 'openssh/sshd_config')
tasks.add_template(name: 'prometheus/prometheus.yml', post_render: ->(task) { chmod('+r', task.name, verbose: false) })
tasks.add_template(name: 'redis/redis.conf')
tasks.add_template(name: 'registry/config.yml', make_dependencies: ['registry_host.crt'])
tasks.add_template(name: 'snowplow/snowplow_micro.conf', post_render: ->(task) { chmod('+r', task.name, verbose: false) })
tasks.add_template(name: 'snowplow/iglu.json', post_render: ->(task) { chmod('+r', task.name, verbose: false) })
tasks.add_template(name: 'clickhouse/config.xml', template: 'support/templates/clickhouse/config.xml')
tasks.add_template(name: 'clickhouse/users.xml', template: 'support/templates/clickhouse/users.xml')
tasks.add_template(name: 'clickhouse/config.d/data-paths.xml')
tasks.add_template(name: 'clickhouse/config.d/gdk.xml')
tasks.add_template(name: 'clickhouse/config.d/logger.xml')
tasks.add_template(name: 'clickhouse/config.d/openssl.xml')
tasks.add_template(name: 'clickhouse/config.d/user-directories.xml')
tasks.add_template(name: 'clickhouse/users.d/gdk.xml')
tasks.add_template(name: 'siphon/config.yml', no_op_condition: 'siphon_enabled')
tasks.add_template(name: 'siphon/consumer.yml', no_op_condition: 'siphon_enabled')
tasks.add_template(name: 'elasticsearch/config/elasticsearch.yml', template: 'support/templates/elasticsearch/config/elasticsearch.yml', no_op_condition: 'elasticsearch_enabled')
tasks.add_template(name: 'elasticsearch/config/jvm.options.d/custom.options', template: 'support/templates/elasticsearch/config/jvm.options.d/custom.options', no_op_condition: 'elasticsearch_enabled')
tasks.add_template(name: 'pgbouncers/pgbouncer-replica-1.ini', template: 'support/templates/pgbouncer/pgbouncer-replica.ini.erb', erb_extra_args: { host: GDK.config.postgresql.replica.host, port: GDK.config.postgresql.replica.port1 })
tasks.add_template(name: 'pgbouncers/pgbouncer-replica-2.ini', template: 'support/templates/pgbouncer/pgbouncer-replica.ini.erb', erb_extra_args: { host: GDK.config.postgresql.replica.host, port: GDK.config.postgresql.replica.port2 })
tasks.add_template(name: 'pgbouncers/pgbouncer-replica-2-1.ini', template: 'support/templates/pgbouncer/pgbouncer-replica.ini.erb', erb_extra_args: { host: GDK.config.postgresql.replica_2.host, port: GDK.config.postgresql.replica_2.port1 })
tasks.add_template(name: 'pgbouncers/pgbouncer-replica-2-2.ini', template: 'support/templates/pgbouncer/pgbouncer-replica.ini.erb', erb_extra_args: { host: GDK.config.postgresql.replica_2.host, port: GDK.config.postgresql.replica_2.port2 })
tasks.add_template(name: 'pgbouncers/userlist.txt', template: 'support/templates/pgbouncer/pgbouncer-userlist.txt.erb')
tasks.add_template(name: 'consul/config.json', erb_extra_args: { min_port: 6432, max_port: 6435 })
end
# rubocop:enable Metrics/AbcSize
def self.define_make_tasks(tasks)
tasks.add_make_task(name: 'preflight-checks', timed: true)
tasks.add_make_task(name: 'preflight-update-checks', timed: true)
end
def self.define_makefile_config_task(tasks)
tasks.add_template(name: 'support/makefiles/Makefile.config.mk', template: 'support/templates/makefiles/Makefile.config.mk.erb', rake_dependencies: Dir['lib/**/*'], erb_extra_args: { tasks: tasks.all_with_makefile_target })
end
def initialize
@template_tasks = []
@make_tasks = []
end
def add_template(**args)
@template_tasks << Task.new(**args)
end
def add_make_task(**args)
@make_tasks << Task.new(**args)
end
def template_tasks
@template_tasks.clone
end
def diffable_template_tasks
template_tasks.reject(&:hide_diff)
end
def make_tasks
@make_tasks.clone
end
def all_tasks
template_tasks + make_tasks
end
def all_with_makefile_target
all_tasks.select(&:generate_makefile_target)
end
end
end
end