From 9c4cbf2903eaea1f404f3e1a41c6ccffcfbd3753 Mon Sep 17 00:00:00 2001 From: bas0N Date: Mon, 1 Dec 2025 21:14:43 +0100 Subject: [PATCH] Fix empty state field in /api/deprecated-features/used endpoint The /api/deprecated-features/used endpoint was returning an empty state field in the JSON response. This was a regression introduced in #14229, which added the state field to show whether deprecated features are permitted or denied. The issue was that rabbit_depr_ff_extra:cli_info0/1 always tried to extract the state field with a default empty string, even when rabbit_deprecated_features:list(used) doesn't include a state field (unlike list(all) which does). This commit fixes the issue by only including the state field when it exists in the feature properties, using maps:find/2 and maps:merge/2 to conditionally add it. The fix ensures that: - /api/deprecated-features returns state field with valid values - /api/deprecated-features/used omits the state field entirely Tests are updated to verify this behavior. GitHub issue: #14340 (cherry picked from commit d2a3a60cd15987b59ab5cfe2af0fff6d1259b4ca) --- deps/rabbit/src/rabbit_depr_ff_extra.erl | 17 ++++++++++------- .../test/rabbit_mgmt_http_SUITE.erl | 7 +++++-- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/deps/rabbit/src/rabbit_depr_ff_extra.erl b/deps/rabbit/src/rabbit_depr_ff_extra.erl index 237d019449c4..2758115e14ff 100644 --- a/deps/rabbit/src/rabbit_depr_ff_extra.erl +++ b/deps/rabbit/src/rabbit_depr_ff_extra.erl @@ -58,14 +58,17 @@ cli_info0(DeprecatedFeature) -> App = maps:get(provided_by, FeatureProps), DeprecationPhase = maps:get(deprecation_phase, FeatureProps, ""), - State = maps:get(state, FeatureProps, ""), Desc = maps:get(desc, FeatureProps, ""), DocUrl = maps:get(doc_url, FeatureProps, ""), - Info = #{name => FeatureName, - desc => unicode:characters_to_binary(Desc), - deprecation_phase => DeprecationPhase, - state => State, - doc_url => unicode:characters_to_binary(DocUrl), - provided_by => App}, + BaseInfo = #{name => FeatureName, + desc => unicode:characters_to_binary(Desc), + deprecation_phase => DeprecationPhase, + doc_url => unicode:characters_to_binary(DocUrl), + provided_by => App}, + Info = maps:merge(BaseInfo, + case maps:find(state, FeatureProps) of + {ok, State} -> #{state => State}; + error -> #{} + end), [Info | Acc] end, [], lists:sort(maps:keys(DeprecatedFeature))). diff --git a/deps/rabbitmq_management/test/rabbit_mgmt_http_SUITE.erl b/deps/rabbitmq_management/test/rabbit_mgmt_http_SUITE.erl index af720ee4f783..9c9079ea4384 100644 --- a/deps/rabbitmq_management/test/rabbit_mgmt_http_SUITE.erl +++ b/deps/rabbitmq_management/test/rabbit_mgmt_http_SUITE.erl @@ -4228,7 +4228,9 @@ list_deprecated_features_test(Config) -> ?assertEqual(<<"permitted_by_default">>, maps:get(deprecation_phase, Feature)), ?assertEqual(atom_to_binary(?MODULE), maps:get(provided_by, Feature)), ?assertEqual(list_to_binary(Desc), maps:get(desc, Feature)), - ?assertEqual(list_to_binary(DocUrl), maps:get(doc_url, Feature)). + ?assertEqual(list_to_binary(DocUrl), maps:get(doc_url, Feature)), + ?assert(maps:is_key(state, Feature)), + ?assert(lists:member(maps:get(state, Feature), [<<"permitted">>, <<"denied">>])). list_used_deprecated_features_test(Config) -> Desc = "This is a deprecated feature in use", @@ -4249,7 +4251,8 @@ list_used_deprecated_features_test(Config) -> ?assertEqual(<<"removed">>, maps:get(deprecation_phase, Feature)), ?assertEqual(atom_to_binary(?MODULE), maps:get(provided_by, Feature)), ?assertEqual(list_to_binary(Desc), maps:get(desc, Feature)), - ?assertEqual(list_to_binary(DocUrl), maps:get(doc_url, Feature)). + ?assertEqual(list_to_binary(DocUrl), maps:get(doc_url, Feature)), + ?assertNot(maps:is_key(state, Feature)). cluster_and_node_tags_test(Config) -> Overview = http_get(Config, "/overview"),