rabbitmq-server/deps/rabbitmq_cli
Michael Klishin 0aa7bf6f9b Merge branch 'master' into rabbitmq-server-1030 2016-11-17 21:36:23 +03:00
..
config script name is overridable via argument 2016-11-08 14:21:31 +00:00
include
lib Merge branch 'master' into rabbitmq-server-1030 2016-11-17 21:36:23 +03:00
test Make rabbit node resolve from environment variable by default 2016-11-17 14:16:00 +00:00
.gitignore Copy CTL modules to /ebin to be included in ERL_LIBS 2016-11-17 10:50:15 +00:00
DESIGN.md Update DESIGN.md 2016-11-09 20:56:06 +03:00
Makefile Make rabbit node resolve from environment variable by default 2016-11-17 14:16:00 +00:00
README.md Update README 2016-11-15 01:05:45 +03:00
bash-complete Rename auto complete option for consistency 2016-08-10 18:19:06 +01:00
complete Command auto completion 2016-07-28 17:46:37 +01:00
erlang.mk Update erlang.mk 2016-11-14 12:15:15 +01:00
mix.exs Make rabbit node resolve from environment variable by default 2016-11-17 14:16:00 +00:00
rabbitmq-components.mk Update rabbitmq-components.mk 2016-11-11 10:21:27 +01:00
zsh-complete Rename auto complete option for consistency 2016-08-10 18:19:06 +01:00

README.md

RabbitMQ CLI Tools

This is the next generation implementation of rabbitmqctl and other RabbitMQ CLI tools.

This project is a work in progress and targets RabbitMQ 3.7.0 (currently the master branch). For production use, go with the rabbitmqctl distributed with the RabbitMQ version you use.

Goals

Team RabbitMQ wanted a set of tools that

  • Was extensible from/with plugins
  • Supported pluggable output formats (in particular machine-friendly ones)
  • Had good test coverage
  • Wasn't as coupled to the server repository
  • Could be used as a low risk vehicle for Elixir evaluation

Supported RabbitMQ Versions

This version of CLI tools targets RabbitMQ master (future 3.7.0). Some operations (for example, the list_* ones) will not work with earlier server releases.

Building

Requirements

Building this project requires Elixir 1.3.1 or greater.

Command line tools depend on rabbitmq-common. Dependencies are being resolved by erlang.mk

Building Standalone Executables

This repo produce a rabbitmqctl executable which can be used as different tools by copying or symlinking it with different names.

Currently rabbitmq-plugins and rabbitmq-diagnostics tools are supported.

To generate the executable, run

make

Using

rabbitmqctl

rabbitmqctl [-n node] [-t timeout] [-q] {command} [command options...]

See the rabbitmqctl man page for a full list of options.

Testing

Assuming you have:

  • installed Elixir
  • have a local running RabbitMQ node with the rabbitmq-federation plugin enabled (for parameter management testing), e.g. make run-broker PLUGINS='rabbitmq_federation rabbitmq_stomp' from a server release repository clone

you can simply run make tests within the project root directory.

NOTE: You may see the following message several times:

warning: variable context is unused

This is nothing to be alarmed about; we're currently using setup context functions in Mix to start a new distributed node and connect it to the RabbitMQ server. It complains because we don't actually use the context dictionary, but it's fine otherwise.

Developing

Adding a New Command

Conventions

RabbitMQ CLI tools use module name conventions to match the command-line actions (commands) to modules. The convention is outlined in the CommandBehaviour module.

Command Module Interface

Each command module must implement the RabbitMQ.CLI.CommandBehaviour behaviour, which includes the following functions:

  • validate(args, opts), which returns either :ok or a tuple of {:validation_failure, failure_detail} where failure detail is typically one of: :too_many_args, :not_enough_args or {:bad_argument, String.t}.

  • merge_defaults(args, opts), which is used to return updated arguments and/or options.

  • run(args, opts), where the actual command is implemented. Here, args is a list of command-specific parameters and opts is a Map containing option flags.

  • usage, which returns a string describing the command, its arguments and its optional flags.

  • flags, which returns command-specific option flags as a list of atoms.

  • banner(args, opts), which returns a string to be printed before the command output.

  • switches, which returns command specific switches.

  • aliases, which returns a list of command alianses (if any).

There is also a number of optional callbacks:

  • formatter: what output formatter should be used by default.
  • usage_additional: extra values appended to the usage output to provide additional command-specific documentation.
  • scopes: what scopes this command appears in. Scopes associate tools (e.g. rabbitmqctl, rabbitmq-diagnostics) with commands.

For example, to add a new command rabbitmqctl egg_salad:

  1. Create a new test file test/egg_salad_command_test.exs.

  2. In your new test file, define a module RabbitMQ.CLI.Ctl.Commands.EggSaladCommandTest that runs tests against command behaviour functions, e.g. EggSaladCommand.run, EggSaladCommand.validate etc.

  3. Create a new source file test/egg_salad_command.exs.

  4. Implement the all the RabbitMQ.CLI.CommandBehaviour functions in the new module.

See lib/rabbitmq/cli/ctl/commands/status_command.ex and test/status_command_test.exs for simple examples.

The project is licensed under the MPL, the same license as RabbitMQ.

(c) Pivotal Software, Inc, 2016-Current.