Add support for sources to composer-cli

This adds the sources command which can be used to list, add, change,
and delete sources using the TOML formatted source file.

(cherry picked from commit 6f6ce410c0)
This commit is contained in:
Brian C. Lane 2018-05-31 10:06:31 -07:00
parent 693dc9a6f6
commit 0314cbd0e8
3 changed files with 246 additions and 32 deletions

View File

@ -1,4 +1,3 @@
#!/usr/bin/python
# #
# composer-cli # composer-cli
# #
@ -24,12 +23,14 @@ from composer.cli.blueprints import blueprints_cmd
from composer.cli.modules import modules_cmd from composer.cli.modules import modules_cmd
from composer.cli.projects import projects_cmd from composer.cli.projects import projects_cmd
from composer.cli.compose import compose_cmd from composer.cli.compose import compose_cmd
from composer.cli.sources import sources_cmd
command_map = { command_map = {
"blueprints": blueprints_cmd, "blueprints": blueprints_cmd,
"modules": modules_cmd, "modules": modules_cmd,
"projects": projects_cmd, "projects": projects_cmd,
"compose": compose_cmd "compose": compose_cmd,
"sources": sources_cmd
} }

View File

@ -24,36 +24,106 @@ VERSION = "{0}-{1}".format(os.path.basename(sys.argv[0]), vernum)
# Documentation for the commands # Documentation for the commands
epilog = """ epilog = """
compose start <blueprint> <type> Start a compose using the selected blueprint and output type. compose start <BLUEPRINT> <TYPE>
types List the supported output types. Start a compose using the selected blueprint and output type.
status List the status of all running and finished composes.
log <uuid> [<size>kB] Show the last 1kB of the compose log. compose types
cancel <uuid> Cancel a running compose and delete any intermediate results. List the supported output types.
delete <uuid,...> Delete the listed compose results.
info <uuid> Show detailed information on the compose. compose status
metadata <uuid> Download the metadata use to create the compose to <uuid>-metadata.tar List the status of all running and finished composes.
logs <uuid> Download the compose logs to <uuid>-logs.tar
results <uuid> Download all of the compose results; metadata, logs, and image to <uuid>.tar compose log <UUID> [<SIZE>]
image <uuid> Download the output image from the compose. Filename depends on the type. Show the last SIZE kB of the compose log.
blueprints list List the names of the available blueprints.
show <blueprint,...> Display the blueprint in TOML format. compose cancel <UUID>
changes <blueprint,...> Display the changes for each blueprint. Cancel a running compose and delete any intermediate results.
diff <blueprint-name> Display the differences between 2 versions of a blueprint.
<from-commit> Commit hash or NEWEST compose delete <UUID,...>
<to-commit> Commit hash, NEWEST, or WORKSPACE Delete the listed compose results.
save <blueprint,...> Save the blueprint to a file, <blueprint-name>.toml
delete <blueprint> Delete a blueprint from the server compose info <UUID>
depsolve <blueprint,...> Display the packages needed to install the blueprint. Show detailed information on the compose.
push <blueprint> Push a blueprint TOML file to the server.
freeze <blueprint,...> Display the frozen blueprint's modules and packages. compose metadata <UUID>
freeze show <blueprint,...> Display the frozen blueprint in TOML format. Download the metadata use to create the compose to <uuid>-metadata.tar
freeze save <blueprint,...> Save the frozen blueprint to a file, <blueprint-name>.frozen.toml.
tag <blueprint> Tag the most recent blueprint commit as a release. compose logs <UUID>
undo <blueprint> <commit> Undo changes to a blueprint by reverting to the selected commit. Download the compose logs to <uuid>-logs.tar
workspace <blueprint> Push the blueprint TOML to the temporary workspace storage.
modules list List the available modules. compose results <UUID>
projects list List the available projects. Download all of the compose results; metadata, logs, and image to <uuid>.tar
projects info <project,...> Show details about the listed projects.
compose image <UUID>
Download the output image from the compose. Filename depends on the type.
blueprints list
List the names of the available blueprints.
blueprints show <BLUEPRINT,...>
Display the blueprint in TOML format.
blueprints changes <BLUEPRINT,...>
Display the changes for each blueprint.
blueprints diff <BLUEPRINT> <FROM-COMMIT> <TO-COMMIT>
Display the differences between 2 versions of a blueprint.
FROM-COMMIT can be a commit hash or NEWEST
TO-COMMIT can be a commit hash, NEWEST, or WORKSPACE
blueprints save <BLUEPRINT,...>
Save the blueprint to a file, <BLUEPRINT>.toml
blueprints delete <BLUEPRINT>
Delete a blueprint from the server
blueprints depsolve <BLUEPRINT,...>
Display the packages needed to install the blueprint.
blueprints push <BLUEPRINT>
Push a blueprint TOML file to the server.
blueprints freeze <BLUEPRINT,...>
Display the frozen blueprint's modules and packages.
blueprints freeze show <BLUEPRINT,...>
Display the frozen blueprint in TOML format.
blueprints freeze save <BLUEPRINT,...>
Save the frozen blueprint to a file, <blueprint-name>.frozen.toml.
blueprints tag <BLUEPRINT>
Tag the most recent blueprint commit as a release.
blueprints undo <BLUEPRINT> <COMMIT>
Undo changes to a blueprint by reverting to the selected commit.
blueprints workspace <BLUEPRINT>
Push the blueprint TOML to the temporary workspace storage.
modules list
List the available modules.
projects list
List the available projects.
projects info <PROJECT,...>
Show details about the listed projects.
sources list
List the available sources
sources info <SOURCE-NAME,...>
Details about the source.
sources add <SOURCE.TOML>
Add a package source to the server.
sources change <SOURCE.TOML>
Change an existing source
sources delete <SOURCE-NAME>
Delete a package source.
""" """
def composer_cli_parser(): def composer_cli_parser():

