diff options
| -rw-r--r-- | src/rabbit_amqqueue.erl | 37 |
1 files changed, 25 insertions, 12 deletions
diff --git a/src/rabbit_amqqueue.erl b/src/rabbit_amqqueue.erl index e279b055b4..f2a00ebd42 100644 --- a/src/rabbit_amqqueue.erl +++ b/src/rabbit_amqqueue.erl @@ -327,36 +327,49 @@ assert_args_equivalence(#amqqueue{name = QueueName, arguments = Args}, [<<"x-expires">>, <<"x-message-ttl">>, <<"x-ha-policy">>]). check_declare_arguments(QueueName, Args) -> - [case Fun(rabbit_misc:table_lookup(Args, Key)) of + [case Fun(rabbit_misc:table_lookup(Args, Key), Args) of ok -> ok; {error, Error} -> rabbit_misc:protocol_error( precondition_failed, "invalid arg '~s' for ~s: ~w", [Key, rabbit_misc:rs(QueueName), Error]) end || {Key, Fun} <- - [{<<"x-expires">>, fun check_integer_argument/1}, - {<<"x-message-ttl">>, fun check_integer_argument/1}, - {<<"x-ha-policy">>, fun check_ha_policy_argument/1}]], + [{<<"x-expires">>, fun check_integer_argument/2}, + {<<"x-message-ttl">>, fun check_integer_argument/2}, + {<<"x-ha-policy">>, fun check_ha_policy_argument/2}]], ok. -check_integer_argument(undefined) -> +check_integer_argument(undefined, _Args) -> ok; -check_integer_argument({Type, Val}) when Val > 0 -> +check_integer_argument({Type, Val}, _Args) when Val > 0 -> case lists:member(Type, ?INTEGER_ARG_TYPES) of true -> ok; false -> {error, {unacceptable_type, Type}} end; -check_integer_argument({_Type, Val}) -> +check_integer_argument({_Type, Val}, _Args) -> {error, {value_zero_or_less, Val}}. -check_ha_policy_argument(undefined) -> +check_ha_policy_argument(undefined, _Args) -> ok; -check_ha_policy_argument({longstr, Policy}) - when Policy =:= <<"nodes">> orelse Policy =:= <<"all">> -> +check_ha_policy_argument({longstr, <<"all">>}, _Args) -> ok; -check_ha_policy_argument({longstr, Policy}) -> +check_ha_policy_argument({longstr, <<"nodes">>}, _Args) -> + case rabbit_misc:table_lookup(Args, <<"x-ha-policy-params">>) of + undefined -> + {error, {require, <<"x-ha-policy-params">>}}; + {array, Ary} -> + case lists:all(fun ({longstr, _Node}) -> true; + _ -> false + end, Ary) of + true -> ok; + false -> {error, {require_list_of_nodes_as_longstrs, Ary}} + end; + {Type, _} -> + {error, {ha_nodes_policy_params_not_array_of_longstr, Type}} + end; +check_ha_policy_argument({longstr, Policy}, _Args) -> {error, {invalid_ha_policy, Policy}}; -check_ha_policy_argument({Type, _}) -> +check_ha_policy_argument({Type, _}, _Args) -> {error, {unacceptable_type, Type}}. list(VHostPath) -> |
