diff options
| author | Arnaud Cogoluègnes <acogoluegnes@gmail.com> | 2016-12-13 14:55:57 +0100 |
|---|---|---|
| committer | Arnaud Cogoluègnes <acogoluegnes@gmail.com> | 2016-12-13 14:55:57 +0100 |
| commit | 1a8e5c9e311f3f70e1b375f8d8bd727e60e763b8 (patch) | |
| tree | 5dd6690d4ae975628f2060360bc8598054bf8932 | |
| parent | 9966bf207df0dd6999ff237f92de1c3731f6fc84 (diff) | |
| download | rabbitmq-server-git-1a8e5c9e311f3f70e1b375f8d8bd727e60e763b8.tar.gz | |
Use atom key and JSON value for global parameters
Part of rabbitmq/rabbitmq-mqtt#73
| -rw-r--r-- | src/rabbit_control_main.erl | 14 | ||||
| -rw-r--r-- | src/rabbit_runtime_parameters.erl | 52 | ||||
| -rw-r--r-- | test/rabbitmqctl_integration_SUITE.erl | 62 |
3 files changed, 65 insertions, 63 deletions
diff --git a/src/rabbit_control_main.erl b/src/rabbit_control_main.erl index c4106aa88a..1f48d9916a 100644 --- a/src/rabbit_control_main.erl +++ b/src/rabbit_control_main.erl @@ -125,7 +125,7 @@ -define(COMMANDS_WITH_TIMEOUT, [list_user_permissions, list_policies, list_queues, list_exchanges, list_bindings, list_connections, list_channels, list_consumers, - list_vhosts, list_parameters, + list_vhosts, list_parameters, list_global_parameters, purge_queue, {node_health_check, 70000}]). @@ -534,15 +534,15 @@ action(clear_parameter, Node, [Component, Key], Opts, Inform) -> action(set_global_parameter, Node, [Key, Value], _Opts, Inform) -> Inform("Setting global runtime parameter ~p to ~p", [Key, Value]), rpc_call( - Node, rabbit_runtime_parameters, set_global, - [evaluate_input_as_term(Key), rabbit_data_coercion:to_binary(Value)] + Node, rabbit_runtime_parameters, parse_set_global, + [rabbit_data_coercion:to_atom(Key), rabbit_data_coercion:to_binary(Value)] ); action(clear_global_parameter, Node, [Key], _Opts, Inform) -> Inform("Clearing global runtime parameter ~p", [Key]), rpc_call( Node, rabbit_runtime_parameters, clear_global, - [evaluate_input_as_term(Key)] + [rabbit_data_coercion:to_atom(Key)] ); action(set_policy, Node, [Key, Pattern, Defn], Opts, Inform) -> @@ -1001,9 +1001,3 @@ alarms_by_node(Name) -> {_, As} = lists:keyfind(alarms, 1, Status), {Name, As} end. - -evaluate_input_as_term(Input) -> - {ok,Tokens,_EndLine} = erl_scan:string(Input ++ "."), - {ok,AbsForm} = erl_parse:parse_exprs(Tokens), - {value,TermValue,_Bs} = erl_eval:exprs(AbsForm, erl_eval:new_bindings()), - TermValue.
\ No newline at end of file diff --git a/src/rabbit_runtime_parameters.erl b/src/rabbit_runtime_parameters.erl index 8f5cc2c9c3..5bf72eaba3 100644 --- a/src/rabbit_runtime_parameters.erl +++ b/src/rabbit_runtime_parameters.erl @@ -53,8 +53,8 @@ list_component/1, list/2, list_formatted/1, list_formatted/3, lookup/3, value/3, value/4, info_keys/0, clear_component/1]). --export([set_global/2, value_global/1, value_global/2, - list_global/0, list_global_formatted/0, +-export([parse_set_global/2, set_global/2, value_global/1, value_global/2, + list_global/0, list_global_formatted/0, list_global_formatted/2, global_info_keys/0, clear_global/1]). %%---------------------------------------------------------------------------- @@ -110,14 +110,13 @@ set(_, <<"policy">>, _, _, _) -> set(VHost, Component, Name, Term, User) -> set_any(VHost, Component, Name, Term, User). -set_global(Name, Term) when is_atom(Name) -> - %% for cluster_name - set_global0(Name, Term); - -set_global(Name, Term) -> - set_global0({global, Name}, Term). +parse_set_global(Name, String) -> + case rabbit_misc:json_decode(String) of + {ok, JSON} -> set_global(Name, rabbit_misc:json_to_term(JSON)); + error -> {error_string, "JSON decoding error"} + end. -set_global0(Name, Term) -> +set_global(Name, Term) -> mnesia_update(Name, Term), event_notify(parameter_set, none, global, [{name, Name}, {value, Term}]), @@ -186,7 +185,7 @@ clear_global(Key) -> {error_string, "Parameter does not exist"}; _ -> F = fun () -> - ok = mnesia:delete(?TABLE, {global, Key}, write) + ok = mnesia:delete(?TABLE, Key, write) end, ok = rabbit_misc:execute_mnesia_transaction(F), case mnesia:is_transaction() of @@ -265,21 +264,26 @@ list(VHost, Component) -> list_global() -> mnesia:async_dirty( fun () -> - Match = #runtime_parameters{key = {global, '_'}, - _ = '_'}, - [p(P) || P <- mnesia:match_object(?TABLE, Match, read)] + Match = #runtime_parameters{key = '_', _ = '_'}, + [p(P) || P <- mnesia:match_object(?TABLE, Match, read), + is_atom(P#runtime_parameters.key), is_list(P#runtime_parameters.value)] end). list_formatted(VHost) -> [pset(value, format(pget(value, P)), P) || P <- list(VHost)]. +list_formatted(VHost, Ref, AggregatorPid) -> + rabbit_control_misc:emitting_map( + AggregatorPid, Ref, + fun(P) -> pset(value, format(pget(value, P)), P) end, list(VHost)). + list_global_formatted() -> - [pset(value, format(pget(value, P)), P) || P <- list_global()]. + [pset(value, format(pget(value, P)), P) || P <- list_global(), is_list(pget(value, P))]. -list_formatted(VHost, Ref, AggregatorPid) -> +list_global_formatted(Ref, AggregatorPid) -> rabbit_control_misc:emitting_map( - AggregatorPid, Ref, - fun(P) -> pset(value, format(pget(value, P)), P) end, list(VHost)). + AggregatorPid, Ref, + fun(P) -> pset(value, format(pget(value, P)), P) end, list_global()). lookup(VHost, Component, Name) -> case lookup0({VHost, Component, Name}, rabbit_misc:const(not_found)) of @@ -290,17 +294,11 @@ lookup(VHost, Component, Name) -> value(VHost, Comp, Name) -> value0({VHost, Comp, Name}). value(VHost, Comp, Name, Def) -> value0({VHost, Comp, Name}, Def). -value_global(Key) when is_atom(Key) -> - %% for cluster_name - value0(Key); value_global(Key) -> - value0({global, Key}). + value0(Key). -value_global(Key, Default) when is_atom(Key) -> - %% for cluster_name - value0(Key, Default); value_global(Key, Default) -> - value0({global, Key}, Default). + value0(Key, Default). value0(Key) -> case lookup0(Key, rabbit_misc:const(not_found)) of @@ -339,8 +337,8 @@ p(#runtime_parameters{key = {VHost, Component, Name}, value = Value}) -> {name, Name}, {value, Value}]; -p(#runtime_parameters{key = {global, Name}, value = Value}) -> - [{name, Name}, +p(#runtime_parameters{key = Key, value = Value}) when is_atom(Key) -> + [{name, Key}, {value, Value}]. info_keys() -> [component, name, value]. diff --git a/test/rabbitmqctl_integration_SUITE.erl b/test/rabbitmqctl_integration_SUITE.erl index ba72578775..ef85472f48 100644 --- a/test/rabbitmqctl_integration_SUITE.erl +++ b/test/rabbitmqctl_integration_SUITE.erl @@ -146,61 +146,71 @@ list_queues_offline(Config) -> manage_global_parameters(Config) -> 0 = length(global_parameters(Config)), - GlobalParameterValue1 = <<"vhost1">>, - control_action(Config, set_global_parameter, - ["{mqtt_cert_user_vhost, <<\"O=client,CN=dummy1\">>}", - GlobalParameterValue1 + Parameter1Key = global_param1, + GlobalParameter1ValueAsString = "{\"a\":\"b\", \"c\":\"d\"}", + ok = control_action(Config, set_global_parameter, + [atom_to_list(Parameter1Key), + GlobalParameter1ValueAsString ]), 1 = length(global_parameters(Config)), - GlobalParameterValue1 = rabbit_ct_broker_helpers:rpc( + GlobalParameter1Value = rabbit_ct_broker_helpers:rpc( Config, 0, rabbit_runtime_parameters, value_global, - [ - {mqtt_cert_user_vhost, <<"O=client,CN=dummy1">>} - ] + [Parameter1Key] ), - GlobalParameterValue2 = <<"vhost2">>, - control_action(Config, set_global_parameter, - ["{mqtt_cert_user_vhost, <<\"O=client,CN=dummy2\">>}", - GlobalParameterValue2 + [{<<"a">>,<<"b">>}, {<<"c">>,<<"d">>}] = GlobalParameter1Value, + + Parameter2Key = global_param2, + GlobalParameter2ValueAsString = "{\"e\":\"f\", \"g\":\"h\"}", + ok = control_action(Config, set_global_parameter, + [atom_to_list(Parameter2Key), + GlobalParameter2ValueAsString ]), 2 = length(global_parameters(Config)), - GlobalParameterValue2 = rabbit_ct_broker_helpers:rpc( + GlobalParameter2Value = rabbit_ct_broker_helpers:rpc( Config, 0, rabbit_runtime_parameters, value_global, - [ - {mqtt_cert_user_vhost, <<"O=client,CN=dummy2">>} - ] + [Parameter2Key] ), - NewGlobalParameterValue = <<"vhost3">>, + [{<<"e">>,<<"f">>}, {<<"g">>,<<"h">>}] = GlobalParameter2Value, + - control_action(Config, set_global_parameter, - ["{mqtt_cert_user_vhost, <<\"O=client,CN=dummy1\">>}", - NewGlobalParameterValue + GlobalParameter1Value2AsString = "{\"a\":\"z\", \"c\":\"d\"}", + ok = control_action(Config, set_global_parameter, + [atom_to_list(Parameter1Key), + GlobalParameter1Value2AsString ]), 2 = length(global_parameters(Config)), - NewGlobalParameterValue = rabbit_ct_broker_helpers:rpc( + GlobalParameter1Value2 = rabbit_ct_broker_helpers:rpc( Config, 0, rabbit_runtime_parameters, value_global, - [ - {mqtt_cert_user_vhost, <<"O=client,CN=dummy1">>} - ] + [Parameter1Key] ), - control_action(Config, clear_global_parameter, - ["{mqtt_cert_user_vhost, <<\"O=client,CN=dummy1\">>}"] + [{<<"a">>,<<"z">>}, {<<"c">>,<<"d">>}] = GlobalParameter1Value2, + + ok = control_action(Config, clear_global_parameter, + [atom_to_list(Parameter1Key)] ), 1 = length(global_parameters(Config)), + not_found = rabbit_ct_broker_helpers:rpc( + Config, 0, + rabbit_runtime_parameters, value_global, + [Parameter1Key] + ), + + ok = control_action(Config, list_global_parameters, []), + ok. %%---------------------------------------------------------------------------- |
