1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
|
## 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-2023 Broadcom. All Rights Reserved. The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. All rights reserved.
defmodule RabbitMQ.CLI.Ctl.Commands.DeleteQueueCommand do
alias RabbitMQ.CLI.Core.DocGuide
@behaviour RabbitMQ.CLI.CommandBehaviour
def switches(), do: [if_empty: :boolean, if_unused: :boolean, timeout: :integer]
def aliases(), do: [e: :if_empty, u: :if_unused, t: :timeout]
def merge_defaults(args, opts) do
{
args,
Map.merge(%{if_empty: false, if_unused: false, vhost: "/"}, opts)
}
end
def validate([], _opts) do
{:validation_failure, :not_enough_args}
end
def validate(args, _opts) when length(args) > 1 do
{:validation_failure, :too_many_args}
end
def validate([""], _opts) do
{
:validation_failure,
{:bad_argument, "queue name cannot be an empty string"}
}
end
def validate([_], _opts) do
:ok
end
## Validate rabbit application is running
use RabbitMQ.CLI.Core.RequiresRabbitAppRunning
def run([qname], %{
node: node,
vhost: vhost,
if_empty: if_empty,
if_unused: if_unused,
timeout: timeout
}) do
## Generate queue resource name from queue name and vhost
queue_resource = :rabbit_misc.r(vhost, :queue, qname)
## Lookup a queue on broker node using resource name
case :rabbit_misc.rpc_call(node, :rabbit_amqqueue, :lookup, [queue_resource]) do
{:ok, queue} ->
## Delete queue
:rabbit_misc.rpc_call(
node,
:rabbit_amqqueue,
:delete_with,
[queue, if_unused, if_empty, "cli_user"],
timeout
)
{:error, _} = error ->
error
end
end
def output({:error, :not_found}, _options) do
{:error, RabbitMQ.CLI.Core.ExitCodes.exit_usage(), "Queue not found"}
end
def output({:error, :not_empty}, _options) do
{:error, RabbitMQ.CLI.Core.ExitCodes.exit_usage(), "Queue is not empty"}
end
def output({:error, :in_use}, _options) do
{:error, RabbitMQ.CLI.Core.ExitCodes.exit_usage(), "Queue is in use"}
end
def output({:ok, qlen}, _options) do
{:ok, "Queue was successfully deleted with #{qlen} ready messages"}
end
## Use default output for all non-special case outputs
use RabbitMQ.CLI.DefaultOutput
def banner([qname], %{vhost: vhost, if_empty: if_empty, if_unused: if_unused}) do
if_empty_str =
case if_empty do
true -> ["if queue is empty "]
false -> []
end
if_unused_str =
case if_unused do
true -> ["if queue is unused "]
false -> []
end
"Deleting queue '#{qname}' on vhost '#{vhost}' " <>
Enum.join(Enum.concat([if_empty_str, if_unused_str]), "and ") <> "..."
end
def usage(), do: "delete_queue [--vhost <vhost>] <queue_name> [--if-empty|-e] [--if-unused|-u]"
def usage_additional() do
[
["--vhost", "Virtual host name"],
["<queue_name>", "name of the queue to delete"],
["--if-empty", "delete the queue if it is empty (has no messages ready for delivery)"],
["--if-unused", "delete the queue only if it has no consumers"]
]
end
def usage_doc_guides() do
[
DocGuide.queues()
]
end
def help_section(), do: :queues
def description(), do: "Deletes a queue"
end
|