@@ -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
8695accept_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,48 @@ 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+ DQT = rabbit_queue_type :short_alias_of (rabbit_vhost :default_queue_type (VHostName )),
136+ % % note: the type changes to a map
137+ VHost1 = rabbit_queue_type :inject_dqt (VHost ),
138+ Metadata = maps :get (metadata , VHost1 ),
139+
140+ TopLevelDefsAndMetadata = [
141+ {rabbit_version , rabbit_data_coercion :to_binary (Vsn )},
142+ {rabbitmq_version , rabbit_data_coercion :to_binary (Vsn )},
143+ {product_name , rabbit_data_coercion :to_binary (ProductName )},
144+ {product_version , rabbit_data_coercion :to_binary (ProductVersion )},
145+ {rabbitmq_definition_format , <<" single_virtual_host" >>},
146+ {original_vhost_name , VHostName },
147+ {explanation , rabbit_data_coercion :to_binary (io_lib :format (" Definitions of virtual host '~ts '" , [VHostName ]))},
148+ {metadata , Metadata },
149+ {description , vhost :get_description (VHost )},
150+ {default_queue_type , DQT },
151+ {limits , vhost :get_limits (VHost )}
152+ ],
153+ Result = TopLevelDefsAndMetadata ++ retain_whitelisted (Contents ),
154+
155+ ReqData1 = case rabbit_mgmt_util :qs_val (<<" download" >>, ReqData ) of
156+ undefined -> ReqData ;
157+ Filename ->
158+ HeaderVal = " attachment; filename=" ++ binary_to_list (Filename ),
159+ rabbit_mgmt_util :set_resp_header (<<" Content-Disposition" >>, HeaderVal , ReqData )
160+ end ,
161+ rabbit_mgmt_util :reply (Result , ReqData1 , Context ).
127162
128163accept_multipart (ReqData0 , Context ) ->
129164 {Parts , ReqData } = get_all_parts (ReqData0 ),
@@ -271,7 +306,12 @@ retain_whitelisted(Items) ->
271306retain_whitelisted_items (Name , List , Allowed ) ->
272307 {Name , [only_whitelisted_for_item (I , Allowed ) || I <- List ]}.
273308
274- only_whitelisted_for_item (Item , Allowed ) ->
309+ only_whitelisted_for_item (Item , Allowed ) when is_map (Item ) ->
310+ Map1 = maps :with (Allowed , Item ),
311+ maps :filter (fun (_Key , Val ) ->
312+ Val =/= undefined
313+ end , Map1 );
314+ only_whitelisted_for_item (Item , Allowed ) when is_list (Item ) ->
275315 [{K , Fact } || {K , Fact } <- Item , lists :member (K , Allowed ), Fact =/= undefined ].
276316
277317strip_vhost (Item ) ->
0 commit comments