diff --git a/deps/rabbit/priv/schema/rabbit.schema b/deps/rabbit/priv/schema/rabbit.schema index f5b79370fcd6..03ae255344cb 100644 --- a/deps/rabbit/priv/schema/rabbit.schema +++ b/deps/rabbit/priv/schema/rabbit.schema @@ -2592,7 +2592,10 @@ fun(Conf) -> end end}. - +%% Enable or disable local random exchange +{mapping, "exchange_types.local_random.enabled", "rabbit.local_random_exchange_enabled", [ + {datatype, {enum, [true, false]}} +]}. %% %% Backing queue version diff --git a/deps/rabbit/src/rabbit_exchange_type_local_random.erl b/deps/rabbit/src/rabbit_exchange_type_local_random.erl index db9b37475fdc..323216a84e27 100644 --- a/deps/rabbit/src/rabbit_exchange_type_local_random.erl +++ b/deps/rabbit/src/rabbit_exchange_type_local_random.erl @@ -60,11 +60,19 @@ serialise_events() -> false. validate(_X) -> case rabbit_feature_flags:is_enabled(?MODULE) of true -> - ok; + case application:get_env(rabbit, local_random_exchange_enabled, true) of + true -> + ok; + false -> + rabbit_misc:protocol_error( + precondition_failed, + "x-local-random exchange is disabled by configuration", [], + 'exchange.declare') + end; false -> - rabbit_misc:amqp_error( + rabbit_misc:protocol_error( precondition_failed, - "x-local-random exchange feature not available", [], + "x-local-random exchange feature flag is disabled", [], 'exchange.declare') end. diff --git a/deps/rabbit/test/rabbit_local_random_exchange_SUITE.erl b/deps/rabbit/test/rabbit_local_random_exchange_SUITE.erl index a51eec8797a4..cf728690eb6e 100644 --- a/deps/rabbit/test/rabbit_local_random_exchange_SUITE.erl +++ b/deps/rabbit/test/rabbit_local_random_exchange_SUITE.erl @@ -21,7 +21,8 @@ groups() -> [ {non_parallel_tests, [], [ routed_to_one_local_queue_test, - no_route + no_route, + disable_local_random_exchange_config_test ]} ]. @@ -196,6 +197,30 @@ make_queue_name(Config, Node) -> B = rabbit_ct_helpers:get_config(Config, test_resource_name), erlang:list_to_binary("q-" ++ B ++ "-" ++ integer_to_list(Node)). +disable_local_random_exchange_config_test(Config) -> + E = make_exchange_name(Config, "config-test"), + + %% Disable the config flag + rabbit_ct_broker_helpers:rpc(Config, 0, application, set_env, + [rabbit, local_random_exchange_enabled, false]), + + %% Try to create exchange - should fail + ?assertExit({{shutdown, {server_initiated_close, 406, _}}, _}, + declare_exchange(Config, E)), + + %% Re-enable the config flag + rabbit_ct_broker_helpers:rpc(Config, 0, application, set_env, + [rabbit, local_random_exchange_enabled, true]), + + %% Now exchange creation should succeed + declare_exchange(Config, E), + + %% Clean up + run_on_node(Config, 0, + fun(Chan) -> + amqp_channel:call(Chan, #'exchange.delete'{exchange = E}) + end). + flush(T) -> receive X -> ct:pal("flushed ~p", [X]),