summaryrefslogtreecommitdiff
path: root/deps/rabbitmq_shovel/src/rabbit_shovel_sup.erl
diff options
context:
space:
mode:
Diffstat (limited to 'deps/rabbitmq_shovel/src/rabbit_shovel_sup.erl')
-rw-r--r--deps/rabbitmq_shovel/src/rabbit_shovel_sup.erl77
1 files changed, 77 insertions, 0 deletions
diff --git a/deps/rabbitmq_shovel/src/rabbit_shovel_sup.erl b/deps/rabbitmq_shovel/src/rabbit_shovel_sup.erl
new file mode 100644
index 0000000000..f04b4758a3
--- /dev/null
+++ b/deps/rabbitmq_shovel/src/rabbit_shovel_sup.erl
@@ -0,0 +1,77 @@
+%% This Source Code Form is subject to the terms of the Mozilla Public
+%% License, v. 2.0. If a copy of the MPL was not distributed with this
+%% file, You can obtain one at https://mozilla.org/MPL/2.0/.
+%%
+%% Copyright (c) 2007-2020 VMware, Inc. or its affiliates. All rights reserved.
+%%
+
+-module(rabbit_shovel_sup).
+-behaviour(supervisor2).
+
+-export([start_link/0, init/1]).
+
+-import(rabbit_shovel_config, []).
+
+-include("rabbit_shovel.hrl").
+
+start_link() ->
+ case parse_configuration(application:get_env(shovels)) of
+ {ok, Configurations} ->
+ supervisor2:start_link({local, ?MODULE}, ?MODULE, [Configurations]);
+ {error, Reason} ->
+ {error, Reason}
+ end.
+
+init([Configurations]) ->
+ Len = dict:size(Configurations),
+ ChildSpecs = [{rabbit_shovel_status,
+ {rabbit_shovel_status, start_link, []},
+ transient, 16#ffffffff, worker,
+ [rabbit_shovel_status]},
+ {rabbit_shovel_dyn_worker_sup_sup,
+ {rabbit_shovel_dyn_worker_sup_sup, start_link, []},
+ transient, 16#ffffffff, supervisor,
+ [rabbit_shovel_dyn_worker_sup_sup]} |
+ make_child_specs(Configurations)],
+ {ok, {{one_for_one, 2*Len, 2}, ChildSpecs}}.
+
+make_child_specs(Configurations) ->
+ dict:fold(
+ fun (ShovelName, ShovelConfig, Acc) ->
+ [{ShovelName,
+ {rabbit_shovel_worker_sup, start_link,
+ [ShovelName, ShovelConfig]},
+ permanent,
+ 16#ffffffff,
+ supervisor,
+ [rabbit_shovel_worker_sup]} | Acc]
+ end, [], Configurations).
+
+parse_configuration(undefined) ->
+ {ok, dict:new()};
+parse_configuration({ok, Env}) ->
+ {ok, Defaults} = application:get_env(defaults),
+ parse_configuration(Defaults, Env, dict:new()).
+
+parse_configuration(_Defaults, [], Acc) ->
+ {ok, Acc};
+parse_configuration(Defaults, [{ShovelName, ShovelConfig} | Env], Acc)
+ when is_atom(ShovelName) andalso is_list(ShovelConfig) ->
+ case dict:is_key(ShovelName, Acc) of
+ true -> {error, {duplicate_shovel_definition, ShovelName}};
+ false -> case validate_shovel_config(ShovelName, ShovelConfig) of
+ {ok, Shovel} ->
+ %% make sure the config we accumulate has any
+ %% relevant default values (discovered during
+ %% validation), applied back to it
+ Acc2 = dict:store(ShovelName, Shovel, Acc),
+ parse_configuration(Defaults, Env, Acc2);
+ Error ->
+ Error
+ end
+ end;
+parse_configuration(_Defaults, _, _Acc) ->
+ {error, require_list_of_shovel_configurations}.
+
+validate_shovel_config(ShovelName, ShovelConfig) ->
+ rabbit_shovel_config:parse(ShovelName, ShovelConfig).