Skip to content

Commit 204ac01

Browse files
michaelklishinmergify[bot]
authored andcommitted
Rework virtual host-specific definition export
1. Add more metadata, see #12835 2. Include DQT Closes #12835 (cherry picked from commit 48a1660)
1 parent 8c0e23b commit 204ac01

File tree

2 files changed

+111
-48
lines changed

2 files changed

+111
-48
lines changed

deps/rabbitmq_management/src/rabbit_mgmt_wm_definitions.erl

Lines changed: 70 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -58,30 +58,39 @@ all_definitions(ReqData, Context) ->
5858
Vsn = rabbit:base_product_version(),
5959
ProductName = rabbit:product_name(),
6060
ProductVersion = rabbit:product_version(),
61-
rabbit_mgmt_util:reply(
62-
[{rabbit_version, rabbit_data_coercion:to_binary(Vsn)},
63-
{rabbitmq_version, rabbit_data_coercion:to_binary(Vsn)},
64-
{product_name, rabbit_data_coercion:to_binary(ProductName)},
65-
{product_version, rabbit_data_coercion:to_binary(ProductVersion)}] ++
66-
retain_whitelisted(
67-
[{users, rabbit_mgmt_wm_users:users(all)},
68-
{vhosts, rabbit_mgmt_wm_vhosts:basic()},
69-
{permissions, rabbit_mgmt_wm_permissions:permissions()},
70-
{topic_permissions, rabbit_mgmt_wm_topic_permissions:topic_permissions()},
71-
{parameters, rabbit_mgmt_wm_parameters:basic(ReqData)},
72-
{global_parameters, rabbit_mgmt_wm_global_parameters:basic()},
73-
{policies, rabbit_mgmt_wm_policies:basic(ReqData)},
74-
{queues, Qs},
75-
{exchanges, Xs},
76-
{bindings, Bs}]),
77-
case rabbit_mgmt_util:qs_val(<<"download">>, ReqData) of
78-
undefined -> ReqData;
79-
Filename -> rabbit_mgmt_util:set_resp_header(
80-
<<"Content-Disposition">>,
81-
"attachment; filename=" ++
82-
binary_to_list(Filename), ReqData)
83-
end,
84-
Context).
61+
62+
Contents = [
63+
{users, rabbit_mgmt_wm_users:users(all)},
64+
{vhosts, rabbit_mgmt_wm_vhosts:basic()},
65+
{permissions, rabbit_mgmt_wm_permissions:permissions()},
66+
{topic_permissions, rabbit_mgmt_wm_topic_permissions:topic_permissions()},
67+
{parameters, rabbit_mgmt_wm_parameters:basic(ReqData)},
68+
{global_parameters, rabbit_mgmt_wm_global_parameters:basic()},
69+
{policies, rabbit_mgmt_wm_policies:basic(ReqData)},
70+
{queues, Qs},
71+
{exchanges, Xs},
72+
{bindings, Bs}
73+
],
74+
75+
TopLevelDefsAndMetadata = [
76+
{rabbit_version, rabbit_data_coercion:to_binary(Vsn)},
77+
{rabbitmq_version, rabbit_data_coercion:to_binary(Vsn)},
78+
{product_name, rabbit_data_coercion:to_binary(ProductName)},
79+
{product_version, rabbit_data_coercion:to_binary(ProductVersion)},
80+
{rabbitmq_definition_format, <<"cluster">>},
81+
{original_cluster_name, rabbit_nodes:cluster_name()},
82+
{explanation, rabbit_data_coercion:to_binary(io_lib:format("Definitions of cluster '~ts'", [rabbit_nodes:cluster_name()]))}
83+
],
84+
Result = TopLevelDefsAndMetadata ++ retain_whitelisted(Contents),
85+
ReqData1 = case rabbit_mgmt_util:qs_val(<<"download">>, ReqData) of
86+
undefined -> ReqData;
87+
Filename -> rabbit_mgmt_util:set_resp_header(
88+
<<"Content-Disposition">>,
89+
"attachment; filename=" ++
90+
binary_to_list(Filename), ReqData)
91+
end,
92+
93+
rabbit_mgmt_util:reply(Result, ReqData1, Context).
8594

8695
accept_json(ReqData0, Context) ->
8796
BodySizeLimit = application:get_env(rabbitmq_management, max_http_body_size, ?MANAGEMENT_DEFAULT_HTTP_MAX_BODY_SIZE),
@@ -94,7 +103,10 @@ accept_json(ReqData0, Context) ->
94103
accept(Body, ReqData, Context)
95104
end.
96105

