files/gitlab-cookbooks/package/libraries/gitlab_cluster.rb (51 lines of code) (raw):
# frozen_string_literal: true
require 'singleton'
require 'chef/json_compat'
require 'chef/log'
require_relative 'config_mash'
require_relative 'helpers/logging_helper'
# GitLab Cluster configuration abstraction
#
# This allows you to acces cluster-wide configuration
class GitlabCluster
include Singleton
CONFIG_PATH = '/etc/gitlab'
JSON_FILE = '/etc/gitlab/gitlab-cluster.json'
# @return [GitlabCluster]
def self.config
instance
end
def self.log_overriding_message(keys, value)
message = "The '#{Array(keys).join('.')}' is defined in #{GitlabCluster::JSON_FILE} as '#{value}' " \
"and overrides the setting in the /etc/gitlab/gitlab.rb"
LoggingHelper.warning(message)
end
# Set the value of a config option in the JSON file. It overrides the key value if it already exists.
#
# @example setting a new value for `patroni.standby_cluster.enable` key
# GitlabCluster.config.set('patroni', 'standby_cluster', 'enable', false)
# #=> {
# # patroni: {
# # standby_cluster: {
# # enable: false
# # }
# # }
# #}
#
# @param [Array] args the nested keys sequence with the value as the last argument
def set(*args)
local_store.deep_set(*args)
end
# Get the value of a config option if the key exists in the local store. Otherwise, returns nil.
#
# @example retrieving value for `patroni.standby_cluster.enable` key
# GitlabCluster.config.get('patroni', 'standby_cluster', 'enable')
# #=> true
#
# @param [Array] args the nested keys sequence to fetch the stored value
# @return [Object, nil]
def get(*args)
local_store.dig(*args)
end
# Roles defined in the JSON file overrides roles from /etc/gitlab/gitlab.rb
def load_roles!
Gitlab.override_role!('geo_primary_role', get('primary'))
Gitlab.override_role!('geo_secondary_role', get('secondary'))
end
# Write configuration to the local store overwritting current settings
#
# @return [Boolean] whether it successfuly persisted the settings or not
def save
return false unless File.directory?(CONFIG_PATH)
json_config = Chef::JSONCompat.to_json_pretty(local_store)
File.open(JSON_FILE, 'w', 0600) do |f|
f.puts(json_config)
f.chmod(0600)
end
true
end
def all
local_store.dup
end
# Clears local store cache so content is reloaded from disk
def reload!
@local_store = nil
end
private
def local_store
@local_store ||= Gitlab::ConfigMash.new(load_from_file)
end
# Load configuration from the local JSON file
def load_from_file
return {} unless File.exist?(JSON_FILE)
Chef::JSONCompat.from_json(File.read(JSON_FILE))
end
end