From 6a2f46521727b14a9991093b33f708a5adf74ebf Mon Sep 17 00:00:00 2001 From: "Brian C. Lane" Date: Wed, 25 Sep 2019 14:15:27 -0700 Subject: [PATCH] composer-cli: Add providers template command This outputs a TOML template of the settings needed for setting the upload credentials. It can be passed to 'upload start' and to 'compose start', as well as used to set the profile for 'providers push' --- etc/bash_completion.d/composer-cli | 20 ++++++++++++-- src/composer/cli/providers.py | 44 +++++++++++++++++++++++++++++- 2 files changed, 60 insertions(+), 4 deletions(-) diff --git a/etc/bash_completion.d/composer-cli b/etc/bash_completion.d/composer-cli index 868f3263..4674e0eb 100644 --- a/etc/bash_completion.d/composer-cli +++ b/etc/bash_completion.d/composer-cli @@ -9,7 +9,7 @@ declare -A __composer_cli_cmds=( [projects]="list info" [sources]="list info add change delete" [upload]="info start log cancel delete reset" - [providers]="list show push save delete" + [providers]="list show push save delete template" [help]="" ) @@ -96,7 +96,7 @@ _composer_cli() { compose:list) COMPREPLY=($(compgen -W "waiting running finish failed" -- "${cur}")) ;; - providers:list) + providers:list|providers:template) COMPREPLY=($(compgen -W "$(__composer_provider_list)" -- "${cur}")) ;; *:list|*:help|compose:types) @@ -146,6 +146,20 @@ _composer_cli() { compose:start) if [ "$cmd_cword" == 3 ]; then COMPREPLY=($(compgen -W "$(__composer_compose_types)" -- "${cur}")) + elif [ "$cmd_cword" == 5 ]; then + # If they have typed something looking like a path, use file completion + # otherwise suggest providers. + case "${cur}" in + */*) + compopt -o filenames + COMPREPLY=($(compgen -f -- "${cur}")) + ;; + *) + COMPREPLY=($(compgen -W "$(__composer_provider_list)" -- "${cur}")) + ;; + esac + elif [ "$cmd_cword" == 6 ]; then + COMPREPLY=($(compgen -W "$(__composer_profile_list ${prev})" -- "${cur}")) fi ;; # TODO: blueprints:diff and blueprints:undo want commits @@ -157,7 +171,7 @@ _composer_cli() { ;; upload:start) if [ "$cmd_cword" == 4 ]; then - # If they have types something looking like a path, use file completion + # If they have typed something looking like a path, use file completion # otherwise suggest providers. case "${cur}" in */*) diff --git a/src/composer/cli/providers.py b/src/composer/cli/providers.py index dec0caf5..e4582fa3 100644 --- a/src/composer/cli/providers.py +++ b/src/composer/cli/providers.py @@ -40,7 +40,8 @@ def providers_cmd(opts): "show": providers_show, "push": providers_push, "save": providers_save, - "delete": providers_delete + "delete": providers_delete, + "template": providers_template } if opts.args[1] == "help" or opts.args[1] == "--help": print(providers_help) @@ -234,3 +235,44 @@ def providers_delete(socket_path, api_version, args, show_json=False, testmode=0 api_route = client.api_url(api_version, "/upload/providers/delete/%s/%s" % (args[0], args[1])) result = client.delete_url_json(socket_path, api_route) return handle_api_result(result, show_json)[0] + +def providers_template(socket_path, api_version, args, show_json=False, testmode=0): + """Return a TOML template for setting the provider's fields + + :param socket_path: Path to the Unix socket to use for API communication + :type socket_path: str + :param api_version: Version of the API to talk to. eg. "0" + :type api_version: str + :param args: List of remaining arguments from the cmdline + :type args: list of str + :param show_json: Set to True to show the JSON output instead of the human readable output + :type show_json: bool + :param testmode: unused in this function + :type testmode: int + + providers template + """ + if len(args) == 0: + log.error("template is missing the provider name") + return 1 + + api_route = client.api_url(api_version, "/upload/providers") + r = client.get_url_json(socket_path, api_route) + results = r["providers"] + if not results: + return 0 + + if show_json: + print(json.dumps(results, indent=4)) + return 0 + + if args[0] not in results: + log.error("%s is not a valid provider", args[0]) + return 1 + + template = {"provider": args[0]} + settings = results[args[0]]["settings-info"] + template["settings"] = dict([(k, settings[k]["display"]) for k in settings]) + print(toml.dumps(template)) + + return 0