|
7 | 7 | defmodule RabbitMQ.CLI.Ctl.Commands.EnableFeatureFlagCommand do
|
8 | 8 | @behaviour RabbitMQ.CLI.CommandBehaviour
|
9 | 9 |
|
10 |
| - def merge_defaults(args, opts), do: {args, opts} |
| 10 | + def switches(), do: [experimental: :boolean] |
| 11 | + def aliases(), do: [e: :experimental] |
11 | 12 |
|
12 |
| - def validate([], _), do: {:validation_failure, :not_enough_args} |
13 |
| - def validate([_ | _] = args, _) when length(args) > 1, do: {:validation_failure, :too_many_args} |
| 13 | + def merge_defaults(args, opts), do: { args, Map.merge(%{experimental: false}, opts) } |
14 | 14 |
|
15 |
| - def validate([""], _), |
| 15 | + def validate([], _opts), do: {:validation_failure, :not_enough_args} |
| 16 | + def validate([_ | _] = args, _opts) when length(args) > 1, do: {:validation_failure, :too_many_args} |
| 17 | + |
| 18 | + def validate([""], _opts), |
16 | 19 | do: {:validation_failure, {:bad_argument, "feature_flag cannot be an empty string."}}
|
17 | 20 |
|
18 |
| - def validate([_], _), do: :ok |
| 21 | + def validate([_], _opts), do: :ok |
19 | 22 |
|
20 | 23 | use RabbitMQ.CLI.Core.RequiresRabbitAppRunning
|
21 | 24 |
|
22 |
| - def run(["all"], %{node: node_name}) do |
23 |
| - case :rabbit_misc.rpc_call(node_name, :rabbit_feature_flags, :enable_all, []) do |
24 |
| - # Server does not support feature flags, consider none are available. |
25 |
| - # See rabbitmq/rabbitmq-cli#344 for context. MK. |
26 |
| - {:badrpc, {:EXIT, {:undef, _}}} -> {:error, :unsupported} |
27 |
| - {:badrpc, _} = err -> err |
28 |
| - other -> other |
| 25 | + def run(["all"], %{node: node_name, experimental: experimental}) do |
| 26 | + case experimental do |
| 27 | + true -> |
| 28 | + {:error, RabbitMQ.CLI.Core.ExitCodes.exit_usage(), "`--experiemntal` flag is not allowed when enabling all feature flags.\nUse --experimental with a specific feature flag if you want to enable an experimental feature."} |
| 29 | + false -> |
| 30 | + case :rabbit_misc.rpc_call(node_name, :rabbit_feature_flags, :enable_all, []) do |
| 31 | + {:badrpc, _} = err -> err |
| 32 | + other -> other |
| 33 | + end |
29 | 34 | end
|
30 | 35 | end
|
31 | 36 |
|
32 |
| - def run([feature_flag], %{node: node_name}) do |
33 |
| - case :rabbit_misc.rpc_call(node_name, :rabbit_feature_flags, :enable, [ |
34 |
| - String.to_atom(feature_flag) |
35 |
| - ]) do |
36 |
| - # Server does not support feature flags, consider none are available. |
37 |
| - # See rabbitmq/rabbitmq-cli#344 for context. MK. |
38 |
| - {:badrpc, {:EXIT, {:undef, _}}} -> {:error, :unsupported} |
39 |
| - {:badrpc, _} = err -> err |
40 |
| - other -> other |
| 37 | + def run([feature_flag], %{node: node_name, experimental: experimental}) do |
| 38 | + case {experimental, :rabbit_misc.rpc_call(node_name, :rabbit_feature_flags, :get_stability, [ |
| 39 | + String.to_atom(feature_flag) |
| 40 | + ])} do |
| 41 | + {_, {:badrpc, _} = err} -> err |
| 42 | + {false, :experimental} -> |
| 43 | + IO.puts("Feature flag #{feature_flag} is experimental. If you understand the risk, use --experimental to enable it.") |
| 44 | + _ -> |
| 45 | + case :rabbit_misc.rpc_call(node_name, :rabbit_feature_flags, :enable, [ |
| 46 | + String.to_atom(feature_flag) |
| 47 | + ]) do |
| 48 | + {:badrpc, _} = err -> err |
| 49 | + other -> other |
| 50 | + end |
41 | 51 | end
|
42 | 52 | end
|
43 | 53 |
|
44 | 54 | def output({:error, :unsupported}, %{node: node_name}) do
|
45 | 55 | {:error, RabbitMQ.CLI.Core.ExitCodes.exit_usage(),
|
46 |
| - "This feature flag is not supported by node #{node_name}"} |
| 56 | + "This feature flag is not supported by node #{node_name}"} |
47 | 57 | end
|
48 | 58 |
|
49 | 59 | use RabbitMQ.CLI.DefaultOutput
|
50 | 60 |
|
51 |
| - def usage, do: "enable_feature_flag <all | feature_flag>" |
| 61 | + def usage, do: "enable_feature_flag [--experimental] <all | feature_flag>" |
52 | 62 |
|
53 | 63 | def usage_additional() do
|
54 | 64 | [
|
55 | 65 | [
|
56 | 66 | "<feature_flag>",
|
57 | 67 | "name of the feature flag to enable, or \"all\" to enable all supported flags"
|
| 68 | + ], |
| 69 | + [ |
| 70 | + "--experimental", |
| 71 | + "required to enable experimental feature flags (make sure you understand the risks!)" |
58 | 72 | ]
|
59 | 73 | ]
|
60 | 74 | end
|
|
0 commit comments