An alternative to #10415, closes #10330

Per discussion in #10415, this introduces a new module,
rabbit_mgmt_nodes, which provides a couple of helpers
that can be used to implement Cowboy REST's
resource_exists/2 in the modules that return
information about cluster members.

(cherry picked from commit 0c0e2ca932)
This commit is contained in:
Michael Klishin 2024-01-25 18:41:56 -05:00 committed by Mergify
parent 0e69c417f1
commit 73188f4a26
8 changed files with 46 additions and 18 deletions

View File

@ -29,6 +29,7 @@ def all_beam_files(name = "all_beam_files"):
"src/rabbit_mgmt_hsts.erl",
"src/rabbit_mgmt_load_definitions.erl",
"src/rabbit_mgmt_login.erl",
"src/rabbit_mgmt_nodes.erl",
"src/rabbit_mgmt_oauth_bootstrap.erl",
"src/rabbit_mgmt_reset_handler.erl",
"src/rabbit_mgmt_stats.erl",
@ -159,6 +160,7 @@ def all_test_beam_files(name = "all_test_beam_files"):
"src/rabbit_mgmt_hsts.erl",
"src/rabbit_mgmt_load_definitions.erl",
"src/rabbit_mgmt_login.erl",
"src/rabbit_mgmt_nodes.erl",
"src/rabbit_mgmt_oauth_bootstrap.erl",
"src/rabbit_mgmt_reset_handler.erl",
"src/rabbit_mgmt_stats.erl",
@ -378,6 +380,7 @@ def all_srcs(name = "all_srcs"):
"src/rabbit_mgmt_hsts.erl",
"src/rabbit_mgmt_load_definitions.erl",
"src/rabbit_mgmt_login.erl",
"src/rabbit_mgmt_nodes.erl",
"src/rabbit_mgmt_oauth_bootstrap.erl",
"src/rabbit_mgmt_reset_handler.erl",
"src/rabbit_mgmt_stats.erl",

View File

@ -216,10 +216,17 @@ vary: accept, accept-encoding, origin</pre>
<td></td>
<td class="path">/api/nodes/<i>name</i></td>
<td>
An individual node in the RabbitMQ cluster. Add
"?memory=true" to get memory statistics, and "?binary=true"
to get a breakdown of binary memory use (may be expensive if
there are many small binaries in the system).
Returns information about an individual node in the RabbitMQ cluster.
</td>
</tr>
<tr>
<td>X</td>
<td></td>
<td></td>
<td></td>
<td class="path">/api/nodes/<i>name</i>/memory</td>
<td>
Returns a <a href="https://rabbitmq.com/memory-use.html">memory usage breakdown</a> of an individual node in the RabbitMQ cluster.
</td>
</tr>
<tr>

View File

@ -0,0 +1,26 @@
%% 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) 2007-2024 Broadcom. All Rights Reserved. The term Broadcom refers to Broadcom Inc. and/or its subsidiaries. All rights reserved.
%%
-module(rabbit_mgmt_nodes).
-export([
node_name_from_req/1,
node_exists/1
]).
%%
%% API
%%
node_name_from_req(ReqData) ->
list_to_atom(binary_to_list(rabbit_mgmt_util:id(node, ReqData))).
%% To be used in resource_exists/2
node_exists(ReqData) ->
Node = node_name_from_req(ReqData),
AllNodes = rabbit_nodes:list_members(),
lists:member(Node, AllNodes).

View File

@ -26,10 +26,7 @@ content_types_provided(ReqData, Context) ->
{rabbit_mgmt_util:responder_map(to_json), ReqData, Context}.
resource_exists(ReqData, Context) ->
{case node0(ReqData) of
not_found -> false;
_ -> true
end, ReqData, Context}.
{rabbit_mgmt_nodes:node_exists(ReqData), ReqData, Context}.
to_json(ReqData, Context) ->
rabbit_mgmt_util:reply(node0(ReqData), ReqData, Context).

View File

@ -26,7 +26,7 @@ content_types_provided(ReqData, Context) ->
{rabbit_mgmt_util:responder_map(to_json), ReqData, Context}.
resource_exists(ReqData, Context) ->
{node_exists(ReqData, get_node(ReqData)), ReqData, Context}.
{rabbit_mgmt_nodes:node_exists(ReqData), ReqData, Context}.
to_json(ReqData, {Mode, Context}) ->
rabbit_mgmt_util:reply(augment(Mode, ReqData), ReqData, {Mode, Context}).
@ -39,16 +39,9 @@ is_authorized(ReqData, {Mode, Context}) ->
get_node(ReqData) ->
list_to_atom(binary_to_list(rabbit_mgmt_util:id(node, ReqData))).
node_exists(ReqData, Node) ->
case [N || N <- rabbit_mgmt_wm_nodes:all_nodes(ReqData),
proplists:get_value(name, N) == Node] of
[] -> false;
[_] -> true
end.
augment(Mode, ReqData) ->
Node = get_node(ReqData),
case node_exists(ReqData, Node) of
case rabbit_mgmt_nodes:node_exists(ReqData) of
false ->
not_found;
true ->

View File

@ -26,7 +26,7 @@ content_types_provided(ReqData, Context) ->
{rabbit_mgmt_util:responder_map(to_json), ReqData, Context}.
resource_exists(ReqData, Context) ->
{node_exists(ReqData, get_node(ReqData)), ReqData, Context}.
{rabbit_mgmt_nodes:node_exists(ReqData), ReqData, Context}.
to_json(ReqData, {Mode, Context}) ->
rabbit_mgmt_util:reply(augment(Mode, ReqData), ReqData, {Mode, Context}).

View File

@ -322,6 +322,7 @@ nodes_test(Config) ->
assert_list([DiscNode], http_get(Config, "/nodes")),
assert_list([DiscNode], http_get(Config, "/nodes", "monitor", "monitor", ?OK)),
http_get(Config, "/nodes", "user", "user", ?NOT_AUTHORISED),
http_get(Config, "/nodes/does-not-exist", ?NOT_FOUND),
[Node] = http_get(Config, "/nodes"),
Path = "/nodes/" ++ binary_to_list(maps:get(name, Node)),
assert_item(DiscNode, http_get(Config, Path, ?OK)),

View File

@ -848,6 +848,7 @@ rabbitmq_management:
- rabbit_mgmt_hsts
- rabbit_mgmt_load_definitions
- rabbit_mgmt_login
- rabbit_mgmt_nodes
- rabbit_mgmt_oauth_bootstrap
- rabbit_mgmt_reset_handler
- rabbit_mgmt_stats