143
src/composer/cli/sources.py Normal file
View File

@ -0,0 +1,143 @@
#
# Copyright (C) 2018 Red Hat, Inc.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
import logging
log = logging.getLogger("composer-cli")
import os
import json
from composer import http_client as client
from composer.cli.utilities import argify, handle_api_result
def sources_cmd(opts):
"""Process sources commands
:param opts: Cmdline arguments
:type opts: argparse.Namespace
:returns: Value to return from sys.exit()
:rtype: int
"""
cmd_map = {
"list": sources_list,
"info": sources_info,
"add": sources_add,
"change": sources_add,
"delete": sources_delete,
}
if opts.args[1] not in cmd_map:
log.error("Unknown sources command: %s", opts.args[1])
return 1
return cmd_map[opts.args[1]](opts.socket, opts.api_version, opts.args[2:], opts.json)
def sources_list(socket_path, api_version, args, show_json=False):
"""Output the list of available sources
: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
sources list
"""
api_route = client.api_url(api_version, "/projects/source/list")
result = client.get_url_json(socket_path, api_route)
if show_json:
print(json.dumps(result, indent=4))
return 0
print("Sources: %s" % ", ".join(result["sources"]))
return 0
def sources_info(socket_path, api_version, args, show_json=False):
"""Output info on a list of projects
: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
sources info <source-name>
"""
if len(args) == 0:
log.error("sources info is missing the name of the source")
return 1
if show_json:
api_route = client.api_url(api_version, "/projects/source/info/%s" % ",".join(args))
result = client.get_url_json(socket_path, api_route)
print(json.dumps(result, indent=4))
return 0
else:
api_route = client.api_url(api_version, "/projects/source/info/%s?format=toml" % ",".join(args))
result = client.get_url_raw(socket_path, api_route)
print(result)
return 0
def sources_add(socket_path, api_version, args, show_json=False):
"""Add or change a source
: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
sources add <source.toml>
"""
api_route = client.api_url(api_version, "/projects/source/new")
rval = 0
for source in argify(args):
if not os.path.exists(source):
log.error("Missing source file: %s", source)
continue
source_toml = open(source, "r").read()
result = client.post_url_toml(socket_path, api_route, source_toml)
if handle_api_result(result, show_json):
rval = 1
return rval
def sources_delete(socket_path, api_version, args, show_json=False):
"""Delete a source
: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
sources delete <source-name>
"""
api_route = client.api_url(api_version, "/projects/source/delete/%s" % args[0])
result = client.delete_url_json(socket_path, api_route)
return handle_api_result(result, show_json)