Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
rabbit_prelaunch_conf: Always handle config. files with Cuttlefish
This has several benefits:

1. It simplifies the code, all configuration being handled by the same
   code path (no more condition on Erlang-term-based vs. Cuttlefish).
   `rabbit_config` shrinks quite a lot in the process.

2. We can use additional configuration files AND an Erlang-term-based
   configuration file. In other words, it is possible to use the same
   existing Erlang-term-based file and introduce Cuttlefish files when
   needed.

   It allows a user to run RabbitMQ with:

   RABBITMQ_CONFIG_FILE=/path/to/rabbitmq.config \
   RABBITMQ_CONFIG_FILES=/path/to/conf.d/*.conf \
   ./sbin/rabbitmq-server

   A developer can do the same with `make run-broker`:

   make run-broker \
   RABBITMQ_CONFIG_FILES=/path/to/conf.d/*.conf

   In the example above, the main configuration file generated by
   rabbitmq-run.mk is an Erlang-term-based one.

This is implemented by calling Cuttlefish with a (possibly empty) list
of additional files and the Erlang-term-based file as the advanced
configuration file.

References #2180.
  • Loading branch information
dumbbell committed Apr 23, 2020
commit 7edfe2292c3c59a8e03e37574b89a00708ae1bf8
63 changes: 12 additions & 51 deletions apps/rabbitmq_prelaunch/src/rabbit_prelaunch_conf.erl
Original file line number Diff line number Diff line change
Expand Up @@ -26,38 +26,21 @@ setup(Context) ->
AdvancedConfigFile = find_actual_advanced_config_file(Context),
State = case find_actual_main_config_file(Context) of
{MainConfigFile, erlang} ->
case AdditionalConfigFiles of
[] ->
ok;
_ ->
rabbit_log_prelaunch:notice(
"The following additional configuration "
"files are not loaded when the main "
"configuration file uses the Erlang terms "
"based format"),
lists:foreach(
fun(File) ->
rabbit_log_prelaunch:notice(
" - ~ts", [File])
end,
AdditionalConfigFiles)
end,
Config = load_erlang_term_based_config_file(
MainConfigFile),
Config = load_cuttlefish_config_file(Context,
AdditionalConfigFiles,
MainConfigFile),
Apps = [App || {App, _} <- Config],
decrypt_config(Apps),
#{config_type => erlang,
config_files => [MainConfigFile],
config_advanced_file => undefined};
#{config_files => AdditionalConfigFiles,
config_advanced_file => MainConfigFile};
{MainConfigFile, cuttlefish} ->
ConfigFiles = [MainConfigFile | AdditionalConfigFiles],
Config = load_cuttlefish_config_file(Context,
ConfigFiles,
AdvancedConfigFile),
Apps = [App || {App, _} <- Config],
decrypt_config(Apps),
#{config_type => cuttlefish,
config_files => ConfigFiles,
#{config_files => ConfigFiles,
config_advanced_file => AdvancedConfigFile};
undefined when AdditionalConfigFiles =/= [] ->
ConfigFiles = AdditionalConfigFiles,
Expand All @@ -66,23 +49,21 @@ setup(Context) ->
AdvancedConfigFile),
Apps = [App || {App, _} <- Config],
decrypt_config(Apps),
#{config_type => cuttlefish,
config_files => ConfigFiles,
#{config_files => ConfigFiles,
config_advanced_file => AdvancedConfigFile};
undefined when AdvancedConfigFile =/= undefined ->
rabbit_log_prelaunch:warning(
"Using RABBITMQ_ADVANCED_CONFIG_FILE: ~s",
[AdvancedConfigFile]),
Config = load_erlang_term_based_config_file(
AdvancedConfigFile),
Config = load_cuttlefish_config_file(Context,
AdditionalConfigFiles,
AdvancedConfigFile),
Apps = [App || {App, _} <- Config],
decrypt_config(Apps),
#{config_type => erlang,
config_files => [AdvancedConfigFile],
#{config_files => AdditionalConfigFiles,
config_advanced_file => AdvancedConfigFile};
undefined ->
#{config_type => undefined,
config_files => [],
#{config_files => [],
config_advanced_file => undefined}
end,
ok = override_with_hard_coded_critical_config(),
Expand Down Expand Up @@ -186,26 +167,6 @@ determine_config_format(File) ->
end
end.

load_erlang_term_based_config_file(ConfigFile) ->
rabbit_log_prelaunch:debug(
"Loading configuration file \"~ts\" (Erlang terms based)", [ConfigFile]),
case file:consult(ConfigFile) of
{ok, [Config]} when is_list(Config) ->
apply_erlang_term_based_config(Config),
Config;
{ok, OtherTerms} ->
rabbit_log_prelaunch:error(
"Failed to load configuration file \"~ts\", "
"incorrect format: ~p",
[ConfigFile, OtherTerms]),
throw({error, failed_to_parse_configuration_file});
{error, Reason} ->
rabbit_log_prelaunch:error(
"Failed to load configuration file \"~ts\": ~ts",
[ConfigFile, file:format_error(Reason)]),
throw({error, failed_to_read_configuration_file})
end.

load_cuttlefish_config_file(Context,
ConfigFiles,
AdvancedConfigFile) ->
Expand Down
66 changes: 9 additions & 57 deletions src/rabbit_config.erl
Original file line number Diff line number Diff line change
Expand Up @@ -10,24 +10,10 @@

-type config_location() :: string().

%% we support both the classic Erlang term
%% config file (rabbitmq.config) as well as rabbitmq.conf
legacy_erlang_term_config_used() ->
case get_prelaunch_config_state() of
#{config_type := erlang,
config_advanced_file := undefined} ->
true;
_ ->
false
end.

get_confs() ->
case get_prelaunch_config_state() of
#{config_files := Confs} ->
[ filename:rootname(Conf, ".conf") ++ ".conf"
|| Conf <- Confs ];
_ ->
[]
#{config_files := Confs} -> Confs;
_ -> []
end.

schema_dir() ->
Expand All @@ -43,7 +29,7 @@ schema_dir() ->
get_advanced_config() ->
case get_prelaunch_config_state() of
%% There can be only one advanced.config
#{config_advanced_file := FileName} ->
#{config_advanced_file := FileName} when FileName =/= undefined ->
case rabbit_file:is_file(FileName) of
true -> FileName;
false -> none
Expand All @@ -53,47 +39,13 @@ get_advanced_config() ->

-spec config_files() -> [config_location()].
config_files() ->
case legacy_erlang_term_config_used() of
true ->
case get_prelaunch_config_state() of
#{config_files := Files} ->
[ filename:absname(filename:rootname(File) ++ ".config")
|| File <- Files];
_ ->
case config_setting() of
ConfFiles = [filename:absname(File) || File <- get_confs(),
filelib:is_regular(File)],
AdvancedFiles = case get_advanced_config() of
none -> [];
File -> [filename:absname(filename:rootname(File, ".config") ++ ".config")
++
" (not found)"]
end
end;
false ->
ConfFiles = [filename:absname(File) || File <- get_confs(),
filelib:is_regular(File)],
AdvancedFiles = case get_advanced_config() of
none -> [];
FileName -> [filename:absname(FileName)]
end,
AdvancedFiles ++ ConfFiles

end.
FileName -> [filename:absname(FileName)]
end,
AdvancedFiles ++ ConfFiles.

get_prelaunch_config_state() ->
rabbit_prelaunch_conf:get_config_state().

%% This is a pain. We want to know where the config file is. But we
%% can't specify it on the command line if it is missing or the VM
%% will fail to start, so we need to find it by some mechanism other
%% than init:get_arguments/0. We can look at the environment variable
%% which is responsible for setting it... but that doesn't work for a
%% Windows service since the variable can change and the service not
%% be reinstalled, so in that case we add a magic application env.
config_setting() ->
case application:get_env(rabbit, windows_service_config) of
{ok, File1} -> File1;
undefined ->
case application:get_env(rabbitmq_prelaunch, context) of
#{main_config_file := File2} -> File2;
_ -> none
end
end.