rabbitmq-server/deps/rabbitmq_cli/test/plugins/enable_plugins_command_test...

253 lines
11 KiB
Elixir
Raw Normal View History

2016-06-23 01:00:21 +08:00
## The contents of this file are subject to the Mozilla Public License
## Version 1.1 (the "License"); you may not use this file except in
## compliance with the License. You may obtain a copy of the License
URL Cleanup This commit updates URLs to prefer the https protocol. Redirects are not followed to avoid accidentally expanding intentionally shortened URLs (i.e. if using a URL shortener). # HTTP URLs that Could Not Be Fixed These URLs were unable to be fixed. Please review them to see if they can be manually resolved. * http://blog.listincomprehension.com/search/label/procket (200) with 1 occurrences could not be migrated: ([https](https://blog.listincomprehension.com/search/label/procket) result ClosedChannelException). * http://dozzie.jarowit.net/trac/wiki/TOML (200) with 1 occurrences could not be migrated: ([https](https://dozzie.jarowit.net/trac/wiki/TOML) result SSLHandshakeException). * http://dozzie.jarowit.net/trac/wiki/subproc (200) with 1 occurrences could not be migrated: ([https](https://dozzie.jarowit.net/trac/wiki/subproc) result SSLHandshakeException). * http://e2project.org (200) with 1 occurrences could not be migrated: ([https](https://e2project.org) result AnnotatedConnectException). * http://erlang.org/doc/reference_manual/distributed.html (200) with 1 occurrences could not be migrated: ([https](https://erlang.org/doc/reference_manual/distributed.html) result ConnectTimeoutException). * http://nitrogenproject.com/ (200) with 2 occurrences could not be migrated: ([https](https://nitrogenproject.com/) result ConnectTimeoutException). * http://proper.softlab.ntua.gr (200) with 1 occurrences could not be migrated: ([https](https://proper.softlab.ntua.gr) result SSLHandshakeException). * http://yaws.hyber.org (200) with 1 occurrences could not be migrated: ([https](https://yaws.hyber.org) result AnnotatedConnectException). * http://choven.ca (503) with 1 occurrences could not be migrated: ([https](https://choven.ca) result ConnectTimeoutException). # Fixed URLs ## Fixed But Review Recommended These URLs were fixed, but the https status was not OK. However, the https status was the same as the http request or http redirected to an https URL, so they were migrated. Your review is recommended. * http://fixprotocol.org/ (301) with 1 occurrences migrated to: https://fixtrading.org ([https](https://fixprotocol.org/) result SSLHandshakeException). * http://erldb.org (UnknownHostException) with 1 occurrences migrated to: https://erldb.org ([https](https://erldb.org) result UnknownHostException). * http://elixir-lang.org/docs/stable/elixir/OptionParser.html (301) with 1 occurrences migrated to: https://elixir-lang.org/docs/stable/elixir/OptionParser.html ([https](https://elixir-lang.org/docs/stable/elixir/OptionParser.html) result 404). * http://elixir-lang.org/docs/stable/elixir/Stream.html (301) with 1 occurrences migrated to: https://elixir-lang.org/docs/stable/elixir/Stream.html ([https](https://elixir-lang.org/docs/stable/elixir/Stream.html) result 404). ## Fixed Success These URLs were switched to an https URL with a 2xx status. While the status was successful, your review is still recommended. * http://cloudi.org/ with 27 occurrences migrated to: https://cloudi.org/ ([https](https://cloudi.org/) result 200). * http://elixir-lang.org with 1 occurrences migrated to: https://elixir-lang.org ([https](https://elixir-lang.org) result 200). * http://elixir-lang.org/ with 2 occurrences migrated to: https://elixir-lang.org/ ([https](https://elixir-lang.org/) result 200). * http://elixir-lang.org/getting-started/typespecs-and-behaviours.html with 1 occurrences migrated to: https://elixir-lang.org/getting-started/typespecs-and-behaviours.html ([https](https://elixir-lang.org/getting-started/typespecs-and-behaviours.html) result 200). * http://elixir-lang.org/install.html with 1 occurrences migrated to: https://elixir-lang.org/install.html ([https](https://elixir-lang.org/install.html) result 200). * http://erlware.org/ with 1 occurrences migrated to: https://erlware.org/ ([https](https://erlware.org/) result 200). * http://inaka.github.io/cowboy-trails/ with 1 occurrences migrated to: https://inaka.github.io/cowboy-trails/ ([https](https://inaka.github.io/cowboy-trails/) result 200). * http://ninenines.eu with 6 occurrences migrated to: https://ninenines.eu ([https](https://ninenines.eu) result 200). * http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html with 1 occurrences migrated to: https://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html ([https](https://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html) result 200). * http://www.actordb.com/ with 2 occurrences migrated to: https://www.actordb.com/ ([https](https://www.actordb.com/) result 200). * http://www.cs.kent.ac.uk/projects/wrangler/Home.html with 1 occurrences migrated to: https://www.cs.kent.ac.uk/projects/wrangler/Home.html ([https](https://www.cs.kent.ac.uk/projects/wrangler/Home.html) result 200). * http://www.rebar3.org with 1 occurrences migrated to: https://www.rebar3.org ([https](https://www.rebar3.org) result 200). * http://contributor-covenant.org with 1 occurrences migrated to: https://contributor-covenant.org ([https](https://contributor-covenant.org) result 301). * http://contributor-covenant.org/version/1/3/0/ with 1 occurrences migrated to: https://contributor-covenant.org/version/1/3/0/ ([https](https://contributor-covenant.org/version/1/3/0/) result 301). * http://inaka.github.com/apns4erl with 1 occurrences migrated to: https://inaka.github.com/apns4erl ([https](https://inaka.github.com/apns4erl) result 301). * http://inaka.github.com/edis/ with 1 occurrences migrated to: https://inaka.github.com/edis/ ([https](https://inaka.github.com/edis/) result 301). * http://lasp-lang.org/ with 1 occurrences migrated to: https://lasp-lang.org/ ([https](https://lasp-lang.org/) result 301). * http://rabbitmq.com/documentation.html with 1 occurrences migrated to: https://rabbitmq.com/documentation.html ([https](https://rabbitmq.com/documentation.html) result 301). * http://saleyn.github.com/erlexec with 1 occurrences migrated to: https://saleyn.github.com/erlexec ([https](https://saleyn.github.com/erlexec) result 301). * http://www.mozilla.org/MPL/ with 290 occurrences migrated to: https://www.mozilla.org/MPL/ ([https](https://www.mozilla.org/MPL/) result 301). * http://zhongwencool.github.io/observer_cli with 1 occurrences migrated to: https://zhongwencool.github.io/observer_cli ([https](https://zhongwencool.github.io/observer_cli) result 301).
2019-03-20 16:13:07 +08:00
## at https://www.mozilla.org/MPL/
2016-06-23 01:00:21 +08:00
##
## Software distributed under the License is distributed on an "AS IS"
## basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
## the License for the specific language governing rights and
## limitations under the License.
##
## The Original Code is RabbitMQ.
##
## The Initial Developer of the Original Code is GoPivotal, Inc.
2019-12-29 00:35:38 +08:00
## Copyright (c) 2007-2020 Pivotal Software, Inc. All rights reserved.
2016-06-23 01:00:21 +08:00
defmodule EnablePluginsCommandTest do
use ExUnit.Case, async: false
import TestHelper
alias RabbitMQ.CLI.Core.ExitCodes
2016-06-23 01:00:21 +08:00
@command RabbitMQ.CLI.Plugins.Commands.EnableCommand
setup_all do
2016-11-15 01:52:08 +08:00
RabbitMQ.CLI.Core.Distribution.start()
2017-01-24 20:33:48 +08:00
node = get_rabbit_hostname()
2016-06-23 01:00:21 +08:00
{:ok, plugins_file} = :rabbit_misc.rpc_call(node,
:application, :get_env,
[:rabbit, :enabled_plugins_file])
{:ok, plugins_dir} = :rabbit_misc.rpc_call(node,
:application, :get_env,
[:rabbit, :plugins_dir])
rabbitmq_home = :rabbit_misc.rpc_call(node, :code, :lib_dir, [:rabbit])
2016-06-23 01:00:21 +08:00
IO.puts("plugins enable tests default env: enabled plugins = #{plugins_file}, plugins dir = #{plugins_dir}, RabbitMQ home directory = #{rabbitmq_home}")
2016-06-23 01:00:21 +08:00
{:ok, [enabled_plugins]} = :file.consult(plugins_file)
IO.puts("plugins enable tests will assume tnat #{Enum.join(enabled_plugins, ",")} is the list of enabled plugins to revert to")
2016-06-23 01:00:21 +08:00
opts = %{enabled_plugins_file: plugins_file,
plugins_dir: plugins_dir,
rabbitmq_home: rabbitmq_home,
online: false, offline: false,
all: false}
2016-06-23 01:00:21 +08:00
on_exit(fn ->
2017-01-24 20:33:48 +08:00
set_enabled_plugins(enabled_plugins, :online, get_rabbit_hostname(), opts)
2016-06-23 01:00:21 +08:00
end)
{:ok, opts: opts}
end
setup context do
2016-12-07 01:14:40 +08:00
set_enabled_plugins([:rabbitmq_stomp, :rabbitmq_federation],
:online,
2017-01-24 20:33:48 +08:00
get_rabbit_hostname(),
2016-06-23 01:00:21 +08:00
context[:opts])
{
:ok,
opts: Map.merge(context[:opts], %{
2017-01-24 20:33:48 +08:00
node: get_rabbit_hostname(),
timeout: 1000
2016-06-23 01:00:21 +08:00
})
}
end
test "validate: specifying both --online and --offline is reported as invalid", context do
assert match?(
{:validation_failure, {:bad_argument, _}},
@command.validate(["a"], Map.merge(context[:opts], %{online: true, offline: true}))
)
end
test "validate: not specifying any plugins to enable is reported as invalid", context do
2016-06-23 01:00:21 +08:00
assert match?(
{:validation_failure, :not_enough_args},
@command.validate([], Map.merge(context[:opts], %{online: true, offline: false}))
2016-06-23 01:00:21 +08:00
)
end
test "validate_execution_environment: specifying a non-existent enabled_plugins_file is fine", context do
assert @command.validate_execution_environment(["a"], Map.merge(context[:opts], %{enabled_plugins_file: "none"})) == :ok
2016-06-23 01:00:21 +08:00
end
test "validate_execution_environment: specifying a non-existent plugins_dir is reported as an error", context do
assert @command.validate_execution_environment(["a"], Map.merge(context[:opts], %{plugins_dir: "none"})) ==
{:validation_failure, :plugins_dir_does_not_exist}
2016-06-23 01:00:21 +08:00
end
2019-02-24 15:10:14 +08:00
test "if node is inaccessible, writes enabled plugins file and reports implicitly enabled plugin list", context do
# Clears enabled plugins file
2016-12-07 01:14:40 +08:00
set_enabled_plugins([], :offline, :nonode, context[:opts])
2016-06-23 01:00:21 +08:00
2016-12-07 20:55:00 +08:00
assert {:stream, test_stream} =
@command.run(["rabbitmq_stomp"], Map.merge(context[:opts], %{node: :nonode}))
assert [[:rabbitmq_stomp],
%{mode: :offline, enabled: [:rabbitmq_stomp], set: [:rabbitmq_stomp]}] ==
2016-12-07 20:55:00 +08:00
Enum.to_list(test_stream)
check_plugins_enabled([:rabbitmq_stomp], context)
assert [:amqp_client, :rabbitmq_federation, :rabbitmq_stomp] ==
2016-08-09 23:26:05 +08:00
currently_active_plugins(context)
2016-06-23 01:00:21 +08:00
end
test "in offline mode, writes enabled plugins and reports implicitly enabled plugin list", context do
# Clears enabled plugins file
2016-12-07 01:14:40 +08:00
set_enabled_plugins([], :offline, :nonode, context[:opts])
2016-06-23 01:00:21 +08:00
2016-12-07 20:55:00 +08:00
assert {:stream, test_stream} =
@command.run(["rabbitmq_stomp"], Map.merge(context[:opts], %{offline: true, online: false}))
assert [[:rabbitmq_stomp],
%{mode: :offline, enabled: [:rabbitmq_stomp], set: [:rabbitmq_stomp]}] ==
2016-12-07 20:55:00 +08:00
Enum.to_list(test_stream)
check_plugins_enabled([:rabbitmq_stomp], context)
assert_equal_sets(
[:amqp_client, :rabbitmq_federation, :rabbitmq_stomp],
currently_active_plugins(context))
2016-06-23 01:00:21 +08:00
end
test "adds additional plugins to those already enabled", context do
# Clears enabled plugins file
2016-12-07 01:14:40 +08:00
set_enabled_plugins([], :offline, :nonode, context[:opts])
2016-06-23 01:00:21 +08:00
2016-12-07 20:55:00 +08:00
assert {:stream, test_stream0} =
@command.run(["rabbitmq_stomp"], Map.merge(context[:opts], %{offline: true, online: false}))
assert [[:rabbitmq_stomp],
%{mode: :offline, enabled: [:rabbitmq_stomp], set: [:rabbitmq_stomp]}] ==
2016-12-07 20:55:00 +08:00
Enum.to_list(test_stream0)
check_plugins_enabled([:rabbitmq_stomp], context)
2016-12-07 20:55:00 +08:00
assert {:stream, test_stream1} =
@command.run(["rabbitmq_federation"], Map.merge(context[:opts], %{offline: true, online: false}))
assert [[:rabbitmq_federation, :rabbitmq_stomp],
2016-12-07 20:55:00 +08:00
%{mode: :offline, enabled: [:rabbitmq_federation],
set: [:rabbitmq_federation, :rabbitmq_stomp]}] ==
2016-12-07 20:55:00 +08:00
Enum.to_list(test_stream1)
check_plugins_enabled([:rabbitmq_stomp, :rabbitmq_federation], context)
2016-06-23 01:00:21 +08:00
end
test "updates plugin list and starts newly enabled plugins", context do
# Clears enabled plugins file and stop all plugins
2016-12-07 01:14:40 +08:00
set_enabled_plugins([], :online, context[:opts][:node], context[:opts])
2016-06-23 01:00:21 +08:00
2016-12-07 20:55:00 +08:00
assert {:stream, test_stream0} =
@command.run(["rabbitmq_stomp"], context[:opts])
assert [[:rabbitmq_stomp],
2016-12-07 20:55:00 +08:00
%{mode: :online,
started: [:rabbitmq_stomp], stopped: [],
enabled: [:rabbitmq_stomp],
set: [:rabbitmq_stomp]}] ==
2016-12-07 20:55:00 +08:00
Enum.to_list(test_stream0)
2016-08-23 21:28:34 +08:00
check_plugins_enabled([:rabbitmq_stomp], context)
assert_equal_sets([:amqp_client, :rabbitmq_stomp], currently_active_plugins(context))
2016-06-23 01:00:21 +08:00
2016-12-07 20:55:00 +08:00
{:stream, test_stream1} =
@command.run(["rabbitmq_federation"], context[:opts])
assert [[:rabbitmq_federation, :rabbitmq_stomp],
2016-12-07 20:55:00 +08:00
%{mode: :online,
started: [:rabbitmq_federation], stopped: [],
enabled: [:rabbitmq_federation],
set: [:rabbitmq_federation, :rabbitmq_stomp]}] ==
2016-12-07 20:55:00 +08:00
Enum.to_list(test_stream1)
check_plugins_enabled([:rabbitmq_stomp, :rabbitmq_federation], context)
assert_equal_sets([:amqp_client, :rabbitmq_federation, :rabbitmq_stomp], currently_active_plugins(context))
2016-06-23 01:00:21 +08:00
end
test "can enable multiple plugins at once", context do
# Clears plugins file and stop all plugins
2016-12-07 01:14:40 +08:00
set_enabled_plugins([], :online, context[:opts][:node], context[:opts])
2016-06-23 01:00:21 +08:00
2016-12-07 20:55:00 +08:00
assert {:stream, test_stream} =
@command.run(["rabbitmq_stomp", "rabbitmq_federation"], context[:opts])
assert [[:rabbitmq_federation, :rabbitmq_stomp],
2016-12-07 20:55:00 +08:00
%{mode: :online,
started: [:rabbitmq_federation, :rabbitmq_stomp], stopped: [],
enabled: [:rabbitmq_federation, :rabbitmq_stomp],
set: [:rabbitmq_federation, :rabbitmq_stomp]}] ==
2016-12-07 20:55:00 +08:00
Enum.to_list(test_stream)
check_plugins_enabled([:rabbitmq_stomp, :rabbitmq_federation], context)
assert_equal_sets([:amqp_client, :rabbitmq_federation, :rabbitmq_stomp], currently_active_plugins(context))
2016-06-23 01:00:21 +08:00
end
test "does not enable an already implicitly enabled plugin", context do
# Clears enabled plugins file and stop all plugins
2016-12-07 01:14:40 +08:00
set_enabled_plugins([:rabbitmq_federation], :online, context[:opts][:node], context[:opts])
2016-12-07 20:55:00 +08:00
assert {:stream, test_stream} =
@command.run(["amqp_client"], context[:opts])
assert [[:rabbitmq_federation],
2016-12-07 20:55:00 +08:00
%{mode: :online,
started: [], stopped: [],
enabled: [],
set: [:rabbitmq_federation]}] ==
2016-12-07 20:55:00 +08:00
Enum.to_list(test_stream)
check_plugins_enabled([:rabbitmq_federation], context)
assert [:amqp_client, :rabbitmq_federation] ==
2016-08-09 23:26:05 +08:00
currently_active_plugins(context)
2016-06-23 01:00:21 +08:00
end
test "run: does not enable plugins with unmet version requirements", context do
set_enabled_plugins([], :online, context[:opts][:node], context[:opts])
plugins_directory = fixture_plugins_path("plugins_with_version_requirements")
opts = get_opts_with_plugins_directories(context, [plugins_directory])
switch_plugins_directories(context[:opts][:plugins_dir], opts[:plugins_dir])
{:stream, _} =
@command.run(["mock_rabbitmq_plugin_for_3_8"], opts)
check_plugins_enabled([:mock_rabbitmq_plugin_for_3_8], context)
# Not changed
{:error, _version_error} = @command.run(["mock_rabbitmq_plugin_for_3_7"], opts)
check_plugins_enabled([:mock_rabbitmq_plugin_for_3_8], context)
end
test "run: does not enable plugins with unmet version requirements even when enabling all plugins", context do
set_enabled_plugins([], :online, context[:opts][:node], context[:opts])
plugins_directory = fixture_plugins_path("plugins_with_version_requirements")
opts = get_opts_with_plugins_directories(context, [plugins_directory])
opts = Map.merge(opts, %{all: true})
switch_plugins_directories(context[:opts][:plugins_dir], opts[:plugins_dir])
{:error, _version_error} = @command.run([], opts)
check_plugins_enabled([], context)
end
test "formats enabled plugins mismatch errors", context do
err = {:enabled_plugins_mismatch, '/tmp/a/cli/path', '/tmp/a/server/path'}
assert {:error, ExitCodes.exit_dataerr(),
"Could not update enabled plugins file at /tmp/a/cli/path: target node #{context[:opts][:node]} uses a different path (/tmp/a/server/path)"}
== @command.output({:error, err}, context[:opts])
end
test "formats enabled plugins write errors", context do
err1 = {:cannot_write_enabled_plugins_file, "/tmp/a/path", :eacces}
assert {:error, ExitCodes.exit_dataerr(),
"Could not update enabled plugins file at /tmp/a/path: the file does not exist or permission was denied (EACCES)"} ==
@command.output({:error, err1}, context[:opts])
err2 = {:cannot_write_enabled_plugins_file, "/tmp/a/path", :enoent}
assert {:error, ExitCodes.exit_dataerr(),
"Could not update enabled plugins file at /tmp/a/path: the file does not exist (ENOENT)"} ==
@command.output({:error, err2}, context[:opts])
end
2016-06-23 01:00:21 +08:00
end