.. _extending_cli: ***************** Extending the CLI ***************** The FIREWHEEL CLI is designed to be as extensible as possible. There are two mechanisms used for this extensibility: Helpers and Executors. Helpers are located in the code root under the ``src/firewheel/cli/helpers`` directory. To contribute a new Helper or Executor, please see the :ref:`contributing` to get started. .. _extending_helpers: Extending Helpers ================= Helpers are flat text files that define a new command for the CLI. The name of the file defining a Helper is used as the name of that Helper. They consist of a series of sections, each terminated with a line reading ``DONE``. These sections are: - ``AUTHOR`` - Give the author of the Helper. Ideally, this would also include contact information. - ``DESCRIPTION`` - Give a more extensive description of the Helper and its functionality (similar to in-line help in MATLAB or a man page). - ``RUN`` - A section of executable information. The section header also contains a description of the Executor and host group(s) to be used. For example: ``RUN Shell ON compute``. Indicates the section is defining a shell script intended to be executed on compute nodes. All sections are assumed to be unique, except for ``RUN`` sections. That is, there can be multiple ``RUN`` sections but only a single ``DESCRIPTION`` section. If multiples on a non-RUN section are defined, the last-read is used. All section names (e.g. ``AUTHOR``, ``RUN``, etc.) are case sensitive. The CLI will output an error and continue processing other Helpers if it encounters an error in a Helper definition. Here is an example Helper (:ref:`helper_example_helpers_test`):: AUTHOR FIREWHEEL Team DONE DESCRIPTION Use this file as a template for new Helpers. If you retain the sections (and just update the content) then the Helper should execute properly. Arguments +++++++++ All are optional Examples ++++++++ ``firewheel example_helpers test`` DONE RUN Shell ON compute #! /bin/bash touch ~/foo DONE RUN Shell ON compute #! /bin/bash touch ~/bar DONE RUN Shell ON control #!/bin/bash echo "Hello, World!" pwd DONE Helper groups ============= Developers may need to create a series of related Helpers. To support this functionality, FIREWHEEL has a concept of Helper groups. Essentially, this is a new folder in the ``cli/helpers`` directory. All related Helpers can be added to this folder. For, example the ``tshoot`` Helper group contains troubleshooting related Helpers. Here is the ``tshoot`` directory structure:: cli/helpers/tshoot ├── index ├── diskspace ├── mtu └── check_nics Users can also execute the Helper group directly. This is done when the developer creates a special Helper called ``index`` in the Helper group. This file is NOT required to use Helper groups. This means users can execute ``firewheel tshoot`` or ``firewheel tshoot index`` to run the :ref:`helper_tshoot` index file. This is most useful when it runs a series of other Helpers. For example, the :ref:`helper_tshoot` index Helper (located in the ``tshoot`` directory) has a `RUN` section that looks like:: RUN Helpers ON control tshoot diskspace tshoot rabbitmq tshoot elk tshoot network DONE This Helper now runs all the other ``tshoot`` index files ultimately enabling the user to run many Helpers with a simple ``firewheel tshoot``. Helper groups can also be nested. Please refer to the series of example Helpers which are provided in ``src/firewheel/cli/helpers/example_helpers``. .. _cli_executors: Executors ========= Executors are designed to allow new types of code to be contained in ``RUN`` sections. An Executor is given the content of a ``RUN`` section that names it, as well as the host groups the section expects to be executed on. They are responsible for using the :class:`HostAccessor ` to distribute the executable code and invoke it on remote hosts. Executors are found by Helpers using a plugin model. Any Executor defined in the appropriate directory (i.e. ``src/firewheel/cli/executors``) is available to the CLI. Executors are looked up by name using the name given in a Helper. Executors are expected to have robust error-handling. They are expected to handle file creation and copying, as well as remote execution (helpful methods for the remote operations are provided). All Executors extend the :class:`AbstractExecutor ` class. This class defines the basic interface used to interact with Executors. Available Executors include: * :class:`Shell ` - Invoke the Helper as a Shell script. * :class:`Python ` - Use the FIREWHEEL virtual environment via `ClusterShell `_. * :class:`LocalPython ` - Use the FIREWHEEL virtual environment without `ClusterShell `_. That is, the command is only executed on the current node (typically ``control``). Its main advantage is an increased processing speed as it does not have to use SSH. * :class:`Helpers ` - Run a list of other Helpers.