summaryrefslogtreecommitdiff
path: root/deps/rabbit
diff options
context:
space:
mode:
authorMichael Klishin <klishinm@vmware.com>2023-04-18 10:37:39 +0400
committerGitHub <noreply@github.com>2023-04-18 10:37:39 +0400
commit5f342cf4a2d0797e4395562f13f0de913fb6e6f3 (patch)
tree4b6e293cad863763fbc9867f26e089b6944a24e3 /deps/rabbit
parent6e6c1581d467848def4950dbbcf2a984b78dfeed (diff)
parent4c30d9a6b4ed58dbc72efedc9838d4bf24bf782d (diff)
downloadrabbitmq-server-git-5f342cf4a2d0797e4395562f13f0de913fb6e6f3.tar.gz
Merge pull request #7917 from amazon-mq/runtime-params-limit
Make it possible to configure per-node runtime parameter limits
Diffstat (limited to 'deps/rabbit')
-rw-r--r--deps/rabbit/BUILD.bazel8
-rw-r--r--deps/rabbit/priv/schema/rabbit.schema19
-rw-r--r--deps/rabbit/src/rabbit_runtime_parameters.erl45
-rw-r--r--deps/rabbit/test/config_schema_SUITE_data/rabbit.snippets15
-rw-r--r--deps/rabbit/test/dummy_runtime_parameters.erl6
-rw-r--r--deps/rabbit/test/runtime_parameters_SUITE.erl61
6 files changed, 139 insertions, 15 deletions
diff --git a/deps/rabbit/BUILD.bazel b/deps/rabbit/BUILD.bazel
index 90610d3405..6f8df237d9 100644
--- a/deps/rabbit/BUILD.bazel
+++ b/deps/rabbit/BUILD.bazel
@@ -1153,6 +1153,14 @@ rabbitmq_integration_suite(
size = "small",
)
+rabbitmq_integration_suite(
+ name = "runtime_parameters_SUITE",
+ size = "small",
+ additional_srcs = [
+ "test/dummy_runtime_parameters.erl",
+ ],
+)
+
assert_suites()
filegroup(
diff --git a/deps/rabbit/priv/schema/rabbit.schema b/deps/rabbit/priv/schema/rabbit.schema
index 07643b050a..d71308cf18 100644
--- a/deps/rabbit/priv/schema/rabbit.schema
+++ b/deps/rabbit/priv/schema/rabbit.schema
@@ -2472,6 +2472,25 @@ end}.
{mapping, "quorum_queue.compute_checksums", "rabbit.quorum_compute_checksums", [
{datatype, {enum, [true, false]}}]}.
+
+%%
+%% Runtime parameters
+%%
+
+{mapping, "runtime_parameters.limits.$category", "rabbit.runtime_parameters.limits", [
+ {datatype, integer},
+ {validators, ["non_negative_integer"]}
+]}.
+
+{translation, "rabbit.runtime_parameters.limits",
+ fun(Conf) ->
+ case cuttlefish_variable:filter_by_prefix("runtime_parameters.limits", Conf) of
+ [] -> cuttlefish:unset();
+ Ss -> [ {list_to_binary(Category), Limit} || {[_, _, Category], Limit} <- Ss ]
+ end
+ end
+}.
+
% ===============================
% Validators
% ===============================
diff --git a/deps/rabbit/src/rabbit_runtime_parameters.erl b/deps/rabbit/src/rabbit_runtime_parameters.erl
index 57a99c03d9..99db888619 100644
--- a/deps/rabbit/src/rabbit_runtime_parameters.erl
+++ b/deps/rabbit/src/rabbit_runtime_parameters.erl
@@ -130,22 +130,26 @@ set_any0(VHost, Component, Name, Term, User) ->
[Name, VHost, Component, Term]),
case lookup_component(Component) of
{ok, Mod} ->
- case flatten_errors(
- Mod:validate(VHost, Component, Name, Term, get_user(User))) of
+ case is_within_limit(Component) of
ok ->
- case rabbit_db_rtparams:set(VHost, Component, Name, Term) of
- {old, Term} ->
+ case flatten_errors(Mod:validate(VHost, Component, Name, Term, get_user(User))) of
+ ok ->
+ case rabbit_db_rtparams:set(VHost, Component, Name, Term) of
+ {old, Term} ->
+ ok;
+ _ ->
+ ActingUser = get_username(User),
+ event_notify(
+ parameter_set, VHost, Component,
+ [{name, Name},
+ {value, Term},
+ {user_who_performed_action, ActingUser}]),
+ Mod:notify(VHost, Component, Name, Term, ActingUser)
+ end,
ok;
- _ ->
- ActingUser = get_username(User),
- event_notify(
- parameter_set, VHost, Component,
- [{name, Name},
- {value, Term},
- {user_who_performed_action, ActingUser}]),
- Mod:notify(VHost, Component, Name, Term, ActingUser)
- end,
- ok;
+ E ->
+ E
+ end;
E ->
E
end;
@@ -153,6 +157,19 @@ set_any0(VHost, Component, Name, Term, User) ->
E
end.
+-spec is_within_limit(binary()) -> ok | {errors, list()}.
+
+is_within_limit(Component) ->
+ Params = application:get_env(rabbit, runtime_parameters, []),
+ Limits = proplists:get_value(limits, Params, []),
+ Limit = proplists:get_value(Component, Limits, -1),
+ case Limit < 0 orelse count_component(Component) < Limit of
+ true -> ok;
+ false -> {errors, [{"component ~ts is limited to ~tp per node", [Component, Limit]}]}
+ end.
+
+count_component(Component) -> length(list_component(Component)).
+
%% Validate only an user record as expected by the API before #rabbitmq-event-exchange-10
get_user(#user{} = User) ->
User;
diff --git a/deps/rabbit/test/config_schema_SUITE_data/rabbit.snippets b/deps/rabbit/test/config_schema_SUITE_data/rabbit.snippets
index c6c1cc917f..2d80ba3d46 100644
--- a/deps/rabbit/test/config_schema_SUITE_data/rabbit.snippets
+++ b/deps/rabbit/test/config_schema_SUITE_data/rabbit.snippets
@@ -899,6 +899,21 @@ credential_validator.regexp = ^abc\\d+",
[]},
%%
+ %% Runtime parameters
+ %%
+
+ {runtime_parameters_limits,
+ "
+ runtime_parameters.limits.federation = 2
+ runtime_parameters.limits.shovel = 1
+ ",
+ [{rabbit, [{runtime_parameters, [{limits, [
+ {<<"shovel">>, 1},
+ {<<"federation">>, 2}
+ ]}]}]}],
+ []},
+
+ %%
%% Deprecated features
%%
diff --git a/deps/rabbit/test/dummy_runtime_parameters.erl b/deps/rabbit/test/dummy_runtime_parameters.erl
index fb54f6af5e..6da40891ae 100644
--- a/deps/rabbit/test/dummy_runtime_parameters.erl
+++ b/deps/rabbit/test/dummy_runtime_parameters.erl
@@ -9,7 +9,7 @@
-behaviour(rabbit_runtime_parameter).
-behaviour(rabbit_policy_validator).
--include("rabbit.hrl").
+-include_lib("rabbit_common/include/rabbit.hrl").
-export([validate/5, notify/5, notify_clear/4]).
-export([register/0, unregister/0]).
@@ -40,10 +40,14 @@ notify_clear(_, _, _, _) -> ok.
%----------------------------------------------------------------------------
register_policy_validator() ->
+ rabbit_registry:register(operator_policy_validator, <<"testeven">>, ?MODULE),
+ rabbit_registry:register(operator_policy_validator, <<"testpos">>, ?MODULE),
rabbit_registry:register(policy_validator, <<"testeven">>, ?MODULE),
rabbit_registry:register(policy_validator, <<"testpos">>, ?MODULE).
unregister_policy_validator() ->
+ rabbit_registry:unregister(operator_policy_validator, <<"testeven">>),
+ rabbit_registry:unregister(operator_policy_validator, <<"testpos">>),
rabbit_registry:unregister(policy_validator, <<"testeven">>),
rabbit_registry:unregister(policy_validator, <<"testpos">>).
diff --git a/deps/rabbit/test/runtime_parameters_SUITE.erl b/deps/rabbit/test/runtime_parameters_SUITE.erl
new file mode 100644
index 0000000000..c8e4420f96
--- /dev/null
+++ b/deps/rabbit/test/runtime_parameters_SUITE.erl
@@ -0,0 +1,61 @@
+%% 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) 2023-2023 VMware, Inc. or its affiliates. All rights reserved.
+%%
+
+-module(runtime_parameters_SUITE).
+
+-include_lib("eunit/include/eunit.hrl").
+
+-compile(export_all).
+
+all() ->
+ [
+ test_limits
+ ].
+
+%% -------------------------------------------------------------------
+%% Testsuite setup/teardown.
+%% -------------------------------------------------------------------
+
+init_per_suite(Config) ->
+ rabbit_ct_helpers:log_environment(),
+ rabbit_ct_helpers:run_setup_steps(Config).
+
+
+end_per_suite(Config) ->
+ rabbit_ct_helpers:run_teardown_steps(Config).
+
+init_per_testcase(Testcase, Config) ->
+ rabbit_ct_helpers:testcase_started(Config, Testcase),
+ Config1 = rabbit_ct_helpers:set_config(Config, [
+ {rmq_nodename_suffix, Testcase},
+ {rmq_nodes_count, 1}
+ ]),
+ rabbit_ct_helpers:run_steps(Config1,
+ rabbit_ct_broker_helpers:setup_steps() ++
+ rabbit_ct_client_helpers:setup_steps()).
+
+end_per_testcase(Testcase, Config) ->
+ Config1 = rabbit_ct_helpers:run_steps(Config,
+ rabbit_ct_client_helpers:teardown_steps() ++
+ rabbit_ct_broker_helpers:teardown_steps()),
+ rabbit_ct_helpers:testcase_finished(Config1, Testcase).
+
+%% -------------------------------------------------------------------
+%% Testcases.
+%% -------------------------------------------------------------------
+
+test_limits(Config) ->
+ rabbit_ct_broker_helpers:rpc(Config, 0, ?MODULE,
+ test_limits1, [Config]).
+
+test_limits1(_Config) ->
+ dummy_runtime_parameters:register(),
+ application:set_env(rabbit, runtime_parameters, [{limits, [{<<"test">>, 1}]}]),
+ E = {error_string, "Validation failed\n\ncomponent test is limited to 1 per node\n"},
+ ok = rabbit_runtime_parameters:set_any(<<"/">>, <<"test">>, <<"good">>, <<"">>, none),
+ E = rabbit_runtime_parameters:set_any(<<"/">>, <<"test">>, <<"good">>, <<"">>, none),
+ dummy_runtime_parameters:unregister().