diff options
author | Michael Klishin <klishinm@vmware.com> | 2023-04-18 10:37:39 +0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-04-18 10:37:39 +0400 |
commit | 5f342cf4a2d0797e4395562f13f0de913fb6e6f3 (patch) | |
tree | 4b6e293cad863763fbc9867f26e089b6944a24e3 /deps/rabbit | |
parent | 6e6c1581d467848def4950dbbcf2a984b78dfeed (diff) | |
parent | 4c30d9a6b4ed58dbc72efedc9838d4bf24bf782d (diff) | |
download | rabbitmq-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.bazel | 8 | ||||
-rw-r--r-- | deps/rabbit/priv/schema/rabbit.schema | 19 | ||||
-rw-r--r-- | deps/rabbit/src/rabbit_runtime_parameters.erl | 45 | ||||
-rw-r--r-- | deps/rabbit/test/config_schema_SUITE_data/rabbit.snippets | 15 | ||||
-rw-r--r-- | deps/rabbit/test/dummy_runtime_parameters.erl | 6 | ||||
-rw-r--r-- | deps/rabbit/test/runtime_parameters_SUITE.erl | 61 |
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(). |