|
10 | 10 |
|
11 | 11 | -export([boot/0]).
|
12 | 12 | %% automatic import on boot
|
13 |
| --export([maybe_load_definitions/0, maybe_load_definitions/2, maybe_load_definitions_from/2, |
14 |
| - has_configured_definitions_to_load/0]). |
| 13 | +-export([ |
| 14 | + maybe_load_definitions/0, |
| 15 | + maybe_load_definitions/2, |
| 16 | + maybe_load_definitions_from/2, |
| 17 | + |
| 18 | + has_configured_definitions_to_load/0 |
| 19 | +]). |
15 | 20 | %% import
|
16 | 21 | -export([import_raw/1, import_raw/2, import_parsed/1, import_parsed/2,
|
17 | 22 | apply_defs/2, apply_defs/3, apply_defs/4, apply_defs/5]).
|
|
25 | 30 | ]).
|
26 | 31 | -export([decode/1, decode/2, args/1]).
|
27 | 32 |
|
28 |
| --import(rabbit_misc, [pget/2]). |
| 33 | +-import(rabbit_misc, [pget/2, pget/3]). |
29 | 34 | -import(rabbit_data_coercion, [to_binary/1]).
|
30 | 35 |
|
31 | 36 | %%
|
@@ -59,9 +64,10 @@ boot() ->
|
59 | 64 | rabbit_sup:start_supervisor_child(definition_import_pool_sup, worker_pool_sup, [PoolSize, ?IMPORT_WORK_POOL]).
|
60 | 65 |
|
61 | 66 | maybe_load_definitions() ->
|
62 |
| - %% Note that management.load_definitions is handled in the plugin for backwards compatibility. |
63 |
| - %% This executes the "core" version of load_definitions. |
64 |
| - maybe_load_definitions(rabbit, load_definitions). |
| 67 | + %% Classic source: local file or data directory |
| 68 | + maybe_load_definitions_from_local_filesystem(rabbit, load_definitions), |
| 69 | + %% Extensible sources |
| 70 | + maybe_load_definitions_from_pluggable_source(rabbit, definitions). |
65 | 71 |
|
66 | 72 | -spec import_raw(Body :: binary() | iolist()) -> ok | {error, term()}.
|
67 | 73 | import_raw(Body) ->
|
@@ -126,63 +132,76 @@ all_definitions() ->
|
126 | 132 | exchanges => Xs
|
127 | 133 | }.
|
128 | 134 |
|
| 135 | +-spec has_configured_definitions_to_load() -> boolean(). |
| 136 | +has_configured_definitions_to_load() -> |
| 137 | + has_configured_definitions_to_load_via_classic_option() or has_configured_definitions_to_load_via_modern_option(). |
| 138 | + |
| 139 | +%% Retained for backwards compatibility, implicitly assumes the local filesystem source |
| 140 | +maybe_load_definitions(App, Key) -> |
| 141 | + maybe_load_definitions_from_local_filesystem(App, Key). |
| 142 | + |
| 143 | +maybe_load_definitions_from(IsDir, Path) -> |
| 144 | + rabbit_definitions_import_local_filesystem:load(IsDir, Path). |
| 145 | + |
129 | 146 | %%
|
130 | 147 | %% Implementation
|
131 | 148 | %%
|
132 | 149 |
|
133 |
| --spec has_configured_definitions_to_load() -> boolean(). |
134 |
| -has_configured_definitions_to_load() -> |
| 150 | +-spec has_configured_definitions_to_load_via_modern_option() -> boolean(). |
| 151 | +has_configured_definitions_to_load_via_modern_option() -> |
| 152 | + case application:get_env(rabbit, definitions) of |
| 153 | + undefined -> false; |
| 154 | + {ok, none} -> false; |
| 155 | + {ok, []} -> false; |
| 156 | + {ok, _Options} -> true |
| 157 | + end. |
| 158 | + |
| 159 | +has_configured_definitions_to_load_via_classic_option() -> |
135 | 160 | case application:get_env(rabbit, load_definitions) of
|
136 | 161 | undefined -> false;
|
137 | 162 | {ok, none} -> false;
|
138 | 163 | {ok, _Path} -> true
|
139 | 164 | end.
|
140 | 165 |
|
141 |
| -maybe_load_definitions(App, Key) -> |
| 166 | +maybe_load_definitions_from_local_filesystem(App, Key) -> |
142 | 167 | case application:get_env(App, Key) of
|
143 |
| - undefined -> |
144 |
| - rabbit_log:debug("No definition file configured to import via load_definitions"), |
145 |
| - ok; |
146 |
| - {ok, none} -> |
147 |
| - rabbit_log:debug("No definition file configured to import via load_definitions"), |
148 |
| - ok; |
149 |
| - {ok, FileOrDir} -> |
150 |
| - rabbit_log:debug("Will import definitions file from load_definitions"), |
151 |
| - IsDir = filelib:is_dir(FileOrDir), |
152 |
| - maybe_load_definitions_from(IsDir, FileOrDir) |
| 168 | + undefined -> ok; |
| 169 | + {ok, none} -> ok; |
| 170 | + {ok, Path} -> |
| 171 | + IsDir = filelib:is_dir(Path), |
| 172 | + rabbit_definitions_import_local_filesystem:load(IsDir, Path) |
153 | 173 | end.
|
154 | 174 |
|
155 |
| -maybe_load_definitions_from(true, Dir) -> |
156 |
| - rabbit_log:info("Applying definitions from directory ~s", [Dir]), |
157 |
| - load_definitions_from_files(file:list_dir(Dir), Dir); |
158 |
| -maybe_load_definitions_from(false, File) -> |
159 |
| - load_definitions_from_file(File). |
160 |
| - |
161 |
| -load_definitions_from_files({ok, Filenames0}, Dir) -> |
162 |
| - Filenames1 = lists:sort(Filenames0), |
163 |
| - Filenames2 = [filename:join(Dir, F) || F <- Filenames1], |
164 |
| - load_definitions_from_filenames(Filenames2); |
165 |
| -load_definitions_from_files({error, E}, Dir) -> |
166 |
| - rabbit_log:error("Could not read definitions from directory ~s, Error: ~p", [Dir, E]), |
167 |
| - {error, {could_not_read_defs, E}}. |
168 |
| - |
169 |
| -load_definitions_from_filenames([]) -> |
170 |
| - ok; |
171 |
| -load_definitions_from_filenames([File|Rest]) -> |
172 |
| - case load_definitions_from_file(File) of |
173 |
| - ok -> load_definitions_from_filenames(Rest); |
174 |
| - {error, E} -> {error, {failed_to_import_definitions, File, E}} |
| 175 | +maybe_load_definitions_from_pluggable_source(App, Key) -> |
| 176 | + case application:get_env(App, Key) of |
| 177 | + undefined -> ok; |
| 178 | + {ok, none} -> ok; |
| 179 | + {ok, []} -> ok; |
| 180 | + {ok, Proplist} -> |
| 181 | + case pget(import_backend, Proplist, undefined) of |
| 182 | + undefined -> |
| 183 | + {error, "definition import source is configured but definitions.import_backend is not set"}; |
| 184 | + ModOrAlias -> |
| 185 | + Mod = normalize_backend_module(ModOrAlias), |
| 186 | + rabbit_log:debug("Will use module ~s to import definitions", [Mod]), |
| 187 | + Mod:load(Proplist) |
| 188 | + end |
175 | 189 | end.
|
176 | 190 |
|
177 |
| -load_definitions_from_file(File) -> |
178 |
| - case file:read_file(File) of |
179 |
| - {ok, Body} -> |
180 |
| - rabbit_log:info("Applying definitions from file at '~s'", [File]), |
181 |
| - import_raw(Body); |
182 |
| - {error, E} -> |
183 |
| - rabbit_log:error("Could not read definitions from file at '~s', error: ~p", [File, E]), |
184 |
| - {error, {could_not_read_defs, {File, E}}} |
185 |
| - end. |
| 191 | +normalize_backend_module(local_filesystem) -> |
| 192 | + rabbit_definitions_import_local_filesystem; |
| 193 | +normalize_backend_module(local) -> |
| 194 | + rabbit_definitions_import_local_filesystem; |
| 195 | +normalize_backend_module(https) -> |
| 196 | + rabbit_definitions_import_https; |
| 197 | +normalize_backend_module(http) -> |
| 198 | + rabbit_definitions_import_https; |
| 199 | +normalize_backend_module(rabbitmq_definitions_import_local_filesystem) -> |
| 200 | + rabbit_definitions_import_local_filesystem; |
| 201 | +normalize_backend_module(rabbitmq_definitions_import_https) -> |
| 202 | + rabbit_definitions_import_https; |
| 203 | +normalize_backend_module(Other) -> |
| 204 | + Other. |
186 | 205 |
|
187 | 206 | decode(Keys, Body) ->
|
188 | 207 | case decode(Body) of
|
|
0 commit comments