Skip to content

Commit 8121d55

Browse files
committed
HTTP API: DELETE /api/queues/{vhost}/{name} use internal API call
A direct client operation fails if the queue is exclusive. This API should behave like the rabbitmqctl that can delete the queue even in that case
1 parent 4eba619 commit 8121d55

File tree

3 files changed

+28
-12
lines changed

3 files changed

+28
-12
lines changed

deps/rabbit/src/rabbit_amqqueue.erl

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1603,7 +1603,12 @@ delete_immediately_by_resource(Resources) ->
16031603
rabbit_types:error('not_empty') |
16041604
{protocol_error, Type :: atom(), Reason :: string(), Args :: term()}.
16051605
delete(Q, IfUnused, IfEmpty, ActingUser) ->
1606-
rabbit_queue_type:delete(Q, IfUnused, IfEmpty, ActingUser).
1606+
rabbit_log:warning("TRACE delete queue ~p~n before ~p~n",
1607+
[amqqueue:get_name(Q), list()]),
1608+
Ret = rabbit_queue_type:delete(Q, IfUnused, IfEmpty, ActingUser),
1609+
rabbit_log:warning("TRACE delete queue ~p~n after ~p~n",
1610+
[amqqueue:get_name(Q), list()]),
1611+
Ret.
16071612

16081613
-spec delete_with(amqqueue:amqqueue() | name(), boolean(), boolean(), rabbit_types:username()) ->
16091614
rabbit_types:ok(integer()) | rabbit_misc:channel_or_connection_exit().

deps/rabbitmq_management/src/rabbit_mgmt_wm_queue.erl

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -71,18 +71,31 @@ accept_content(ReqData, Context) ->
7171
rabbit_mgmt_util:bad_request(iolist_to_binary(io_lib:format(F ++ "~n", A)), ReqData, Context)
7272
end.
7373

74-
delete_resource(ReqData, Context) ->
74+
delete_resource(ReqData, Context = #context{user = #user{username = ActingUser}}) ->
7575
%% We need to retrieve manually if-unused and if-empty, as the HTTP API uses '-'
7676
%% while the record uses '_'
7777
IfUnused = <<"true">> =:= rabbit_mgmt_util:qs_val(<<"if-unused">>, ReqData),
7878
IfEmpty = <<"true">> =:= rabbit_mgmt_util:qs_val(<<"if-empty">>, ReqData),
79-
Name = rabbit_mgmt_util:id(queue, ReqData),
80-
rabbit_mgmt_util:direct_request(
81-
'queue.delete',
82-
fun rabbit_mgmt_format:format_accept_content/1,
83-
[{queue, Name},
84-
{if_unused, IfUnused},
85-
{if_empty, IfEmpty}], "Delete queue error: ~ts", ReqData, Context).
79+
VHost = rabbit_mgmt_util:id(vhost, ReqData),
80+
QName = rabbit_mgmt_util:id(queue, ReqData),
81+
Name = rabbit_misc:r(VHost, queue, QName),
82+
case rabbit_amqqueue:lookup(Name) of
83+
{ok, Q} ->
84+
case rabbit_amqqueue:delete(Q, IfUnused, IfEmpty, ActingUser) of
85+
{ok, _} ->
86+
{true, ReqData, Context};
87+
{error, not_empty} ->
88+
Explanation = io_lib:format("~ts not empty", [rabbit_misc:rs(Name)]),
89+
rabbit_log:warning("Delete queue error: ~ts", [Explanation]),
90+
rabbit_mgmt_util:bad_request(list_to_binary(Explanation), ReqData, Context);
91+
{error, in_use} ->
92+
Explanation = io_lib:format("~ts in use", [rabbit_misc:rs(Name)]),
93+
rabbit_log:warning("Delete queue error: ~ts", [Explanation]),
94+
rabbit_mgmt_util:bad_request(list_to_binary(Explanation), ReqData, Context)
95+
end;
96+
{error, not_found} ->
97+
{true, ReqData, Context}
98+
end.
8699

87100
is_authorized(ReqData, Context) ->
88101
rabbit_mgmt_util:is_authorized_vhost(ReqData, Context).

deps/rabbitmq_management/test/rabbit_mgmt_http_SUITE.erl

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1993,9 +1993,7 @@ queue_purge_test(Config) ->
19931993
http_delete(Config, "/queues/%2F/myqueue/contents", {group, '2xx'}),
19941994
http_delete(Config, "/queues/%2F/badqueue/contents", ?NOT_FOUND),
19951995
http_delete(Config, "/queues/%2F/exclusive/contents", ?BAD_REQUEST),
1996-
http_delete(Config, "/queues/%2F/exclusive", ?BAD_REQUEST),
1997-
#'basic.get_empty'{} =
1998-
amqp_channel:call(Ch, #'basic.get'{queue = <<"myqueue">>}),
1996+
http_delete(Config, "/queues/%2F/exclusive", {group, '2xx'}),
19991997
close_channel(Ch),
20001998
close_connection(Conn),
20011999
http_delete(Config, "/queues/%2F/myqueue", {group, '2xx'}),

0 commit comments

Comments
 (0)