From 201a8d95f4021a0acd710ba05726ee846294643b Mon Sep 17 00:00:00 2001 From: David Moreau Simard Date: Wed, 8 Jul 2020 20:18:38 -0400 Subject: [PATCH] CLI: Port "ara playbook list" command from ara 0.x This is the first command being ported and so it includes the base framework for integrating other commands with cliff. The docs are also re-arranged to include the new commands, some examples, as well as the existing ara-manage commands. Change-Id: Ia758e4b70ec0a6821e97b5b66d123dfe33cc63d3 --- ara/cli/__init__.py | 0 ara/cli/base.py | 89 +++++++++++++++++++++++ ara/cli/playbook.py | 99 ++++++++++++++++++++++++++ doc/source/{ara-manage.rst => cli.rst} | 43 ++++++++++- doc/source/index.rst | 2 +- requirements.txt | 1 + setup.cfg | 4 ++ 7 files changed, 235 insertions(+), 3 deletions(-) create mode 100644 ara/cli/__init__.py create mode 100644 ara/cli/base.py create mode 100644 ara/cli/playbook.py rename doc/source/{ara-manage.rst => cli.rst} (70%) diff --git a/ara/cli/__init__.py b/ara/cli/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ara/cli/base.py b/ara/cli/base.py new file mode 100644 index 00000000..4c7e294c --- /dev/null +++ b/ara/cli/base.py @@ -0,0 +1,89 @@ +# Copyright (c) 2020 The ARA Records Ansible authors +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +import logging +import os +import sys + +import pbr.version +from cliff.app import App +from cliff.commandmanager import CommandManager + +CLIENT_VERSION = pbr.version.VersionInfo("ara").release_string() +log = logging.getLogger(__name__) + + +def global_arguments(parser): + # fmt: off + parser.add_argument( + "--client", + metavar="", + default=os.environ.get("ARA_API_CLIENT", "offline"), + help=("API client to use, defaults to ARA_API_CLIENT or 'offline'"), + ) + parser.add_argument( + "--server", + metavar="", + default=os.environ.get("ARA_API_SERVER", "http://127.0.0.1:8000"), + help=("API server endpoint if using http client, defaults to ARA_API_SERVER or 'http://127.0.0.1:8000'"), + ) + parser.add_argument( + "--timeout", + metavar="", + default=os.environ.get("ARA_API_TIMEOUT", 30), + help=("Timeout for requests to API server, defaults to ARA_API_TIMEOUT or 30"), + ) + parser.add_argument( + "--username", + metavar="", + default=os.environ.get("ARA_API_USERNAME", None), + help=("API server username for authentication, defaults to ARA_API_USERNAME or None"), + ) + parser.add_argument( + "--password", + metavar="", + default=os.environ.get("ARA_API_PASSWORD", None), + help=("API server password for authentication, defaults to ARA_API_PASSWORD or None"), + ) + parser.add_argument( + "--insecure", + action="store_true", + default=os.environ.get("ARA_API_INSECURE", False), + help=("Ignore SSL certificate validation, defaults to ARA_API_INSECURE or False"), + ) + # fmt: on + return parser + + +class AraCli(App): + def __init__(self): + super(AraCli, self).__init__( + description="A CLI client to query ARA API servers", + version=CLIENT_VERSION, + command_manager=CommandManager("ara.cli"), + deferred_help=True, + ) + + def build_option_parser(self, description, version): + parser = super(AraCli, self).build_option_parser(description, version) + return parser + + def initialize_app(self, argv): + log.debug("initialize_app") + + def prepare_to_run_command(self, cmd): + log.debug("prepare_to_run_command: %s", cmd.__class__.__name__) + + def clean_up(self, cmd, result, err): + log.debug("clean_up %s", cmd.__class__.__name__) + if err: + log.debug("got an error: %s", err) + + +def main(argv=sys.argv[1:]): + aracli = AraCli() + return aracli.run(argv) + + +if __name__ == "__main__": + sys.exit(main(sys.argv[1:])) diff --git a/ara/cli/playbook.py b/ara/cli/playbook.py new file mode 100644 index 00000000..63767dd6 --- /dev/null +++ b/ara/cli/playbook.py @@ -0,0 +1,99 @@ +# Copyright (c) 2020 The ARA Records Ansible authors +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +import logging + +from cliff.lister import Lister + +from ara.cli.base import global_arguments +from ara.clients.utils import get_client + + +class PlaybookList(Lister): + """ Returns a list of playbooks based on search queries """ + + log = logging.getLogger(__name__) + + def get_parser(self, prog_name): + parser = super(PlaybookList, self).get_parser(prog_name) + parser = global_arguments(parser) + # fmt: off + # Playbook search arguments and ordering as per ara.api.filters.PlaybookFilter + parser.add_argument( + "--label", + metavar="