Skip to content

Commit 48a1660

Browse files
Rework virtual host-specific definition export
1. Add more metadata, see #12835 2. Include DQT Closes #12835
1 parent 3e9c6a9 commit 48a1660

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() ->
@@ -2087,7 +2088,7 @@ long_definitions_vhosts(long_definitions_multipart_test) ->
20872088
definitions_vhost_metadata_test(Config) ->
20882089
register_parameters_and_policy_validator(Config),
20892090

2090-
VHostName = <<"definitions-vhost-metadata-test">>,
2091+
VHostName = rabbit_data_coercion:to_binary(?FUNCTION_NAME),
20912092
Desc = <<"Created by definitions_vhost_metadata_test">>,
20922093
DQT = <<"quorum">>,
20932094
Tags = [<<"one">>, <<"tag-two">>],
@@ -2098,19 +2099,19 @@ definitions_vhost_metadata_test(Config) ->
20982099
},
20992100

21002101
%% Create a test vhost
2101-
http_put(Config, "/vhosts/definitions-vhost-metadata-test", Metadata, {group, '2xx'}),
2102+
http_put(Config, io_lib:format("/vhosts/~ts", [VHostName]), Metadata, {group, '2xx'}),
21022103
PermArgs = [{configure, <<".*">>}, {write, <<".*">>}, {read, <<".*">>}],
2103-
http_put(Config, "/permissions/definitions-vhost-metadata-test/guest", PermArgs, {group, '2xx'}),
2104+
http_put(Config, io_lib:format("/permissions/~ts/guest", [VHostName]), PermArgs, {group, '2xx'}),
21042105

21052106
%% Get the definitions
21062107
Definitions = http_get(Config, "/definitions", ?OK),
2108+
ct:pal("Exported definitions:~n~tp~tn", [Definitions]),
21072109

21082110
%% Check if vhost definition is correct
21092111
VHosts = maps:get(vhosts, Definitions),
21102112
{value, VH} = lists:search(fun(VH) ->
21112113
maps:get(name, VH) =:= VHostName
21122114
end, VHosts),
2113-
ct:pal("VHost: ~p", [VH]),
21142115
?assertEqual(#{
21152116
name => VHostName,
21162117
description => Desc,
@@ -2123,7 +2124,41 @@ definitions_vhost_metadata_test(Config) ->
21232124
http_post(Config, "/definitions", Definitions, {group, '2xx'}),
21242125

21252126
%% Remove the test vhost
2126-
http_delete(Config, "/vhosts/definitions-vhost-metadata-test", {group, '2xx'}),
2127+
http_delete(Config, io_lib:format("/vhosts/~ts", [VHostName]), {group, '2xx'}),
2128+
ok.
2129+
2130+
definitions_file_metadata_test(Config) ->
2131+
register_parameters_and_policy_validator(Config),
2132+
2133+
VHostName = rabbit_data_coercion:to_binary(?FUNCTION_NAME),
2134+
Desc = <<"Created by definitions_vhost_metadata_test">>,
2135+
DQT = <<"quorum">>,
2136+
Tags = [<<"tag-one">>, <<"tag-two">>],
2137+
Metadata = #{
2138+
description => Desc,
2139+
default_queue_type => DQT,
2140+
tags => Tags
2141+
},
2142+
2143+
http_put(Config, io_lib:format("/vhosts/~ts", [VHostName]), Metadata, {group, '2xx'}),
2144+
PermArgs = [{configure, <<".*">>}, {write, <<".*">>}, {read, <<".*">>}],
2145+
http_put(Config, io_lib:format("/permissions/~ts/guest", [VHostName]), PermArgs, {group, '2xx'}),
2146+
2147+
AllDefinitions = http_get(Config, "/definitions", ?OK),
2148+
%% verify definitions file metadata
2149+
?assertEqual(<<"cluster">>, maps:get(rabbitmq_definition_format, AllDefinitions)),
2150+
?assert(is_binary(maps:get(original_cluster_name, AllDefinitions))),
2151+
2152+
%% Post the definitions back
2153+
http_post(Config, "/definitions", AllDefinitions, {group, '2xx'}),
2154+
2155+
VHDefinitions = http_get(Config, io_lib:format("/definitions/~ts", [VHostName]), ?OK),
2156+
%% verify definitions file metadata
2157+
?assertEqual(<<"single_virtual_host">>, maps:get(rabbitmq_definition_format, VHDefinitions)),
2158+
?assertEqual(VHostName, (maps:get(original_vhost_name, VHDefinitions))),
2159+
2160+
%% Remove the test vhost
2161+
http_delete(Config, io_lib:format("/vhosts/~ts", [VHostName]), {group, '2xx'}),
21272162
ok.
21282163

21292164
definitions_default_queue_type_test(Config) ->

0 commit comments

Comments
 (0)