97-
vhost_definitions(ReqData, VHost, Context) ->
106+
vhost_definitions(ReqData, VHostName, Context) ->
107+
%% the existence of this virtual host is verified in the called, 'to_json/2'
108+
VHost = rabbit_vhost:lookup(VHostName),
109+
98110
%% rabbit_mgmt_wm_<>:basic/1 filters by VHost if it is available.
99111
%% TODO: should we stop stripping virtual host? Such files cannot be imported on boot, for example.
100112
Xs = [strip_vhost(X) || X <- rabbit_mgmt_wm_exchanges:basic(ReqData),
@@ -105,25 +117,41 @@ vhost_definitions(ReqData, VHost, Context) ->
105117
%% TODO: should we stop stripping virtual host? Such files cannot be imported on boot, for example.
106118
Bs = [strip_vhost(B) || B <- rabbit_mgmt_wm_bindings:basic(ReqData),
107119
export_binding(B, QNames)],
108-
{ok, Vsn} = application:get_key(rabbit, vsn),
109120
Parameters = [strip_vhost(
110121
rabbit_mgmt_format:parameter(P))
111-
|| P <- rabbit_runtime_parameters:list(VHost)],
112-
rabbit_mgmt_util:reply(
113-
[{rabbit_version, rabbit_data_coercion:to_binary(Vsn)}] ++
114-
retain_whitelisted(
115-
[{parameters, Parameters},
116-
{policies, [strip_vhost(P) || P <- rabbit_mgmt_wm_policies:basic(ReqData)]},
117-
{queues, Qs},
118-
{exchanges, Xs},
119-
{bindings, Bs}]),
120-
case rabbit_mgmt_util:qs_val(<<"download">>, ReqData) of
121-
undefined -> ReqData;
122-
Filename ->
123-
HeaderVal = "attachment; filename=" ++ binary_to_list(Filename),
124-
rabbit_mgmt_util:set_resp_header(<<"Content-Disposition">>, HeaderVal, ReqData)
125-
end,
126-
Context).
122+
|| P <- rabbit_runtime_parameters:list(VHostName)],
123+
Contents = [
124+
{parameters, Parameters},
125+
{policies, [strip_vhost(P) || P <- rabbit_mgmt_wm_policies:basic(ReqData)]},
126+
{queues, Qs},
127+
{exchanges, Xs},
128+
{bindings, Bs}
129+
],
130+
131+
Vsn = rabbit:base_product_version(),
132+
ProductName = rabbit:product_name(),
133+
ProductVersion = rabbit:product_version(),
134+
135+
TopLevelDefsAndMetadata = [
136+
{rabbit_version, rabbit_data_coercion:to_binary(Vsn)},
137+
{rabbitmq_version, rabbit_data_coercion:to_binary(Vsn)},
138+
{product_name, rabbit_data_coercion:to_binary(ProductName)},
139+
{product_version, rabbit_data_coercion:to_binary(ProductVersion)},
140+
{rabbitmq_definition_format, <<"single_virtual_host">>},
141+
{original_vhost_name, VHostName},
142+
{explanation, rabbit_data_coercion:to_binary(io_lib:format("Definitions of virtual host '~ts'", [VHostName]))},
143+
{description, vhost:get_description(VHost)},
144+
{default_queue_type, rabbit_queue_type:short_alias_of(rabbit_vhost:default_queue_type(VHostName))}
145+
],
146+
Result = TopLevelDefsAndMetadata ++ retain_whitelisted(Contents),
147+
148+
ReqData1 = case rabbit_mgmt_util:qs_val(<<"download">>, ReqData) of
149+
undefined -> ReqData;
150+
Filename ->
151+
HeaderVal = "attachment; filename=" ++ binary_to_list(Filename),
152+
rabbit_mgmt_util:set_resp_header(<<"Content-Disposition">>, HeaderVal, ReqData)
153+
end,
154+
rabbit_mgmt_util:reply(Result, ReqData1, Context).
127155

128156
accept_multipart(ReqData0, Context) ->
129157
{Parts, ReqData} = get_all_parts(ReqData0),

deps/rabbitmq_management/test/rabbit_mgmt_http_SUITE.erl

Lines changed: 41 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,8 @@ definitions_group1_tests() ->
9292
definitions_group2_tests() ->
9393
[
9494
definitions_default_queue_type_test,
95-
definitions_vhost_metadata_test
95+
definitions_vhost_metadata_test,
96+
definitions_file_metadata_test
9697
].
9798

