summaryrefslogtreecommitdiff
path: root/src/rabbit_mirror_queue_misc.erl
diff options
context:
space:
mode:
authorSimon MacMullen <simon@rabbitmq.com>2012-10-16 17:23:08 +0100
committerSimon MacMullen <simon@rabbitmq.com>2012-10-16 17:23:08 +0100
commit0b3978c4b05f6c99943efd66c243ead0c71ea3dd (patch)
treea02a1f7f55139114d260a8674e7f2ba1c61cc75d /src/rabbit_mirror_queue_misc.erl
parent5da4862faf958f1bfacc4b0a5f9326dac998afe0 (diff)
parent7a1127b12f62296ec1f40ecbe329041c24b5a9ea (diff)
downloadrabbitmq-server-0b3978c4b05f6c99943efd66c243ead0c71ea3dd.tar.gz
Merge default
Diffstat (limited to 'src/rabbit_mirror_queue_misc.erl')
-rw-r--r--src/rabbit_mirror_queue_misc.erl49
1 files changed, 48 insertions, 1 deletions
diff --git a/src/rabbit_mirror_queue_misc.erl b/src/rabbit_mirror_queue_misc.erl
index 4c8406d9..1b487534 100644
--- a/src/rabbit_mirror_queue_misc.erl
+++ b/src/rabbit_mirror_queue_misc.erl
@@ -15,16 +15,26 @@
%%
-module(rabbit_mirror_queue_misc).
+-behaviour(rabbit_policy_validator).
-export([remove_from_queue/3, on_node_up/0, add_mirrors/2, add_mirror/2,
report_deaths/4, store_updated_slaves/1, suggested_queue_nodes/1,
- is_mirrored/1, update_mirrors/2]).
+ is_mirrored/1, update_mirrors/2, validate_policy/1]).
%% for testing only
-export([suggested_queue_nodes/4]).
-include("rabbit.hrl").
+-rabbit_boot_step({?MODULE,
+ [{description, "HA policy validation"},
+ {mfa, {rabbit_registry, register,
+ [policy_validator, <<"ha-mode">>, ?MODULE]}},
+ {mfa, {rabbit_registry, register,
+ [policy_validator, <<"ha-params">>, ?MODULE]}},
+ {requires, rabbit_registry},
+ {enables, recovery}]}).
+
%%----------------------------------------------------------------------------
-ifdef(use_specs).
@@ -328,3 +338,40 @@ update_mirrors0(OldQ = #amqqueue{name = QName},
add_mirrors(QName, NewNodes -- OldNodes),
drop_mirrors(QName, OldNodes -- NewNodes),
ok.
+
+%%----------------------------------------------------------------------------
+
+validate_policy(KeyList) ->
+ validate_policy(
+ proplists:get_value(<<"ha-mode">>, KeyList),
+ proplists:get_value(<<"ha-params">>, KeyList)).
+
+validate_policy(<<"all">>, _Params) ->
+ ok;
+validate_policy(<<"nodes">>, Params) ->
+ validate_params(lists:append(Params),
+ fun erlang:is_binary/1,
+ "~p has invalid node names when ha-mode=nodes",
+ fun (N) -> N > 0 end,
+ "at least one node expected when ha-mode=nodes");
+validate_policy(<<"exactly">>, Params) ->
+ validate_params(Params,
+ fun (N) -> is_integer(N) andalso N > 0 end,
+ "~p must be a positive integer",
+ fun (N) -> N == 1 end,
+ "ha-params must be supplied with one number "
+ "when ha-mode=exactly");
+validate_policy(Mode, _Params) ->
+ {error, "~p is not a valid ha-mode value", [Mode]}.
+
+validate_params(Params, FilterPred, FilterMsg, SizePred, SizeMsg)
+ when is_list(Params) ->
+ case SizePred(length(Params)) of
+ true -> case lists:filter(fun (P) -> not FilterPred(P) end, Params) of
+ [] -> ok;
+ X -> {error, FilterMsg, [X]}
+ end;
+ false -> {error, SizeMsg, []}
+ end;
+validate_params(Params, _, _, _, _) ->
+ {error, "~p was expected to be a list", [Params]}.