summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Klishin <michael@clojurewerkz.org>2019-11-12 21:21:49 +0300
committerMichael Klishin <michael@clojurewerkz.org>2019-11-12 21:21:49 +0300
commit751ece536d661635d12371bcb078e652ea47ea17 (patch)
tree64756594fbd1c2bc0437579da0fbc15ff907742c /src
parent8db047864f31aef7120cae162bf0c40c0b5f95d4 (diff)
downloadrabbitmq-server-git-751ece536d661635d12371bcb078e652ea47ea17.tar.gz
Normalize policy definitions before merging them
Closes rabbitmq/rabbitmq-management#751.
Diffstat (limited to 'src')
-rw-r--r--src/rabbit_policy.erl34
1 files changed, 17 insertions, 17 deletions
diff --git a/src/rabbit_policy.erl b/src/rabbit_policy.erl
index ff07bfa8ee..c718c743f9 100644
--- a/src/rabbit_policy.erl
+++ b/src/rabbit_policy.erl
@@ -43,7 +43,7 @@
-export([register/0]).
-export([invalidate/0, recover/0]).
--export([name/1, name_op/1, effective_definition/1, get/2, get_arg/3, set/1]).
+-export([name/1, name_op/1, effective_definition/1, merge_operator_definitions/2, get/2, get_arg/3, set/1]).
-export([validate/5, notify/5, notify_clear/4]).
-export([parse_set/7, set/7, delete/3, lookup/2, list/0, list/1,
list_formatted/1, list_formatted/3, info_keys/0]).
@@ -76,23 +76,23 @@ name0(Policy) -> pget(name, Policy).
effective_definition(Q) when ?is_amqqueue(Q) ->
Policy = amqqueue:get_policy(Q),
OpPolicy = amqqueue:get_operator_policy(Q),
- effective_definition0(Policy, OpPolicy);
+ merge_operator_definitions(Policy, OpPolicy);
effective_definition(#exchange{policy = Policy, operator_policy = OpPolicy}) ->
- effective_definition0(Policy, OpPolicy).
-
-effective_definition0(undefined, undefined) -> undefined;
-effective_definition0(Policy, undefined) -> pget(definition, Policy);
-effective_definition0(undefined, OpPolicy) -> pget(definition, OpPolicy);
-effective_definition0(Policy, OpPolicy) ->
- OpDefinition = pget(definition, OpPolicy, []),
- Definition = pget(definition, Policy, []),
- {Keys, _} = lists:unzip(Definition),
- {OpKeys, _} = lists:unzip(OpDefinition),
+ merge_operator_definitions(Policy, OpPolicy).
+
+merge_operator_definitions(undefined, undefined) -> undefined;
+merge_operator_definitions(Policy, undefined) -> pget(definition, Policy);
+merge_operator_definitions(undefined, OpPolicy) -> pget(definition, OpPolicy);
+merge_operator_definitions(Policy, OpPolicy) ->
+ OpDefinition = rabbit_data_coercion:to_map(pget(definition, OpPolicy, [])),
+ Definition = rabbit_data_coercion:to_map(pget(definition, Policy, [])),
+ Keys = maps:keys(Definition),
+ OpKeys = maps:keys(OpDefinition),
lists:map(fun(Key) ->
- case {pget(Key, Definition), pget(Key, OpDefinition)} of
- {Val, undefined} -> {Key, Val};
- {undefined, Val} -> {Key, Val};
- {Val, OpVal} -> {Key, merge_policy_value(Key, Val, OpVal)}
+ case {maps:get(Key, Definition, undefined), maps:get(Key, OpDefinition, undefined)} of
+ {Val, undefined} -> {Key, Val};
+ {undefined, OpVal} -> {Key, OpVal};
+ {Val, OpVal} -> {Key, merge_policy_value(Key, Val, OpVal)}
end
end,
lists:umerge(Keys, OpKeys)).
@@ -142,7 +142,7 @@ get0(Name, Policy, OpPolicy) ->
merge_policy_value(Name, PolicyVal, OpVal) ->
case policy_merge_strategy(Name) of
{ok, Module} -> Module:merge_policy_value(Name, PolicyVal, OpVal);
- {error, not_found} -> PolicyVal
+ {error, not_found} -> rabbit_policies:merge_policy_value(Name, PolicyVal, OpVal)
end.
policy_merge_strategy(Name) ->