9899
definitions_group3_tests() ->
@@ -1940,7 +1941,7 @@ long_definitions_vhosts(long_definitions_multipart_test) ->
19401941
definitions_vhost_metadata_test(Config) ->
19411942
register_parameters_and_policy_validator(Config),
19421943

1943-
VHostName = <<"definitions-vhost-metadata-test">>,
1944+
VHostName = rabbit_data_coercion:to_binary(?FUNCTION_NAME),
19441945
Desc = <<"Created by definitions_vhost_metadata_test">>,
19451946
DQT = <<"quorum">>,
19461947
Tags = [<<"one">>, <<"tag-two">>],
@@ -1951,19 +1952,19 @@ definitions_vhost_metadata_test(Config) ->
19511952
},
19521953

19531954
%% Create a test vhost
1954-
http_put(Config, "/vhosts/definitions-vhost-metadata-test", Metadata, {group, '2xx'}),
1955+
http_put(Config, io_lib:format("/vhosts/~ts", [VHostName]), Metadata, {group, '2xx'}),
19551956
PermArgs = [{configure, <<".*">>}, {write, <<".*">>}, {read, <<".*">>}],
1956-
http_put(Config, "/permissions/definitions-vhost-metadata-test/guest", PermArgs, {group, '2xx'}),
1957+
http_put(Config, io_lib:format("/permissions/~ts/guest", [VHostName]), PermArgs, {group, '2xx'}),
19571958

19581959
%% Get the definitions
19591960
Definitions = http_get(Config, "/definitions", ?OK),
1961+
ct:pal("Exported definitions:~n~tp~tn", [Definitions]),
19601962

19611963
%% Check if vhost definition is correct
19621964
VHosts = maps:get(vhosts, Definitions),
19631965
{value, VH} = lists:search(fun(VH) ->
19641966
maps:get(name, VH) =:= VHostName
19651967
end, VHosts),
1966-
ct:pal("VHost: ~p", [VH]),
19671968
?assertEqual(#{
19681969
name => VHostName,
19691970
description => Desc,
@@ -1976,7 +1977,41 @@ definitions_vhost_metadata_test(Config) ->
19761977
http_post(Config, "/definitions", Definitions, {group, '2xx'}),
19771978

19781979
%% Remove the test vhost
1979-
http_delete(Config, "/vhosts/definitions-vhost-metadata-test", {group, '2xx'}),
1980+
http_delete(Config, io_lib:format("/vhosts/~ts", [VHostName]), {group, '2xx'}),
1981+
ok.
1982+
1983+
definitions_file_metadata_test(Config) ->
1984+
register_parameters_and_policy_validator(Config),
1985+
1986+
VHostName = rabbit_data_coercion:to_binary(?FUNCTION_NAME),
1987+
Desc = <<"Created by definitions_vhost_metadata_test">>,
1988+
DQT = <<"quorum">>,
1989+
Tags = [<<"tag-one">>, <<"tag-two">>],
1990+
Metadata = #{
1991+
description => Desc,
1992+
default_queue_type => DQT,
1993+
tags => Tags
1994+
},
1995+
1996+
http_put(Config, io_lib:format("/vhosts/~ts", [VHostName]), Metadata, {group, '2xx'}),
1997+
PermArgs = [{configure, <<".*">>}, {write, <<".*">>}, {read, <<".*">>}],
1998+
http_put(Config, io_lib:format("/permissions/~ts/guest", [VHostName]), PermArgs, {group, '2xx'}),
1999+
2000+
AllDefinitions = http_get(Config, "/definitions", ?OK),
2001+
%% verify definitions file metadata
2002+
?assertEqual(<<"cluster">>, maps:get(rabbitmq_definition_format, AllDefinitions)),
2003+
?assert(is_binary(maps:get(original_cluster_name, AllDefinitions))),
2004+
2005+
%% Post the definitions back
2006+
http_post(Config, "/definitions", AllDefinitions, {group, '2xx'}),
2007+
2008+
VHDefinitions = http_get(Config, io_lib:format("/definitions/~ts", [VHostName]), ?OK),
2009+
%% verify definitions file metadata
2010+
?assertEqual(<<"single_virtual_host">>, maps:get(rabbitmq_definition_format, VHDefinitions)),
2011+
?assertEqual(VHostName, (maps:get(original_vhost_name, VHDefinitions))),
2012+
2013+
%% Remove the test vhost
2014+
http_delete(Config, io_lib:format("/vhosts/~ts", [VHostName]), {group, '2xx'}),
19802015
ok.
19812016

19822017
definitions_default_queue_type_test(Config) ->

0 commit comments

Comments
 (0)